Releases: monkeychen/wx-kit
Release list
wx-kit v0.9.0 — 回到可靠的主线
wx-kit v0.9.0 — 回到可靠的主线
发布日期:2026-08-09。
微信公众平台后台持续拒绝查询其他公众号文章列表,换公众号后仍然相同。v0.9.0 不再把一条
不可交付的私有链路留给用户反复尝试,而是把产品收缩到可以真实验收的闭环:
提供文章 URL → 下载正文与媒体 → 本地文库阅读管理 → 导出素材或同步站点。
用户可见变化
- 下载页只保留按文章 URL 下载;按公众号下载、订阅页和相关设置入口已隐藏。
- 应用不再启动订阅调度或其它私有后台任务。
search、crawl、login、auth-status、session、subscription、protection
命令名继续保留,旧脚本不会误开 GUI;调用时统一返回MP_BACKEND_UNAVAILABLE、退出码 1,且不发请求。- URL 下载、下载历史、文库、阅读器、素材导出、Astro 站点同步和当前有效设置继续可用。
- README 和截图已按当前界面重做,不再展示已经退场的页面。
数据与可逆性
- 旧订阅数据、检查日志、认证/订阅实现和设置字段不删除、不迁移。
- GUI 与 CLI 不再展示或修改已退场设置,但保存当前有效设置时不会抹掉磁盘里的历史字段。
- 保留旧实现是为了未来有事实依据时重新评估,不代表当前仍承诺或暗藏访问入口。
依赖安全维护
- Axios 升至 1.19.0、Electron 升至 42.8.1、React Router 升至 7.18.2、
Electron Builder 升至 26.15.3、PostCSS 升至 8.5.26。 - 同步修复
undici、tar、brace-expansion、js-yaml、fast-uri、nanoid等传递依赖告警。 - 官方 npm registry 全量审计为 0;没有通过 dismiss 掩盖可修复告警。
验证
- 干净
npm ci可复现;44 个测试文件、389 项单测、lint、typecheck 通过。 - 当前有效 GUI fixture e2e 与真实公众号文章 URL e2e 通过;真实流程未调用
/cgi-bin/私有后台接口。 - README 四张当前界面截图由同一篇真实文章完成下载、入库和阅读后生成。
- macOS arm64/x64 应用和 DMG 构建通过;打包 GUI 正常启动且无退场入口。
- 打包内层 CLI 的停用命令返回
MP_BACKEND_UNAVAILABLE/退出码 1;有效download在隔离配置中
完成真实文章下载并产出 md/meta,审计无/cgi-bin/。 - 根包版本为 0.9.0,三平台资产、GitHub Release 与 brew tap 均已发布并核实。
- npm
@simiam/wx-kit@0.9.0已发布为latest;从官方 registry 隔离安装后,--version、
停用命令和真实文章下载均通过。
需求与逐条验收:docs/PRD-v0.9.0.md;实现计划:
docs/plans/2026-08-08-v0.9.0-boundary-reset-and-security.md;复盘:
docs/devlog/wx-kit-vibe-coding.md §43–§45。
v0.8.5 — 一个问题,一份清单
wx-kit v0.8.5 — 一个问题,一份清单(2026-07-28)
上一版给了「那天各订阅号发了什么」,但答案只到链接。要真拿去用,还得自己逐个下载,
再把「刚下的」和「本来就有的」两种结果缝成一份清单——那道缝本该由工具缝。
新增
subscription digest --download:一条命令拿到能直接读的素材
wx-kit subscription digest --date yesterday --download --formats md,meta- 缺的下、已有的跳过,清单里每篇都带
dir和contentPath
——不区分是刚下的还是本来就在库里的,拿到就能读正文。 --formats缺省跟设置里的默认格式走(不是固定的md,html,meta,那是crawl的缺省):
「我平时下什么就下什么」比记住一串字面量更符合直觉。想省流量可加--no-video。contentPath只在正文文件真存在时才给(下载时选了md)。
给一个指向不存在文件的路径比不给更糟——照着读会失败,还得回头猜为什么。- 拿不到的那几篇仍留在清单里:
unavailable: true是「读者本就打不开」(审核未通过/已删除),
重试无用;只有error的是真故障(网络/频控),可以再试。这一区分让自动化不会对着死链反复重试。 - 不带
--download时行为一字不变:纯只读,不下载、不写库、不推进订阅水位。
这不是靠一个 if 分支的自觉——查询与取内容在实现上就是两个独立步骤。 - 即使带
--download也不推进订阅水位。下载与水位无关,水位只由订阅检查推进。
配套的 agent 说明书(agent/wx-kit-skill、agent/wx-kit-compose)已同步:
原先「先 digest 再逐个 download」的范例直接替换掉,不并列——并列只会让人继续用累的那条。
验证
- 单测 518 → 531 全绿,tsc / lint 通过;图形界面端到端全套通过。
- 真机验证(隔离库根 + 真实登录态,不碰主库):
- 下好的文章按
contentPath真读到正文;同一条命令再跑,已下好的一次请求都不发,
两轮输出逐字段一致。 --formats meta时不给contentPath(目录里确实只有meta.json)。- 只读模式跑完,库根没写任何东西;订阅水位前后一致。
- 真实数据里遇到两篇同名文章,下载才发现是审核未通过后重发——
unavailable正确标出。
- 下好的文章按
- 打包后的 .app 实跑确认新参数可用。
需求与逐条验收:docs/PRD-v0.8.5.md;复盘:docs/devlog/wx-kit-vibe-coding.md §40。
v0.8.4 — 看得见,还能挑
wx-kit v0.8.4 — 看得见,还能挑(2026-07-28)
上一版的主题是「不让用户猜」——把系统知道的告诉你。这一版往前走一步:光告知不够,得让你能据此做选择。
五条需求是同一个形状:系统手里已经有这个信息,你却用不上或用不准。没有一条需要新抓数据。
修复
有新版却一直不提示(R1)
本机装着 v0.8.2、「启动时检查更新」开着、v0.8.3 已发布——等一小时也没动静。两处设计缺陷叠在一起:
- 限流把结论一起吞了:24 小时内查过就直接返回空,而界面只能把「空」理解成「没有新版」。
限流的本意是省请求,不是隐瞒结论。现在被限流时给出上次查到的结果,hasUpdate按当前版本实时算
——所以升级后提示自动消失,不需要任何清理。 - 唯一的检查时机绑在「开窗后 3 秒」:桌面应用常年开着,关掉窗口那段逻辑就不存在了,可能好几天都不查一次。
改由主进程每小时问一次;tick 变频繁不等于请求变频繁,真正的节流仍是「每天最多一次」。
类型标识把「图片」标成了默认类型的名字(R5)
图片消息(小绿书)被标成「图文」——而「图文」恰恰是不标标签的那个默认类型的名字,于是
「标了图文的反而不是普通图文」。改为「图片」。普通图文仍然不标:文库里绝大多数是它,
全标一遍等于全不标,标识的价值在于它出现时你就知道这篇不一样。
同时:没见过的消息类型此前与普通图文在卡片上无法区分,现在给警示态标识;
解析告警(warnings)以前在图形界面里根本不存在——产生了、然后消失,只有命令行输出看得到。
现在写进 meta.json,卡片上一个 ⚠,hover 可读全文。
新增
订阅新文章:看得见是哪几篇,挑着下载或忽略(R4)
此前每个号只显示一个数字,只能全下或全不要。而这些标题早就存在本地了——
完整的标题、时间、类型、文章主键一直躺在订阅记录里,界面只用了它的长度。零额外请求。
- 点开数字展开明细:标题 + 发布时间 + 类型标识;点标题用浏览器打开原文
——光看标题常常判断不了值不值得下,这是「有选择」能成立的前提。 - 勾选后下载或忽略;默认全选,所以最常见的「全下」仍是一次点击。
- 行内动作始终作用于当前选择:收起时选择即全部,展开后文案随勾选变化。
一次只有一个含义,不并列摆「下载全部」和「下载所选」两套按钮。
CLI:查订阅号某一天发了什么(R2)
wx-kit subscription digest --date yesterday不下载、不写库、不推进订阅水位——可以反复查同一天。这与「检查更新」是两件事:
后者按水位问「有没有新的」,查完要推水位;共用水位只会互相污染。
每篇带 downloaded 标记,把「发现」与「已有」连起来:已在库的直接读本地,没下的才下载。
日期只认 YYYY-MM-DD / today / yesterday,「昨天」「7月23日」这类说法由调用方换算
——CLI 刻意不猜:猜错会静默给出另一天的结果,而没人会发现。
创作编排 skill 跟上了 CLI(R3)
agent/wx-kit-compose 上次改动停在 2026-06-23(v0.4.0),中间隔了二十多个里程碑,
它认识的命令只有 library export 的四个选料器——上下游两端都错过了:
上游只能从已下载的文章开始,下游停在初稿。
现在:上游从 subscription digest 起步(「昨天各号发了什么」才是选题真正的起点),
下游可选 site sync 发到个人站点(默认不做,需明确要求——发布是不可逆的对外动作),
中间补上按关键词找素材、按发布时间取最近 N 篇,以及两个影响素材可用性的字段
(视频/文字消息没有长正文,据一段描述写论据等于编造)。
它落后二十个版本的根因是把命令细节抄进了自己文件里——抄来的不会跟着源头变。
所以这次没有抄得更全,而是把参数与输出契约一律指向 wx-kit-skill,并把这条教训写进它自己的避坑清单。
顺手修掉的既有缺陷(不在需求里,但同属被改动的路径)
- 订阅下载没透传文章主键 → 订阅拿到的是短链,只能退化成路径哈希 id,
同一篇经「按公众号」抓时算成另一篇。真实文库里已积下 32/267 篇。
这是 v0.8.2 为批量抓取修过的同一个 bug,当时漏了订阅这个调用点(图形界面与命令行各一处)。 - 留着没处理的新文章会被下次检查冲掉:存新文章是整体覆盖。此前只能全下或全忽略所以看不出来,
一旦能「留着回头看」就是静默丢数据。改为按文章主键合并。 - 下载失败的文章被静默清出待处理列表——点了下载、失败了、列表里也没了,连重试入口都没有。
现在只移除「成功 / 已在库 / 读者本就打不开(重试无用)」,真故障留下等重试并明确提示。 subscription digest的downloaded除了比 id 还比原文链接,否则上面那 32 篇会被误报成「未下载」,
反倒诱导重下一遍——那正是这条命令最该避免的事。
验证
- 单测 479 → 518 全绿,tsc / lint 通过;Playwright 图形界面端到端全套通过(新增 10 条断言,零网络)。
- 真机验证(隔离配置与库根、借真实登录态,不碰主库):
- 复现原场景:限流状态 + 缓存里有新版 → 提示出现且一次请求都没发;关掉开关则既不请求也不提示。
- 订阅展开看真实明细、部分下载(下 1 留 1)、短链下载后 id 恢复为文章主键。
digest真跑:downloaded与真实文库对得上(含旧格式 id),跑完订阅与文库记录逐字节未变。
需求与逐条验收:docs/PRD-v0.8.4.md;复盘:docs/devlog/wx-kit-vibe-coding.md §39。
wx-kit v0.8.3 — 打不开的文章不再算「下载失败」
wx-kit v0.8.3 — 打不开的文章不再算"下载失败"(2026-07-27)
按公众号下载时,如果作者有文章发布失败(审核未通过/违规下架),批量结果里会出现 失败 N,
而失败原因是笼统的 no title parsed —— 看起来像工具坏了,实际上是那篇文章读者本来就打不开。
本版把这两件事彻底分开。
修复
「读者打不开」与「下载失败」不再混为一谈
- 失败原因说人话:从
invalid or unavailable article (no title parsed)变成
「该文章审核未通过,读者不可见(无法下载)」 / 「该文章已被作者删除」/「该文章因违规被下架」。 - 批量汇总里两类分开计数:
失败只报真故障(网络、解析等,重试可能有用),
读者本就打不开的单独说明「另有 N 篇作者发布失败或已下架,读者本就看不到(非下载故障)」。 - 实测原案例:
成功 1 · 失败 2(笼统)→成功 1 · 真故障 0 · 读者不可见 2。 - 认不出的错误页仍退回原来的笼统说法——不硬猜,那可能真是解析故障,标错了会掩盖真问题。
列表过滤补上两个漏读的状态
文章列表接口除 is_deleted 外还有 checking(审核期间)与 ban_flag(封禁),此前只读了第一个。
现在三者一并过滤,审核期间的文章不再进入下载队列、也不再被订阅检查当成新文章。
--count N 按「能下的篇数」算
过滤掉不可见的文章后会继续往前翻,凑够你要的篇数;
提示只在结果确实不及预期时才给——要 3 篇给了 3 篇就什么都不说。
说明:为什么不能在列表阶段就全部滤掉
文章被拒之后,列表接口不再有任何标记。 checking 只在审核期间为 1,审核结束后无论通过与否都归零
(实测同两篇文章隔天从 checking:1 变成 checking:0,而页面始终打不开)。
逐字段比对过 6 篇文章的每一个字段(含全部嵌套对象,以及最可能藏标记的群发状态块),
除了正文行数 line_count 外没有任何差异;而 line_count 会误伤视频消息(天然没有正文行数却能正常下载)。
误滤是静默的,代价远高于明确的失败提示——所以本版选择在下载阶段认出错误页,而不是靠猜去过滤列表。
验证
- 单测 461 全绿、tsc / lint 通过;Playwright GUI e2e 全套 ALL PASSED。
- 真实复现原案例(「猫笔刀」最近 3 篇),打包态复验全链路。
需求与逐条验收:docs/PRD-v0.8.3.md;复盘:docs/devlog/wx-kit-vibe-coding.md §38。
wx-kit v0.8.2 — 不让用户猜
wx-kit v0.8.2 — 不让用户猜(2026-07-26)
四条需求的共同点是系统知道、却没告诉用户:点了检查不知道发生了什么、文章里的视频悄悄丢了、有新版本不知道、以及——查下去才发现的——整类文章从来没被抓到过。
修复
订阅检查终于会说话(R1)
「发现新文章时」设为自动下载后,点「检查」会静默把文章下走:页面毫无变化,只在日志里留一行。根因是实现遗漏——IPC 层把 runSubscriptionCheck 的返回值整个丢了,渲染层拿到 undefined,想提示也无从提示;而自动下载那条路径连一个进度事件都不发。
- 检查结果带逐号明细(哪个号新增几篇、下了几篇、失败原因),反馈就地显示在被操作的那一行,几秒后淡出;失败态留到下次检查。
- 自动下载现在有进度条,与手动下载同一套 UI(复用既有事件通道,没新造机制)。
- 下完给「去看看」直达文库并筛到该公众号——解决「东西下到哪了」。
- 单号检查不弹全局提示(反馈就近);「检查全部」额外给一条汇总。
- 订阅页常驻显示当前策略(「发现新文章时:自动下载 ⚙」),让状态可见,而不是让人回忆几天前设了什么。
- 顺带修掉一个既有缺陷:
lastCheckedAt此前只在一条分支写,自动下载模式与「无新文章」永远不记,于是页面左边显示「尚未检查」、右边同时显示检查结果。
整类文章从来没被抓到过(R4)
按公众号下载时「视频那篇被跳过」、「取不到最新文章(只到 7-17)」——两个现象同一个根因:用错了列表接口。
| 接口 | 总数 | 最新一篇 | 返回的类型 |
|---|---|---|---|
| 旧(图文素材) | 370 | 2026-07-17 | 只有普通图文 |
| 新(已发表) | 770 | 2026-07-25 | 图文 / 文字消息 / 视频消息 齐全 |
某号 7 月 17 日之后发的全是文字消息与视频消息,旧接口一篇都看不见——不是"跳过",是从未进入列表。实测抓最近 10 篇,9 篇是旧接口看不见的。
连带一个没人报的问题更严重:订阅检查走同一条链路,所以订阅号发的文字/视频消息一直在漏检,而检查记录显示「无新文章」,完全看不出来。修好后对同一个号回溯检查,补回 6 篇。
解析改为按消息类型分发,不再靠猜。旧实现是一串启发式(#js_content 非空就当正文用),它对未知类型永远不报错——视频消息页的 #js_content 是个分享提示壳,于是 21.8 万字符的内联 JavaScript 被当正文写进 content.md,一路绿灯。现在不认识的类型走兜底但会在 warnings 里说出来,新类型第一时间暴露而不是烂在文件里。
跨 URL 形态的去重:两个接口对同一篇文章给的 URL 形态不同(短链 vs 长链),导致已下载过的文章被重下。现在用微信自己的文章主键判重,并让老库里的旧格式 id 与新格式认作同一篇——不需要迁移文库。
超时按资源体量分档:此前只有视频按体积算,页面和图片共用固定 20 秒——而视频消息页实测 2.4MB,20 秒等于要求跑满 120KB/s,慢一点整篇失败。现在页面 60 秒、图片 30 秒(刻意不放宽:一篇的图是串行下的,单张放太松会让整篇卡很久)、视频按体积。
新增
含视频的文章能下了(R2)
- 视频是内容,不是格式——文章带视频就一并下载,和图片一样,不需要在下载格式里勾选。单个视频可达上百 MB(实测 1572×1080 一档 133MB),批量抓取想省流量可在设置里关掉「文中视频」,或 CLI 加
--no-video。 - 落在
videos/video-N.mp4,自动取最高清档(按分辨率择优;format_id数值与画质无关,数值最大的那档其实是 480×328)。 md给可点链接、html给可播<video>——阅读器里直接就能播。- 不下载时正文仍注明「本文含 N 个视频(未下载)」,不静默丢弃;下载失败会写进正文并出现在
warnings里。 - 文库对含视频、以及非普通图文的文章标出标识。
更新检查 + 按渠道引导升级(R3)
- 启动后延迟几秒静默检查,有新版只在「设置」上点一个小圆点——不弹窗、不打断。新版本可用不是紧急事。
- 设置页「检查更新」三态明确:检查中 / 已是最新 vX.Y.Z / 发现新版(展开版本号、发布时间与发布说明)。
- 按你的安装方式给不同动作:brew 装的给一条可一键复制的完整命令(含
brew update与xattr -cr两个必要步骤);手动装的按当前架构下载安装包并打开,附覆盖后的收尾提示。 - 「启动时检查更新」可关,每天最多查一次;只向 GitHub 请求版本信息,不上传任何数据。
- CLI:
wx-kit update --check给出channel与upgradeCommand;查询失败明确报错(退出码 1),agent 不会把失败误读成「已是最新」。wx-kit version仍不联网。
说明:不做静默自动升级
mac 的包是 adhoc 签名,Squirrel 的签名校验必然失败;而 brew 是本项目的必做分发渠道,应用自己替换二进制会让 brew 的版本账本对不上。所以本版做的是「让你知道有新版 + 明确告诉你怎么升」,不是偷偷替换。详细理由见 docs/PRD-v0.8.2.md R3。
验证
- 单测 445 全绿(连跑 4 轮稳定)、tsc / lint 通过;Playwright GUI e2e 全套 ALL PASSED,控制台 0 错误。
- 真实端到端(隔离库根与 userData、借真实登录态,不碰主库):
- 133MB 视频真下真验:字节数与接口给的
filesize逐字节相等,ffprobe确认 h264+aac / 1572×1080 / 992.56 秒;阅读器内实测可播。 - 抓最近 10 篇拿到 7-25 那篇,类型分布 8 篇文字 + 1 篇视频 + 1 篇图文。
- 重复抓取正确跳过;对真实文库回溯验证与旧格式 id 的匹配。
- 更新检查两条路径都真跑(已是最新 / 发现新版),brew 渠道真机识别成功。
- 133MB 视频真下真验:字节数与接口给的
需求与逐条验收:docs/PRD-v0.8.2.md;复盘:docs/devlog/wx-kit-vibe-coding.md §37。
wx-kit v0.8.1 — dock 图标真修复
wx-kit v0.8.1 — 补上 v0.8.0 没真正修好的 dock 图标(2026-07-22)
v0.8.0 宣称修复了「mac 上跑 CLI 会在程序坞堆图标」,实际没修好。本版换了修法,真正解决。
修复
mac CLI 不再冒程序坞图标(R1)
- v0.8.0 的修法为什么无效:
app.dock.hide()放在app.whenReady()之前并不生效——dock API 要等 app ready 才被应用,而 AppKit 在那之前就已把进程注册成前台应用并画出了图标。实测wx-kit -h期间的进程状态序列是NULL → Foreground → UIElement:图标先出现,随后才被隐藏。命令跑得越短,图标可见占比越大,-h几乎全程可见。 - 本版修法:打包配置加
LSUIElement: true(mac Info.plist),由 Launch Services 在进程启动时就定为 accessory,不给图标出现的机会——图标是 JS 执行前画的,只能在 plist 层拦。GUI 分支在 ready 后app.dock.show()把图标要回来,并app.focus({ steal: true })确保窗口正常到前台。 - 实测(打包态):
-h全程 40/40 采样为NULL,从未出现Foreground;download为NULL → UIElement;GUI 启动Foreground+ 窗口到前台,一切照旧。 - win/linux 不受影响(
LSUIElement是 mac 专有键)。
新增
设置页「站点同步」的建站指引(R2)——标题旁一个 ?,hover 才显示,不常驻占版面:
同步目标是一个 Astro 静态站。我的开源项目 dreamble 的
site/子目录就是这个站点的完整源码——主题、发文规范、构建脚本都在里面,想自建个人站可直接取用。
含可点链接 github.com/monkeychen/dreamble(走系统浏览器打开)。
验证
- 单测 350 全绿、tsc / lint 通过;Playwright GUI e2e 全套 ALL PASSED(新增
?图标与 tooltip 文案两条断言),控制台 0 错误。 - 打包态真机采样验证 dock 行为(方法:
lsappinfo info -only ApplicationType <pid>,覆盖启动瞬间)。 - brew 安装的正式包跑
--version/download/library list全通。
需求与逐条验收:docs/PRD-v0.8.1.md;复盘:docs/devlog/wx-kit-vibe-coding.md §36。
wx-kit v0.8.0 — 让内容流到该去的地方
wx-kit v0.8.0 — 让内容流到该去的地方(2026-07-22)
本版两条主线:让 agent 用 CLI 用得更顺(订阅可按号点检、列表默认按发布时间排好序、-h 给出仓库地址),以及让下载到的文章能一键流进个人站点。外加修掉一个 mac 上的老毛病。
新增
文库/CLI 同步到个人站点(M32 · R2)——把已下载的文章按 Astro 站点的发布规范直接生成到 content/posts/:
- 产出
YYYY-MM-DD-<slug>/index.md,目录日期取自文章的 publishTime;frontmatter 只写title / date / source: wechat(严格对齐站点 strict schema,多一个字段站点就构建失败)。 - 正文自动去掉 wx-kit 的 frontmatter 与重复的首个 H1;图片摊平到同目录(
images/img-1.png→./img-1.png),站点侧零手工调整。 - 目录级原子写入:先写暂存目录、写全再整体
rename,中途失败不留半成品;slug 与已有目录冲突时不覆盖,该篇记失败、不阻断其他篇。 - 这是纯个人需求,故默认隐藏:设置页新增「站点同步」开关(默认关)+ 目标目录;开关只管 GUI 按钮可见性,CLI 通道不受限(agent 配好目录即可用)。
- GUI:文库选中文章 → 底部指令区「同步到站点」→ 逐篇填 slug → 结果汇总(成功列目录、失败列原因)。
- CLI:
wx-kit site sync --ids <id> --slug <slug>,批量用--slugs <id>=<slug>,...或--slugs-file(按 id 映射,不靠位置对应)。
订阅支持按号点检(M31 · R1)——以前只有一个全量「检查更新」,想单独看某个号有没有更新没地方点:
- 订阅页每行新增「检查」动作,顶部按钮改名「检查全部」(语义对照)。
- 频控纪律不变:子集照样串行 + 账号间随机延迟;与全量检查共享同一个 in-flight 守卫,检查进行中两处按钮一并置灰,不会叠加请求。
- CLI:
wx-kit subscription check-now --accounts <fakeid,fakeid>(fakeid 从subscription list取)。
改进
library list / search 默认按发布时间降序(M31 · R3)——为「每天拉取所有公众号最近文章清单」这个 agent 场景:
- 新增
--sort publish|download|title与--order asc|desc,默认即--sort publish --order desc,agent 直接library list取前 N 条就是最近 N 篇。 - 空 publishTime 的条目在升降序下恒置末尾(与 GUI 同一份
sortArticles,逻辑抽到 core 共享,不双份维护)。 ⚠️ 轻度 breaking:默认输出顺序从「索引写入序」变为「publishTime 降序」。原顺序本就不确定、不应被依赖,新默认更可预期。
wx-kit -h 给出仓库地址(M31 · R4)——帮助末尾附 https://github.com/monkeychen/wx-kit,agent 遇到 skill 没覆盖的细节可自助去读 README / issues / releases。
修复
mac 上 CLI 命令堆程序坞图标(M31 · R5)——跑一次 CLI 冒一个图标、跑 N 次堆 N 个:
- 根因:Electron 在 mac 是 GUI 子系统应用,进程一启动就在程序坞冒头,哪怕一个窗口都不开;CLI 分支复用 Electron 进程(PDF 渲染需要 BrowserWindow)却没压制。
- 修复:CLI 分支在
whenReady前app.dock.hide()(仅 mac 存在,win/linux 天然 no-op)。GUI 启动的 dock 图标、CLI 的 PDF 离屏窗口均不受影响。
验证
- 单测 350 全绿(新增站点同步核心 17 例、排序 5 例、订阅部分检查 2 例,以及 20 例 CLI 契约测试覆盖新命令的参数解析与退出码)、tsc / lint / Playwright GUI e2e 全过。
- 跨项目端到端:站点同步产物落进真实 Astro 站点跑
npm run check(strict schema + 目录日期 + slug 唯一)全过,astro check 0 errors;验完清理不留痕。 - CLI 真机:单篇 / 含图 / slug 冲突 / 非法 slug / 缺 slug / 批量映射逐个走通,退出码 0/1/2 符合契约。
- mac 真机:连续跑多条 CLI 命令,程序坞全程无图标;无参启动 GUI 图标正常。
需求与逐条验收:docs/PRD-v0.8.0.md;实现计划:docs/plans/2026-07-22-m31.md、docs/plans/2026-07-22-m32.md;复盘:docs/devlog/wx-kit-vibe-coding.md §36。
v0.7.0 — 磨平「下载 → 创作」链路
wx-kit v0.7.0 — 磨平「下载 → 创作」链路的四处毛刺(2026-07-20)
本版不铺新平台、不改架构,只把「下载到的东西」和「用它创作」之间用户天天踩的四颗小石子磨掉。
改进
Markdown 导出保留表格(M29 · R1)——以前含表格的文章存成 md,表格直接散架变成一坨文本:
- 自写 GFM 表格规则转出标准
| 列 | 列 |表;不引turndown-plugin-gfm——插件产出的骨架对,但微信单元格外那层<section>会被当块级元素、炸出裸换行(非法 GFM),要修等于把插件核心重写,不如自己 40 行搞定,还少一个依赖。 - 单元格内行内格式(粗体/链接)、双引号、特殊符号原样保留;管道符转义。合并单元格(rowspan/colspan)按 GFM 限制尽力而为。
- 真实文章端到端验证:两张不同列数的表(2 列、3 列)均转成紧凑合法 GFM,GUI 阅读器渲染成真表格。
应用内可见版本号(M29 · R2)——以前只有 CLI --version 能看到版本号,GUI 完全不可见:
- 设置页新增「关于」区块:版本号(取自
app.getVersion(),发版自动跟上)+ 项目主页 / 查看新版本外链。 - (刊头版本号上线后即按反馈撤回——用户不关心版本号,常驻刊头是噪音;版本信息留「关于」即可查。)
窗口标题栏去重(M29 · R3)——原生标题栏那个「wx-kit」与应用内刊头品牌区信息重复:
BrowserWindowtitle 与index.html<title>同改为空(mac 上标题栏只剩红绿灯 + 一条干净浅灰条),刊头零变化。一行配置改动、零风险。
导出素材一键递给 agent(M30 · R4)——以前导出素材后要「去 Finder 找路径 → 切到 agent → 自己拼提示词」三步:
- 导出成功由一条提示升级为 Modal:清单路径就地可见、可选中。
- 主按钮**「复制给 agent 的指令」**复制一段可直接粘进 Claude Code 等任意 agent 的自然语言(含清单绝对路径、
contentPath用法、引导「先读再确认选题」),省掉找路径和拼提示词两步。 - 调研后否决「直接唤起 Claude Code」:
claudeCLI 虽能带 prompt 起会话,但唤起的是新终端 + 陌生 cwd 的新会话,而用户真实场景是粘进已开着的会话——复制指令对任意 agent 通用、更贴合真实用法。
验证
- 单测 307 全绿(新增 GFM 表格 6 例 + agent 指令拼装 5 例)、tsc / lint / Playwright GUI e2e 全过。
- 真实文章端到端:下载含表格文章 →
content.md是合法紧凑 GFM 表格 → 阅读器 md 视图渲染成真表格。 - GUI 真机验证:导出 → Modal → 复制指令 → 主进程读回剪贴板逐字比对;清单
contentPath逐条可达。
需求与逐条验收:docs/PRD-v0.7.0.md;实现计划:docs/plans/2026-07-20-m29.md、docs/plans/2026-07-20-m30.md。
v0.6.0 — Agent 自动化闭环:命令行安装、登录态迁移、专属 skill
wx-kit v0.6.0 — Agent 自动化闭环:命令行安装、登录态迁移、专属 skill(2026-07-19)
新增
命令行安装通道(M26)——agent/用户一条命令装好,不再手动下 dmg:
# macOS(Homebrew)
brew install --cask monkeychen/wx-kit/wx-kit
xattr -cr /Applications/wx-kit.app # 未签名 app 必须清 quarantine,否则 CLI 也会被 Gatekeeper 卡住
# macOS / Linux(npm,Node 20+;国内先设 ELECTRON_MIRROR)
npm install -g wx-kit登录态跨机器迁移(M27)——headless/服务器环境无法扫码的正解:
wx-kit session export [-o <file>]:导出登录态(文件权限 0600,等同登录凭证,用后即删);wx-kit session import <file>:结构校验 → 导入 → 立即真探测有效性(失效如实报valid:false)。- 工作流:mac 扫码 login → export → scp → 服务器 import → agent 全自动 crawl/订阅检查。
wx-kit 使用 skill(M28)——agent/wx-kit-skill/:agent 的安装与使用教程(检测未装即自动安装、登录态分场景处理、全部 CLI 原子能力速查、组合任务范例、频控纪律),样例逐条实测;与 wx-kit-compose(创作编排)互补。
改进
日常体验(M25):
- 文库默认按发布时间降序(最新发表在最前),切换排序后跨会话记忆;
- 设置页新增「打开检查日志」入口(完整检查历史含逐号失败原因),订阅页同入口提升可见性;
wx-kit -h帮助大改:双模式说明、stdout JSON/退出码契约、命令组子命令清单、常用示例、库默认位置。
验证
- 单测 296 全绿、tsc / lint / Playwright GUI e2e 全过(新增排序默认/记忆、日志入口断言)。
- 双通道隔离安装真机验证:brew 装 .app 跑
--version+ md+pdf 下载;npm tarball 全局装跑真实文章下载。 - 全新 agent 四步端到端(隔离 npm prefix + 隔离 HOME):安装 → session import(valid:true)→ download → library list,零人工。
需求与逐条验收:docs/PRD-v0.6.0.md;实现计划:docs/plans/2026-07-19-m25*~m28*.md;复盘:devlog §34。
v0.5.5 — 文库目录化导航 + 按关键词筛选下载
wx-kit v0.5.5 — 文库目录化导航 + 按关键词筛选下载(2026-07-18)
新增与改进
文库导航:首屏即目录(M23)——治「滚动好久才看到下面的文章」:
- 分组视图默认收起,打开文库先看到「公众号 · N 篇」的目录,一屏尽览,点开哪个看哪个;展开状态记忆(跨页面/跨重启保持),新公众号默认收起;工具栏一键「全部展开/全部收起」。
- 粘性组头:滚动时当前组头钉在顶部(卡片/列表视图皆是),随时可点收起、直接落到下一组;列表视图列头同钉。
- 回到顶部悬浮按钮。
- 性能实测背书:1000 篇假文库下目录态打开 ~170ms;卡片全展开后滚动曾降到 ~23fps,
content-visibility: auto修至 ~52fps——千篇量级流畅,无需虚拟滚动。
按公众号下载支持关键词筛选(M24,issue #1):
- 抓取配置新增「关键词筛选」:下拉选仅下载含 / 排除含(互斥),关键词逗号分隔、按标题匹配(不区分大小写),留空不筛。
- 过滤发生在「列出 → 下载」之间,零额外请求、不加重频控;只在指定抓取范围内筛,不为凑数翻页。
- CLI 同步支持
crawl --include <kw,kw>/--exclude <kw,kw>(可组合,exclude 优先),JSON 输出含filteredOut(被过滤篇数)。
验证
- 单测 279 全绿(关键词过滤矩阵、crawl 接线、设置字段)、tsc / lint / Playwright GUI e2e 全过(e2e 新增目录态/单组展开/展开态持久断言)。
- 真机:115 篇真实文库目录态/粘头/回顶/重启保持截图;CLI 对真实公众号实抓关键词过滤(listed 5 → filteredOut 5、零下载)。
需求与逐条验收:docs/PRD-v0.5.5.md;实现计划:docs/plans/2026-07-17-m23-m24-library-nav-and-keyword-filter.md;复盘:devlog §33。