{"id":47665483,"url":"https://github.com/sendbird/ccx","last_synced_at":"2026-04-02T11:55:41.596Z","repository":{"id":346276096,"uuid":"1172828757","full_name":"sendbird/ccx","owner":"sendbird","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-23T23:54:21.000Z","size":5980,"stargazers_count":3,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-24T00:48:32.236Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sendbird.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-04T18:19:46.000Z","updated_at":"2026-03-23T23:48:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sendbird/ccx","commit_stats":null,"previous_names":["sendbird/ccx"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sendbird/ccx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sendbird%2Fccx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sendbird%2Fccx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sendbird%2Fccx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sendbird%2Fccx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sendbird","download_url":"https://codeload.github.com/sendbird/ccx/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sendbird%2Fccx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31305939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T09:48:21.550Z","status":"ssl_error","status_checked_at":"2026-04-02T09:48:19.196Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-02T11:55:40.855Z","updated_at":"2026-04-02T11:55:41.590Z","avatar_url":"https://github.com/sendbird.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ccx — Claude Code Explorer\n\nA terminal UI for browsing, inspecting, and managing [Claude Code](https://docs.anthropic.com/en/docs/claude-code) sessions.\n\nBrowse sessions, read conversations, inspect tool calls, view agent hierarchies, explore configs/plugins, and get aggregated stats — all from your terminal.\n\n![ccx demo](docs/gifs/01-browse.gif)\n\n\u003e More demos: [conversation](docs/DEMOS.md#conversation), [command mode](docs/DEMOS.md#command-mode), [views](docs/DEMOS.md#views), [URL/file actions](docs/DEMOS.md#actions), [sandbox testing](docs/DEMOS.md#sandbox)\n\n## Install\n\n```bash\ngo install github.com/sendbird/ccx@latest\n```\n\nOr build from source:\n\n```bash\ngit clone https://github.com/sendbird/ccx.git\ncd ccx\nmake build      # -\u003e bin/ccx\nmake install    # -\u003e ~/.local/bin/ccx\n```\n\n## Usage\n\n```bash\nccx                        # launch TUI\nccx -view config           # start in config explorer\nccx -view stats            # start in global stats\nccx -view plugins          # start in plugin explorer\nccx -group tree            # start with tree grouping\nccx -preview stats         # start with stats preview open\nccx -search \"is:live\"      # start filtered to live sessions\n```\n\n### CLI Flags\n\n| Flag | Description |\n|------|-------------|\n| `-version`, `-v` | Print version and exit |\n| `-dir PATH` | Claude data directory (default: `~/.claude`) |\n| `-view MODE` | Initial view: `sessions`, `config`, `plugins`, `stats` |\n| `-group MODE` | Initial grouping: `flat`, `proj`, `tree`, `chain`, `fork` |\n| `-preview MODE` | Initial preview: `conv`, `stats`, `mem`, `tasks` |\n| `-search QUERY` | Start with session filter applied |\n| `-tmux` | Enable tmux integration (auto-detected) |\n| `-tmux-auto-live` | Auto-enter live session in same tmux window |\n| `-worktree-dir NAME` | Worktree subdirectory name (default: `.worktree`) |\n\nThe Claude data directory is resolved in order: `--dir` flag → `CLAUDE_CONFIG_DIR` env → `~/.claude`.\n\n## Views\n\n### Session Browser\n\nBrowse all Claude Code sessions across projects, sorted by recency.\n\n- **Live/Busy badges** — see which sessions are actively running\n- **Search** (`/`) — filter by project, branch, prompt, window name, or tags\n- **Group modes** (`G` or `:group:*`):\n  - **Flat** — simple list sorted by time\n  - **Project** — clustered by project path\n  - **Tree** — team hierarchy with leader/teammate nesting\n  - **Chain** — resume-chain grouping (parent → child)\n  - **Fork** — agent-fork grouping\n- **Directory filter** (`g`) — scope to a single project directory\n- **Preview pane** (`Tab` to cycle): conversation, stats, memory, tasks/plan, live\n- **Multi-select** (`Space`) — bulk delete, copy paths, send input\n- **Actions menu** (`x`) — delete, move, resume, copy path, worktree, kill, input, jump, URLs, files\n- **Command mode** (`:`) — vim-style commands with fuzzy suggestions\n\n#### Search Filters\n\n| Filter | Matches |\n|--------|---------|\n| `is:live` | Running Claude process |\n| `is:busy` | Actively responding |\n| `is:wt` | In a git worktree |\n| `is:team` | Part of a team session |\n| `is:fork` | Forked from another session |\n| `has:mem` | Has memory file |\n| `has:todo` | Has todos |\n| `has:task` | Has tasks |\n| `has:plan` | Has plan |\n| `has:agent` | Has subagents |\n| `has:compact` | Uses message compaction |\n| `has:skill` | Used skills |\n| `has:mcp` | Used MCP tools |\n| `team:NAME` | Filter by team name |\n| `win:NAME` | Filter by tmux window name |\n\nPlain text terms match against project path, name, branch, session ID, first prompt, and teammate name. Multiple terms are AND-matched.\n\n### Cross-Session Search\n\nSearch inside conversation content across all sessions (`Ctrl+S` or `:search`).\n\n**Search syntax:**\n- `word1 word2` — AND match (all terms must appear)\n- `\"exact phrase\"` — Exact phrase matching\n- `-exclude` — Exclude terms from results\n- `user:` — Only search user messages\n- `assistant:` — Only search assistant responses\n- `tool:ToolName` — Only search specific tool calls\n\n**Features:**\n- Searches text, tool inputs/outputs, thinking blocks\n- Results stream in real-time as they're found\n- Matched terms are highlighted in snippets\n- Press `Enter` to jump directly to the matching message\n- Press `/` to edit the query\n\n**Example queries:**\n```\ndatabase migration                    # Find both terms\n\"how do I\" API                        # Phrase + term\nuser: error -test                     # User messages with \"error\", excluding \"test\"\nassistant: \"I recommend\" -deprecated  # Complex combination\n```\n\n### Conversation View\n\nDrill into any session to read the full conversation.\n\n- **Split-pane preview** (`Tab`/`→`) — foldable message detail with three detail levels:\n  - **Text** — text blocks only\n  - **Tool** — text + tool blocks, hooks hidden\n  - **Hook** — text + tool blocks + full hook details\n- **Block navigation** (`↑`/`↓`) — navigate text, tool calls, and results\n- **Fold/unfold** (`←`/`→`, `f`/`F`) — collapse/expand content blocks\n- **System tag folding** — `\u003csystem-reminder\u003e`, `\u003ctask-notification\u003e`, `\u003cavailable-deferred-tools\u003e`, etc. are folded by default, expandable on demand\n- **Block filter** (`/`) — filter by `is:tool`, `is:hook`, `is:error`, `is:skill`, `tool:Name`\n- **Subagent drill-down** (`Enter` on agent) — recursive navigation into sub-sessions with back-stack\n- **Side-question context** — background context from parent sessions is collapsed into a summary; only the actual question/answer is shown\n- **Full conversation** (`c`) — scrollable concatenated view with search (`/`) and copy mode\n- **Live tail** (`L`) — auto-follow active sessions in real-time\n- **Send input** (`I`) — send text to running Claude via tmux\n- **Jump to pane** (`J`) — switch to the tmux pane running the session\n\n#### Subagent Support\n\nSubagents are displayed inline in the conversation with type badges:\n\n| Type | Badge | Source |\n|------|-------|--------|\n| `aside_question` | `?` `:btw` | Side-question (background Q\u0026A) |\n| `Explore` | `⊕ Explore` | Codebase exploration agent |\n| `general-purpose` | `⊕ general-purpose` | Default agent |\n| Custom types | `⊕ {type}` | From `agent-*.meta.json` |\n\nAgent type detection: reads `agent-{id}.meta.json` (preferred) or parses type from filename `agent-{type}-{hash}.jsonl`. Auto-compaction files (`agent-acompact-*.jsonl`) are excluded.\n\nTimestamp ordering uses the **last message** in the subagent file (most recent activity), not the first.\n\n### Detail View\n\nFull-screen message viewer with block-level navigation.\n\n- **Block cursor** (`↑`/`↓`) — navigate between blocks\n- **Fold/unfold** (`←`/`→`, `f`/`F`) — collapse/expand blocks\n- **Message navigation** (`n`/`N`) — step through messages\n- **Copy mode** (`v`) — line-by-line selection with anchor/cursor, vim-style navigation\n- **Clipboard** (`y`) — copy selected text/blocks to system clipboard\n- **Pager** (`o`) — open in external pager\n\n### Global Stats (`v` → `s`)\n\nAggregated metrics across all sessions with detail drill-down.\n\n- **Overview** — total sessions, messages, tokens, duration, cost\n- **Tools** (`p` → `t`) — built-in tool usage with timeline sparklines\n- **MCP Tools** (`p` → `m`) — MCP tool usage with error tracking\n- **Agents** (`p` → `a`) — agent type breakdown (Explore, general-purpose, etc.)\n- **Skills** (`p` → `s`) — skill usage with per-skill error counts\n- **Commands** (`p` → `c`) — command usage with per-command error counts\n- **Errors** (`p` → `e`) — error breakdown by tool/skill/command category\n\nMetrics tracked per session: token usage (input/output/cache per model), code activity (write/edit/read/bash counts), files touched, tool call timelines, message timing gaps, model switches, compaction events, hook invocations, and turns per request.\n\n### Config Explorer (`v` → `c`)\n\nBrowse and manage all Claude Code configuration files.\n\n- **Category filter** (`Tab`) — global, project, local, skills, agents, commands, MCP, hooks, enterprise\n- **Split preview** — file content with syntax awareness\n- **Multi-select** (`Space`) — select configs for testing\n- **Test env** (`t`) — launch isolated Claude session with only selected configs\n- **Edit** (`e` / `Enter`) — open in `$EDITOR`\n- **Actions menu** (`x`) — edit, copy path, open shell at path\n\nCategories discovered:\n- **Global** — `~/.claude/CLAUDE.md` + memory, contexts, rules (with `@reference` walking)\n- **Project** — project-level `CLAUDE.md` + memory from `projects/{encoded}/memory/`\n- **Local** — parent CLAUDE.md files found by walking up from project directory\n- **Skills/Agents/Commands** — plugin component configs\n- **MCP** — MCP server configurations\n- **Hooks** — hook definitions\n- **Enterprise** — managed enterprise settings\n\n#### Config Test Environment\n\nThe test environment (`t` key) creates an isolated Claude Code session with only the selected configs active:\n\n1. Creates a temporary `HOME` directory\n2. Symlinks only the selected memory/config files\n3. Preserves editor config (`.config/`, shell dotfiles)\n4. Extracts OAuth credentials from macOS keychain for connector MCP access\n5. Launches `claude` with the isolated environment\n6. Supports git worktree detection\n\nThis lets you test specific config combinations without affecting your main setup.\n\n### Plugin Explorer (`v` → `p`)\n\nBrowse installed Claude Code plugins and their components.\n\n- **Component drill-down** (`Enter`) — view plugin agents, skills, commands, hooks, MCP servers\n- **Multi-select** (`Space`) — select components for batch editing\n- **Edit** (`e`) — open component files in `$EDITOR`\n- **Actions menu** (`x`) — edit, copy path, open shell\n- **Component badges** — e.g. `[3a 2s 1c]` = 3 agents, 2 skills, 1 command\n- **Status badges** — DISABLED, BLOCKED (with reasons from blocklist)\n\nPlugin discovery reads from:\n- `installed_plugins.json` — install paths and versions\n- `blocklist.json` — blocked plugins with reasons\n- `known_marketplaces.json` — marketplace metadata (git/github sources)\n- `settings.json` — `enabledPlugins` list\n- `.claude-plugin/` — component directories per plugin\n\nComponent types: agents (`.md`), skills (`.md`), commands (`.md`), hooks (`.py`/`.sh`), MCP servers (`.json`), LSP servers, scripts, settings, memory, references.\n\n#### Plugin Test Environment\n\nMulti-select plugin components and press `t` to launch an isolated Claude session with only the selected plugins active. Uses the same isolated HOME mechanism as the config test environment.\n\n## Keybindings\n\n### Sessions\n\n| Key | Action |\n|-----|--------|\n| `Enter` | Open conversation view |\n| `/` | Search/filter sessions |\n| `g` | Filter by project directory |\n| `G` | Cycle group mode |\n| `Tab` | Cycle preview mode |\n| `Shift+Tab` | Reverse cycle preview |\n| `→` | Open/focus preview |\n| `←` | Close/unfocus preview |\n| `[` / `]` | Adjust split ratio |\n| `Space` | Multi-select toggle |\n| `x` | Actions menu (delete, move, resume, URLs, files, ...) |\n| `v` | Views menu (stats/config/plugins) |\n| `:` | Command mode |\n| `Ctrl+S` | Cross-session search |\n| `L` | Live preview (tmux) |\n| `I` | Send input to live session |\n| `J` | Jump to tmux pane |\n| `R` | Refresh |\n| `S` | Global stats |\n| `?` | Help |\n| `q` | Quit |\n\n### Conversation\n\n| Key | Action |\n|-----|--------|\n| `Enter` | Open detail / drill into agent |\n| `c` | Full conversation view |\n| `/` | Filter blocks |\n| `Tab` | Cycle preview detail (text/tool/hook) |\n| `↑` / `↓` | Navigate messages/blocks |\n| `←` / `→` | Fold/unfold blocks |\n| `f` / `F` | Fold/unfold all |\n| `[` / `]` | Adjust split ratio |\n| `L` | Toggle live tail |\n| `I` | Send input |\n| `J` | Jump to pane |\n| `x` | Actions menu (URLs, files) |\n| `e` | Edit menu (session/agent JSONL, text export) |\n| `u` | URL extraction (scoped to message/session) |\n| `R` | Refresh |\n| `Esc` | Back to sessions / close preview |\n\n### Detail View\n\n| Key | Action |\n|-----|--------|\n| `↑` / `↓` | Navigate blocks |\n| `←` / `→` | Fold/unfold block |\n| `f` / `F` | Fold/unfold all |\n| `n` / `N` | Next/prev message |\n| `v` | Copy mode |\n| `y` | Copy to clipboard |\n| `x` | Actions menu (URLs, files) |\n| `o` | Open in pager |\n\n### Command Mode (`:`)\n\nAvailable from any view. Suggestions are context-aware — only relevant commands appear.\n\n| Command | View | Action |\n|---------|------|--------|\n| `view:sessions` | All | Switch to session browser |\n| `view:stats` | All | Open global stats |\n| `view:stats:tools` | All | Stats → tools detail |\n| `view:config` | All | Open config explorer |\n| `view:config:hooks` | All | Config → hooks filter |\n| `view:plugins` | All | Open plugin explorer |\n| `group:flat\\|proj\\|tree\\|chain\\|fork` | Sessions | Change grouping mode |\n| `preview:conv\\|stats\\|mem\\|tasks\\|live` | Sessions | Change preview mode |\n| `set:ratio N` | Sessions | Set split pane ratio (15-85) |\n| `page:memory\\|hooks\\|mcp\\|skills\\|...` | Config | Filter config category |\n| `page:tools\\|errors\\|overview` | Stats | Switch stats page |\n| `refresh` | Sessions | Reload sessions |\n| `search` | All | Cross-session content search |\n| `keymap:edit` | All | Edit keymap config |\n\nShort aliases: `g:flat`, `v:stats`, `p:hooks`, `km:edit`. Multi-command: `view:config page:hooks`.\n\n### Conversation / Detail\n\n| Key | Action |\n|-----|--------|\n| `x` | Actions menu (URLs, files) |\n| `e` | Edit menu (session, agent, text export) |\n\n### Global\n\n| Key | Action |\n|-----|--------|\n| `Esc` | Go back / close |\n| `q` | Quit |\n\n## Configuration\n\nKeymap config: `~/.config/ccx/config.yaml` (bootstrap with `:keymap:edit`)\n\n## Development\n\n### Build\n\n```bash\nmake build      # build binary → bin/ccx\nmake run        # build + run\nmake install    # build + install to ~/.local/bin/ccx\nmake test       # run all tests\nmake vet        # go vet\nmake tidy       # go mod tidy\nmake clean      # remove build artifacts\n```\n\nVersion is injected via `-ldflags` from `git describe --tags --always --dirty`.\n\n### Debug\n\n```bash\nCCX_DEBUG=1 ccx    # enables debug logging to /tmp/ccx-debug.log\n```\n\n### Recording Demo GIFs\n\n```bash\n# Prerequisites: brew install asciinema agg\n./docs/record-demos.sh all       # record all 6 demos\n./docs/record-demos.sh browse    # record just one\n```\n\nUses tmux + asciinema + agg for fully automated terminal recording.\n\n### Testing\n\n```bash\ngo test ./internal/...                                    # run all tests\ngo test ./internal/tui/ -run TestRender                   # run render snapshot tests\nUPDATE_GOLDEN=1 go test ./internal/tui/ -run TestRender   # regenerate golden files\ngo test ./internal/session/ -run TestSplit                 # run system tag tests\ngo test -v ./internal/tui/ -run TestConv                  # verbose conversation UX tests\n```\n\n#### Test Patterns\n\n**Pure function tests** — parser, merge, filter, fold logic:\n- `internal/session/parser_test.go` — JSONL parsing, content blocks, timestamps\n- `internal/session/systemtag_test.go` — XML tag splitting, system tag detection\n- `internal/tui/merge_test.go` — conversation merging, context filtering, fold defaults\n- `internal/tui/blockfilter_test.go` — block filter parsing and matching\n\n**State machine tests** — TUI interactions via `setupConvApp` + `pressKey`:\n- `internal/tui/conversation_ux_test.go` — preview updates, live tail, resize, fold state\n- `internal/tui/cmdmode_test.go` — command mode parsing and execution\n- `internal/tui/resize_test.go` — resize preservation of fold/scroll/cursor state\n\n**Golden file snapshot tests** — render output captured to `testdata/*.golden`:\n- `internal/tui/render_test.go` — message rendering with system tags, tools, block cursor\n- Regenerate with `UPDATE_GOLDEN=1`\n\n**Integration tests** — config/plugin discovery with temp directories:\n- `internal/session/config_test.go` — config file scanning\n- `internal/session/plugin_test.go` — plugin and marketplace discovery\n- `internal/tui/config_test.go` — config explorer UI\n- `internal/tui/plugins_test.go` — plugin explorer UI\n\n### Benchmarks\n\n```bash\ngo run ./cmd/bench    # run performance benchmarks\n```\n\n### Project Structure\n\n```\ncmd/bench/              benchmark tool\ninternal/\n  session/              JSONL parsing, scanning, models, stats, config/plugin discovery\n  tui/                  Bubble Tea UI (app, sessions, conversation, messages, stats, config, plugins)\n  tmux/                 tmux integration (live detection, pane capture, input)\n  extract/              URL and file path extraction from sessions\n```\n\n## How It Works\n\nccx reads Claude Code's session files from `~/.claude/projects/`. Each session is a JSONL file containing the full conversation history — user prompts, assistant responses, tool calls, and results. Subagent sessions live under `{sessionID}/subagents/agent-*.jsonl` with optional `*.meta.json` for type metadata.\n\nSession metadata is cached to `~/.claude/sessions.gob` for instant startup (~1ms). A full async scan runs in the background to pick up new sessions.\n\nThe TUI is built with [Bubble Tea](https://github.com/charmbracelet/bubbletea) and [Lip Gloss](https://github.com/charmbracelet/lipgloss).\n\n## Requirements\n\n- Go 1.25+\n- Claude Code sessions in `~/.claude/projects/`\n- tmux (optional, for live session features)\n\n## License\n\nApache License 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsendbird%2Fccx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsendbird%2Fccx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsendbird%2Fccx/lists"}