1) dsh-server-docs/ 从工作区(原 E:\...\aliyun-dsh-server\dsh-server-docs)**整体并入本仓**,
保留目录名 ⇒ 仓库内 dsh-server-docs/... 的相对引用天然继续有效;旧目录(含其 .git)已归档到
工作区 _中间产物_待清理/,未随本提交带入。
2) .gitattributes:新增 `dsh-server-docs/** -text` —— 原文档库是 `* -text` + autocrlf=false,
必须保持纯 LF,否则会被本仓的 CRLF 规则翻掉。
3) 活引用里的绝对路径已全部改到新位置(docs 的 INDEX / README / scripts / skills + 用户级 skills
+ ~/.workbuddy/settings.json 的 hooks);历史档案(04-调整方案/、archive/)按「只增不改」未动。
⚠️ hooks 路径改动需「完全重启会话」才生效(配置是会话启动快照)。
4) 交接单/T08:新增 §16「生产整体切换执行记录」(形态 / 落地动作 / **4 个只有真上线才暴露的真 bug** /
验收证据 / 回滚命令 / 残留项);台账 T08 行 → 已完成并归档;03-路线图 §二 登记 T08 收尾项。
5) 统一称谓:**「本机」只指跑 WorkBuddy 的开发机**,47 / 106 一律写「远程服务器」。
30 lines
1.6 KiB
JavaScript
30 lines
1.6 KiB
JavaScript
/** 批量列出会话档位:id / 创建时间 / preset / sandbox mode / approval / turn 数 */
|
||
* 会话取证 · 批量对比各会话 preset/sandbox/approval(定位"老会话档位未跟随平台默认"的关键工具)
|
||
import { readFileSync } from 'node:fs'
|
||
import { zstdDecompressSync } from 'node:zlib'
|
||
|
||
const MAGIC = Buffer.from([0x28, 0xb5, 0x2f, 0xfd])
|
||
const t = (ms) => new Date(Number(ms)).toLocaleString('zh-CN', { hour12: false, timeZone: 'Asia/Shanghai' })
|
||
|
||
for (const file of process.argv.slice(2)) {
|
||
const raw = readFileSync(file)
|
||
const offs = []
|
||
for (let i = 0; i + 4 <= raw.length; i++) if (raw.compare(MAGIC, 0, 4, i, i + 4) === 0) offs.push(i)
|
||
let text = ''
|
||
for (let f = 0; f < (offs.length ? offs : [0]).length; f++) {
|
||
const s = offs[f], e = f + 1 < offs.length ? offs[f + 1] : raw.length
|
||
try { text += zstdDecompressSync(raw.subarray(s, e)).toString('utf8') } catch {}
|
||
}
|
||
const evs = []
|
||
for (const l of text.split('\n')) { if (!l.trim()) continue; try { evs.push(JSON.parse(l)) } catch {} }
|
||
const meta = evs.find((e) => e.type === 'session')
|
||
const uniq = (ty, f) => [...new Set(evs.filter((e) => e.type === ty).map(f))].join(',')
|
||
const tl = text.match(/"text":"([^"]{0,60})"/g)?.slice(0, 1)?.join('') ?? ''
|
||
console.log(
|
||
'%s | 创建 %s | preset=%s | sandbox=%s | approval=%s | turns=%d | %d 事件',
|
||
(meta?.id ?? '?').slice(-12),
|
||
t(meta?.createdAt), uniq('permission/preset', (e) => e.data?.preset), uniq('sandbox/mode', (e) => e.data?.mode),
|
||
uniq('approval/policy', (e) => e.data?.policy), evs.filter((e) => e.type === 'turn/start').length, evs.length,
|
||
)
|
||
}
|