Show HN: Wallfacer – Claude Code 及其他工具的终端会话管理器
Show HN: Wallfacer – A terminal session manager for Claude Code, and more

原始链接: https://github.com/pradipta/wallfacer

**Wallfacer** 是一款统一的终端会话管理器,旨在整合跨多个 AI 编码助手(包括 Claude Code、Cursor CLI、Kiro CLI 和 Codex)的对话记录。 由于这些工具将记录存储在碎片化的特定目录中,Wallfacer 会将其索引到本地 SQLite 数据库中,且不会修改原始文件。它提供了一个整洁、可搜索的界面(可通过全屏 TUI 或一系列 CLI 子命令使用),帮助你在不同项目间进行分组、标记、重命名和恢复会话。 **主要功能包括:** * **统一视图:** 在一个列表中访问所有助手的每一个会话。 * **组织管理:** 按项目将会话分组、添加自定义标签并重命名以保持清晰。 * **搜索与恢复:** 通过模糊过滤快速查找会话,并直接从终端恢复进度。 * **安全管理:** 可放心删除会话,因为 Wallfacer 会将文件移至其自身的回收站,而非永久删除。 * **开发者友好:** 提供用于浏览的交互式 TUI 和用于脚本集成的单次执行子命令。 Wallfacer 轻量且可通过插件式适配器进行扩展,可通过 Homebrew 或 Go 安装。它作为一层组织架构,确保你的 AI 开发历史记录始终保持结构化且易于访问。

Pradipta Sarma 发布了 **Wallfacer**,这是一款基于终端的会话管理器,旨在帮助开发者整理并搜索 Claude Code 的会话记录。 该项目的诞生源于在大型代码库中跟踪 AI 编码会话的困难,因为 Claude Code 默认按目录而非上下文来保存会话记录。Wallfacer 作为一个只读覆盖层,能将元数据提取到本地 SQLite 数据库中,使用户无论当前处于哪个工作目录,都能轻松搜索并恢复特定的会话。 Hacker News 上的讨论引发了关于开源开发现状的广泛争论。虽然一些用户称赞该工具对管理复杂的 AI 工作流很有用,但另一些用户则质疑这类“凭感觉编码”(vibe-coded)的微型工具是否导致了生态系统的碎片化。批评者认为,AI 辅助编码的便捷性促使开发者为自己的工作流构建定制化、临时性的解决方案,而不是为协作式的长期工程项目做贡献。此外,一些用户建议,现有的 Claude Code 原生功能或像 `tmux` 这样的工具或许已经能够满足需求,无需专门的管理器。
相关文章

原文
██╗    ██╗█████╗  ██╗     ██╗     ███████╗█████╗   ██████╗███████╗██████╗
██║    ██║██╔══██╗██║     ██║     ██╔════╝██╔══██╗██╔════╝██╔════╝██╔══██╗
██║ █╗ ██║███████║██║     ██║     █████╗  ███████║██║     █████╗  ██████╔╝
██║███╗██║██╔══██║██║     ██║     ██╔══╝  ██╔══██║██║     ██╔══╝  ██╔══██╗
╚███╔███╔╝██║  ██║███████╗███████╗██║     ██║  ██║╚██████╗███████╗██║  ██║
 ╚══╝╚══╝ ╚═╝  ╚═╝╚══════╝╚══════╝╚═╝     ╚═╝  ╚═╝ ╚═════╝╚══════╝╚═╝  ╚═╝

A terminal session manager for Claude Code, Cursor CLI, Kiro CLI and Codex — see every AI coding session you've ever started, then name, tag, group, search, resume, or delete them, from a full-screen browser or straight from the command line.

Build Status Release GitHub Release License

demo

Claude Code stores every conversation as an untitled JSONL file under ~/.claude/projects/, keyed by whatever directory you were in. Kiro CLI does much the same in a single flat ~/.kiro/sessions/cli/ folder, Cursor CLI buries each chat in a hash-named directory under ~/.cursor/chats/, and Codex files its rollouts by date under ~/.codex/sessions/. After a few weeks you have dozens of transcripts, across four agents, that you can't tell apart and no way to find the one you need.

wallfacer indexes them all — read-only, it never touches the agents' files — and keeps your titles, tags, and projects in its own local SQLite database.

  • One view of everything — every session, from every directory and every agent, sorted by recency
  • Organize — rename sessions, tag them, group them into projects
  • Search — across titles, first prompts, directories, projects, and tags
  • Launch & resume — start new sessions or jump back into old ones, from anywhere
  • Multi-agent — Claude Code, Cursor CLI, Kiro CLI and Codex side by side; pick the agent when you start a session, filter by it afterwards
  • Safe deletesrm moves to trash; only --purge is permanent
  • TUI and CLI — a full-screen browser for humans, subcommands + --json for scripts
  • Extensible — agents are pluggable adapters; opencode is on the roadmap

With Homebrew, on macOS or Linux:

brew tap pradipta/wallfacer https://github.com/pradipta/wallfacer
brew install pradipta/wallfacer/wallfacer

The formula lives in this repository instead of a separate homebrew-wallfacer tap, which is the only reason the tap needs its URL spelled out. After that, brew upgrade wallfacer works as usual.

Or with Go:

go install github.com/pradipta/wallfacer@latest

Requires Go 1.22+. Pre-built binaries are on the releases page; building from source is covered in the development guide.

wallfacer is one binary with two front ends, and which one you get depends on whether you pass a subcommand:

You type You get
wallfacer The TUI — a full-screen, interactive session browser. Start here.
wallfacer <command> The CLI — one-shot subcommands for scripts and muscle memory.

They are not separate tools and there is nothing to switch between: both read and write the same SQLite index, so a session you tag in the browser is immediately findable by wallfacer list --tag, and vice versa. Anything the TUI can do, a subcommand can do too.

(If stdout isn't a terminal — wallfacer | less, or inside a script — the bare command prints help instead of opening the browser.)

Open the browser and work from there:

Or drive it from the shell:

wallfacer new ~/work/api --title "Fix flaky auth tests"
wallfacer resume "fix flaky auth tests"    # by title or ID prefix
wallfacer search auth
wallfacer list --project api --json        # for scripts

Bare wallfacer opens a full-screen session browser: a list on the left, and a detail pane on the right showing everything wallfacer show prints for whatever is highlighted.

wallfacer session browser screenshot

Every row shows its project, tags, directory, age and agent — the same metadata wallfacer list prints. Below ~100 columns the detail pane steps aside and the list takes the full width.

Key Action
↑/↓ j/k move
/ fuzzy filter across titles, projects, dirs, tags and agent names
P / T / A cycle the project / tag / agent filter (wraps back to unfiltered)
x clear the project, tag and agent filters
tab show or hide the detail pane
enter resume — the terminal is handed to the agent; the browser returns when you exit
n new session (asks for the agent, then directory, title, project, tags)
r / t / p rename / edit tags / set project
d delete → trash, with confirmation
? / q help / quit

The agent step comes first and is a one-line picker: ←/→ or a digit to choose, enter to go on, esc to back out. Claude Code is preselected, and the step is skipped entirely if only one adapter is registered.

The CLI — wallfacer <command>

Every subcommand is one-shot: it runs, prints, and exits. Same index as the browser.

Command What it does
wallfacer (no subcommand) Open the interactive browser
wallfacer new [dir] [--agent A] [--title T] [--project P] [--tag t] Start a new session in a directory
wallfacer resume <ref> Reopen a session in its original directory
wallfacer list [--project P] [--tag T] [--agent A] [--json] List sessions, newest first; --agent accepts a case-insensitive substring
wallfacer search <query> Search titles, prompts, dirs, projects, tags
wallfacer show <ref> Full details of one session
wallfacer rename <ref> <title> Rename a session
wallfacer tag add|rm <ref> <tag>… Add or remove tags
wallfacer project set|clear <ref> Group sessions into a project
wallfacer rm <ref> [--purge] [-f] Trash a session (--purge deletes permanently)
wallfacer sync Rescan disk (runs automatically before every command)

<ref> is an ID prefix (resume 5f2) or an exact title (resume "smoke test") — ambiguous references list the candidates instead of guessing. Sessions started outside wallfacer are picked up automatically; there's no import step.

wallfacer scans ~/.claude/projects/, ~/.cursor/chats/, ~/.kiro/sessions/cli/ and ~/.codex/sessions/, reading just the head of each session file for its working directory, timestamps, and first prompt (the automatic title). Every agent's listing carries the agent type, so wallfacer list shows an AGENT column and --agent narrows to a case-insensitive substring such as kiro or cursor. Your metadata lives in SQLite at ~/.local/share/wallfacer/ — delete it and you lose only the overlay, never a conversation. Sync is incremental, so it stays fast with hundreds of sessions.

rm moves a session to wallfacer's trash. For agents that spread one session over several files — Kiro CLI writes a transcript plus a metadata sidecar, prompt history and a scratch directory, and Cursor CLI splits a chat between its own directory and a transcript filed under the project — the whole set travels together, so a deleted session doesn't linger in the agent's own session picker.

Once a day the browser asks GitHub whether a newer release exists and, if so, mentions it once on its footer; subcommands repeat that cached answer on stderr, so it never lands in --json output or a pipe. Nothing ever waits for it: the lookup belongs to the browser because it is the front end that outlives a network round trip, and a subcommand only reads the cached answer — a file read, no network — so an update that lands late simply shows up the next time you run wallfacer. The cache lives in the data dir, and WALLFACER_NO_UPDATE_CHECK=1 turns the whole thing off.

Other agents plug in through a small adapter interface — see docs/adding-an-agent.md.

See the development guide for building, testing, and releasing. Contributions welcome — especially new agent adapters.

MIT


The name is borrowed from the Wallfacers of Liu Cixin's The Dark Forest — people entrusted with plans too sprawling for anyone else to follow.

联系我们 contact @ memedata.com