j0yen/fsstory
GitHub: j0yen/fsstory
fsstory 是一款只读的命令行文件归属追踪工具,通过关联 ctrace 日志、Claude 会话记录和文件时间戳,回答「是谁在何时修改了某个文件」的问题。
Stars: 0 | Forks: 0
# fsstory
`fsstory` 回答了一个 `stat` 无法回答的问题:当这台笔记本电脑上的某个文件发生变化时,*是谁*修改了它——是 Claude 会话、交互式编辑器,还是某个无法溯源的进程——以及修改发生的时间和置信度。它是只读的,支持按需获取快照。
## 为什么开发它
`stat` 会告诉你文件的 mtime。但它不会告诉你文件是谁写入的。在一台整天由 Claude 会话与你的日常工作一起频繁修改文件的笔记本电脑上,“它何时被修改过”只是问题中简单的一半;而“是谁,以及为什么修改”才是关乎信任和取证的另一半——通常要回答这个问题,意味着需要执行三次 `Bash` 调用外加一番猜测。
这些信息其实存在,只是比较分散。ctrace 知道每次写入的 PID 和 `comm`。Claude 会话记录知道执行了哪一轮对话和哪个工具。`stat` 知道 mtime。`fsstory` 就是这些数据源之上的只读连接器:它会针对每个路径生成一条带有归属信息的时间线,因此你只需一条命令就能得到答案,而无需自己去拼凑线索。
## 安装
```
curl -fsSL https://raw.githubusercontent.com/j0yen/fsstory/main/install.sh | bash
```
或者自行构建——需要 `cargo` 和 `rustc 1.85+`:
```
git clone --depth 1 https://github.com/j0yen/fsstory.git
cd fsstory
./install.sh # cargo install --path . --locked → ~/.cargo/bin/fsstory
```
## 快速入门
```
# 单个 path 的完整归属 timeline(默认为 JSON)
fsstory path src/main.rs --since 24h
# 仅最新事件 — 一行以 tab 分隔的文本:\t\t
fsstory who-wrote src/main.rs
# 某个 directory 下按 actor 统计的 histogram
fsstory summary --root . --since 7d
```
每个事件都包含时间戳、actor、操作和置信度。当 ctrace 数据不可用时,`fsstory` 依然会通过 `stat` 的 mtime 结合路径启发式规则给出结果,并将这些事件标记为 `confidence: low`,然后正常退出(退出码为 0)——它会优雅降级,而不是抛出错误。
## Actors
它可以赋予的归属信息:
| Actor | 含义 |
|---|---|
| `claude-session::` | 特定的 Claude 工具调用(Edit / Write / NotebookEdit / MCP)。 |
| `claude-bash::` | Bash 工具调用产生的副作用,而非特定的编辑操作。 |
| `user-interactive:` | 没有任何 Claude 祖先进程的交互式编辑器(vim、nvim、code、zed、helix)。 |
| `unknown[:]` | 无法进行归属判定;如果 ctrace 检测到了写入者的 `comm`,则会附带该信息。 |
## 数据源
共有三个数据源,在每次查询时进行关联:ctrace 写入日志(`~/.cache/ctrace/sessions`,可通过 `--ctrace-root` 覆盖)、Claude 会话记录(`~/.claude/projects`,可通过 `--projects-root` 覆盖)以及 `stat` mtime。Pacman 和 journald 被刻意排除在范围之外。
## 契约规定只读
`fsstory` 绝不会写入或修改它读取的任何文件。这一不变性在测试套件中得到了验证:在一次完整的运行过程中,对所有测试夹具(fixture)文件的 mtime 和大小进行了快照对比。
## 适用场景
这是一个适用于单台笔记本电脑的单用户工具——不支持多用户、远程主机或实时流。直接通过 CLI 使用,并间接地被 `/self-review` 的 A 阶段用于信任校准。
## 状态
这三个子命令(`path`、`who-wrote`、`summary`)、四类 actor 归属机制,以及在缺失 ctrace 时的优雅降级功能均已完成,并由集成测试覆盖——在 `tests/` 目录下,每项验收标准都有对应的测试。
## 出处
通过 [`autobuilder`](https://github.com/j0yen/autobuilder) pipeline(PRD → intent-card → scaffold → iterate-and-prove)构建。最初是 [`wintermute`](https://github.com/j0yen/wintermute) monorepo 的一个子目录;本项目是其全新初始化的独立快照。
## 许可证
Apache-2.0 OR MIT,任你选择([LICENSE-APACHE](LICENSE-APACHE), [LICENSE-MIT](LICENSE-MIT))。
标签:AI辅助开发, Rust, 可视化界面, 审计分析, 文件追踪, 文档结构分析, 系统运维, 网络流量审计, 通知系统