Tools for managing Claude Code conversations and projects
Project description
Claude Code Feedback Extractor
Extract user feedback from Claude Code conversation history for retrospective analysis.
Installation
# Clone repository
git clone <repo-url>
cd claudeutils
# Install with uv
uv tool install .
Usage
Basic Commands
# List all conversation sessions
uv run claudeutils list
# Extract feedback from a specific session (by prefix)
uv run claudeutils extract e12d203f
# Extract to file
uv run claudeutils extract e12d203f --output feedback.json
# Use custom project directory
uv run claudeutils list --project /path/to/project
uv run claudeutils extract abc123 --project /path/to/project
Token Counting
Count tokens in files using the Anthropic API. Requires ANTHROPIC_API_KEY environment
variable.
# Count tokens in a single file
uv run claudeutils tokens sonnet prompt.md
# Count tokens across multiple files
uv run claudeutils tokens opus file1.md file2.md
# JSON output format
uv run claudeutils tokens haiku prompt.md --json
# Use full model ID instead of alias
uv run claudeutils tokens claude-sonnet-4-5-20250929 prompt.md
Supported model aliases:
haiku- Latest Claude Haiku modelsonnet- Latest Claude Sonnet modelopus- Latest Claude Opus model
Aliases automatically resolve to the latest available model version (cached for 24
hours). You can also use full model IDs like claude-sonnet-4-5 or
claude-sonnet-4-5-20250929.
Feedback Processing Pipeline
Process feedback in stages: collect → analyze → rules
# Step 1: Collect feedback from ALL sessions into one file
uv run claudeutils collect --output all_feedback.json
# Step 2: Analyze - filter noise and categorize
uv run claudeutils analyze --input all_feedback.json
# Output: total count, filtered count, category breakdown
# Step 3: Extract rule-worthy items (sorted, deduplicated)
uv run claudeutils rules --input all_feedback.json --format json
# Pipeline with stdin (no intermediate files)
uv run claudeutils collect | uv run claudeutils analyze -
uv run claudeutils collect | uv run claudeutils rules --input -
Categories (from analyze)
- instructions - Directives: "don't", "never", "always", "must", "should"
- corrections - Fixes: "no", "wrong", "incorrect", "fix", "error"
- process - Workflow: "plan", "next step", "workflow", "before", "after"
- code_review - Quality: "review", "refactor", "improve", "clarity"
- preferences - Other substantive feedback
Filtering (automatic)
Noise removed: command output, bash stdout, system messages, short messages (<10 chars)
Rules command applies stricter filters: removes questions ("How..."), long items (>1000 chars), and deduplicates by content prefix.
Features
- Session listing: Display top-level sessions with titles and timestamps
- Prefix matching: Extract sessions by partial UUID prefix (e.g.,
e12d203f) - Recursive extraction: Automatically processes sub-agent sessions
- Trivial filtering: Filters out single-character responses and common keywords
- Token counting: Count tokens in files using Anthropic API with automatic model alias resolution
- Structured output: JSON format with full metadata
- Type-safe: Pydantic validation with strict mypy checking
Data Model
class FeedbackType(StrEnum):
TOOL_DENIAL = "tool_denial" # User denied tool execution
INTERRUPTION = "interruption" # User interrupted agent
MESSAGE = "message" # User message/feedback
class FeedbackItem(BaseModel):
timestamp: str # ISO 8601 format
session_id: str # UUID or agent ID
feedback_type: FeedbackType
content: str # User's message/feedback
agent_id: Optional[str] # If from sub-agent
slug: Optional[str] # Agent session slug
tool_use_id: Optional[str] # For tool denials
Development
# Run full dev cycle (format, check, test)
just dev
# Run tests only
just test
# Run linting and type checking
just check
Project Structure
src/claudeutils/
├── cli.py # CLI entry point
├── models.py # Pydantic models
├── paths.py # Path encoding utilities
├── parsing.py # Content extraction
├── discovery.py # Session/agent discovery
├── extraction.py # Recursive extraction
├── tokens.py # Token counting with Anthropic API
├── tokens_cli.py # Token counting CLI handler
└── exceptions.py # Custom exceptions
tests/
├── test_cli_list.py
├── test_cli_extract_basic.py
├── test_cli_extract_output.py
├── test_cli_tokens.py
├── test_cli_help.py
├── test_discovery.py
├── test_parsing.py
├── test_paths.py
├── test_models.py
├── test_agent_files.py
├── test_extraction.py
├── test_tokens_count.py
├── test_tokens_resolve.py
└── test_tokens_integration.py
Implementation Notes
Built with Test-Driven Development (TDD) across 5 implementation steps:
- Path encoding & session discovery - Project path encoding, session listing
- Trivial message filter - Filter out non-substantive responses
- Message parsing - Extract feedback from conversation history
- Recursive sub-agent processing - Handle nested agent sessions
- CLI subcommands - User-facing interface with argparse
See agents/DESIGN_DECISIONS.md for architectural decisions and implementation
patterns.
Documentation
START.md- Quick start guide for contributorsAGENTS.md- Project overview and coding standardsagents/DESIGN_DECISIONS.md- Architectural and implementation decisionsagents/TEST_DATA.md- Data types and sample entriesagents/ROADMAP.md- Future enhancement ideasagents/code.md- TDD implementation guidelines (skill)agents/commit.md- Git commit standards (skill)
Requirements
- Python 3.14+
- Dependencies: pydantic>=2.0, anthropic, platformdirs
- Dev dependencies: pytest, mypy, ruff
- Optional:
ANTHROPIC_API_KEYenvironment variable (required for token counting)
License
[Add license here]
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file claudeutils-0.0.1.tar.gz.
File metadata
- Download URL: claudeutils-0.0.1.tar.gz
- Upload date:
- Size: 231.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82f27accea50ab460d67515fdef7c47dfbfb55615dbba15ef6c19957951f6002
|
|
| MD5 |
bfa3ffc15421097587cfd85225ff77f6
|
|
| BLAKE2b-256 |
86bd2c2eaf0d823f01b660df94900d71d93cda793df1320d715834809ce10120
|
File details
Details for the file claudeutils-0.0.1-py3-none-any.whl.
File metadata
- Download URL: claudeutils-0.0.1-py3-none-any.whl
- Upload date:
- Size: 19.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c912fdc082c70ad71a2c20198784e46c965c32e5f021f5855e548a3be5d90ab
|
|
| MD5 |
53ae974fa9a368269374ae7aec657c74
|
|
| BLAKE2b-256 |
28c31ce7f8269af19de8dce7894b92f63fb17ba3db829569ea141f978c6ff7e0
|