实战配方
五个今天就能跑的场景,每条都带真实命令和它产出的证据。
1. 整理下载文件夹(并且能收回来)
node scripts/make-fixture.ts
node bin/deskshell.ts run downloads-cleanup --root .demo/downloads
node bin/deskshell.ts run downloads-cleanup --root .demo/downloads --mode apply
node bin/deskshell.ts run downloads-cleanup --root .demo/downloads --mode undo
预览列 20 步;执行后 13 个文件进 6 个分类目录、3 个重复文件进 .trash;撤销后 13 个文件全部回到原位。
2. 照片按 YYYY-MM 归档
node scripts/make-photo-fixture.ts .demo/photo
node bin/deskshell.ts run photo-sort --root .demo/photo --mode apply
node bin/deskshell.ts run photo-sort --root .demo/photo --mode undo
12 文件夹具实测:12 个文件 → 3 个月份目录(2026-03、2026-04、2026-05)→ 撤销后 12 个文件回来、月份目录清零。非图片文件全程不动。
3. 归档 30 天前的日志
node bin/deskshell.ts run log-archive --root .demo/logs --mode preview
node bin/deskshell.ts run log-archive --root .demo/logs --mode apply
文件进 archive/YYYY-MM/。不删除任何东西——归档就是移动,撤销就是移回去。从代码里调用时可以传 now 与 maxAgeDays。
4. 批量改名,绝不覆盖
node bin/deskshell.ts run rename-batch --root .demo/photos --mode preview
IMG_9.jpg, IMG_10.jpg, IMG_2.jpg 会变成 trip-001.jpg … trip-003.jpg——按序、补零、保留扩展名。
真正有意思的是失败路径:如果 trip-002.jpg 已存在,这一步的 path.absent 前置断言失败,整个任务停下,之前改好的名字全部回滚。改名永远不会悄悄覆盖,失败的批次让目录保持原样。
5. 一千个文件要花多久
node scripts/bench.ts 1000
本机实测(Windows,Node 24.21.0):
文件数 1000
plan 44 ms (1002 步)
apply 737 ms (0.7 ms/步)
undo 727 ms (回滚 1002 步)
日志体积 387 KB (396 B/步)
堆增长 7 MB
两个关键数字:每步 0.7 ms,审计日志每步不到 400 字节——所以就算几千个动作,账本也不贵。
规模验证——同一台机器上 5000 个文件:
文件数 5000
plan 167 ms (5002 步)
apply 3770 ms (0.8 ms/步)
undo 3436 ms (回滚 5002 步)
日志体积 2071 KB (424 B/步)
堆增长 25 MB
成本是线性的:1000 与 5000 文件下都是每步 0.7–0.8 ms,日志每步大约 400 字节。
6. 按内容去重
node bin/deskshell.ts run dedupe-folders --root .\photos --mode preview
按 sha256(前 8 MiB + 文件大小)分组,保留最早的那一份,之后的重复项全部移进 .trash/。撤销会把它们全放回去——.trash 是真移动,不是删除。
7. 截图按日期归档
node bin/deskshell.ts run screenshot-organize --root .\Pictures\Screenshots --mode apply
Screenshot 2026-03-04 at 10.11.12.png → 2026/03/20260304-1011-Screenshot ....png。只处理文件名里含 screenshot / 截图 / snipaste 的图片,其它文件不动。
8. 镜像目录
node bin/deskshell.ts run sync-mirror --root .uild --mode preview # src -> mirror
缺失或变更的文本文件写过去,目标里多余的文件移进 .trash,二进制文件按设计跳过(fs.write 只带文本)。撤销会把每个文件的旧内容还回去。
自己写一个
node scripts/new-skill.ts --name my-skill
node bin/deskshell.ts run my-skill --mode preview
然后读 写一个 skill。三条硬规则——post 断言、undo、不碰系统 API——正是这些配方能被安全重跑的原因。