commits
- Fix all ruff linting errors (28 issues resolved)
- Update type annotations to modern Python syntax (Dict -> dict, List -> list)
- Fix exception handling to use proper chaining (raise ... from err)
- Remove whitespace issues and improve formatting
- Add noqa comments for intentional import patterns
- Format all code with ruff formatter for consistency
- Ensure all Python files compile successfully
All code now passes comprehensive quality checks:
- ✅ Zero ruff linting errors
- ✅ Consistent code formatting
- ✅ Modern type annotations
- ✅ Proper exception handling
- ✅ All files compile successfully
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add username claiming functionality (@mention claim <username>)
- Add schedule query feature (@mention schedule)
- Add configurable RSS polling parameters
- Add botrc configuration file with defaults for bot behavior
- Add persistent storage for bot settings in Zulip
- Add notification system for config changes and username claims
- Create secure template files for bot configuration
- Update .gitignore to exclude secret configuration files
- Add comprehensive setup documentation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Zulip-related dependencies (zulip, zulip-bots, markdownify)
- Extend UserMetadata with ZulipAssociation support
- Add GitStore methods for user feed management
- Update CLI commands module imports
- Comprehensive test coverage for new models
- Documentation updates for bot features
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Complete Zulip bot implementation with debug mode and stream posting
- Dynamic bot name detection instead of hardcoded "@thicket"
- HTML to Markdown conversion with compact summary formatting
- Zulip user association management (add/remove/list commands)
- Rate limiting (5 messages per batch with 5s pause)
- Catchup mode (posts last 5 entries on first run)
- Smart duplicate author detection to avoid redundancy
- Comprehensive error handling and fallback mechanisms
- Bot configuration via chat commands (stream, topic, interval)
- Clean, non-redundant message formatting for feed updates
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create new OPMLGenerator class for exporting feed collections
- Integrate OPML generation into sync command workflow
- Add proper URL validation with pydantic HttpUrl
- Generate index.opml file in git store after successful sync
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Typesense client library for search functionality
- Implement search command for querying indexed content
- Add upload command for publishing data to external services
- Update dependencies with typesense and mypy packages
- Register new commands in CLI module imports
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove textual and flask dependencies from main deps
- Remove coverage options from pytest config
- Add pytest to dev dependency group
- Remove links_cmd and threads_cmd commands
- Update command imports and exports
- Apply code formatting improvements across all files
- Streamline dependency management for CLI-focused tool
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major refactoring of the links system to store links/backlinks directly in entry JSON files
instead of separate metadata. Replaced the old index command with a new threads command
that visualizes conversation threads using both terminal and web interfaces.
Key changes:
- Add links and backlinks fields to AtomEntry model
- Rewrite links command to update individual entry files with extracted URLs
- Implement bidirectional link tracking (outbound links and inbound backlinks)
- Remove old index command and reference_parser module
- Create new threads command with:
- Thread detection using connected components algorithm
- Link type categorization (self/user/external references)
- Textual-based terminal UI for browsing threads
- Flask web server with D3.js force-directed graph visualization
- Enhanced cross-user attraction in force simulation for clearer conversation threads
- Add Flask and textual as dependencies
The web visualization includes user/link filtering, interactive tooltips, drag/zoom support,
and visual emphasis on cross-user conversations through stronger attraction forces and
thicker link lines.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Consolidate references.json, url_mapping.json, and links.json into unified links.json
- Eliminate duplication by storing each URL only once with metadata flags
- Add is_tracked_post flag and target_username to distinguish internal/external links
- Update all commands (links, index, threads, info) to use unified structure
- Maintain all existing functionality while reducing file I/O and complexity
- Update documentation and help text to reflect changes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed links.json structure to map URLs to lists of atom IDs instead of single IDs
- Added proper deduplication to avoid storing duplicate entry IDs for same URL
- Fixed url_mapping.json by converting HttpUrl objects to strings for proper comparison
- Added debug output to show registered URLs count for troubleshooting
- Updated filtering logic to handle new list-based link structure
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit implements a comprehensive link processing and threading system:
- Add thicket.yaml to .gitignore for local configuration
- Implement link extraction command (links_cmd.py) with URL categorization
- Add reference index building (index_cmd.py) for cross-blog threading
- Create info command for detailed entry information
- Add reference_parser.py for link analysis and threading logic
- Enhance CLI with --tsv flag for tab-separated output format
- Update architecture documentation with threading system details
- Expand CLAUDE.md with uv package management instructions
The system now supports email-style threaded views of blog conversations
by tracking cross-references between different blogs and users.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Recreated utils.py with proper UTF-8 encoding
- CLI now runs successfully with uv run -m thicket
- All commands and help text working correctly
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Core Features:
- Modern CLI with Typer + Rich for beautiful terminal output
- Universal feed parser supporting RSS/Atom with auto-discovery
- Git storage system with structured JSON entries
- Duplicate management with manual curation
- Comprehensive test suite with pytest
Components:
- Data models: Pydantic models for config, feeds, users
- Core logic: FeedParser and GitStore classes
- CLI commands: init, add, sync, list, duplicates
- Tests: Complete test coverage for all components
- Documentation: README with usage examples
Architecture:
- src/thicket/ package structure
- Async HTTP with httpx for feed fetching
- HTML sanitization with bleach for security
- Modern Python packaging with pyproject.toml
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Modern Python stack: Typer + Rich + GitPython + feedparser + pydantic
- Feed auto-discovery: extracts user metadata from Atom/RSS feeds
- Duplicate management: manual curation via duplicates.json
- Git store: single branch, permanent history, sanitized filenames
- Cron-friendly: designed for scheduled execution
- Complete data models and CLI command structure
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix all ruff linting errors (28 issues resolved)
- Update type annotations to modern Python syntax (Dict -> dict, List -> list)
- Fix exception handling to use proper chaining (raise ... from err)
- Remove whitespace issues and improve formatting
- Add noqa comments for intentional import patterns
- Format all code with ruff formatter for consistency
- Ensure all Python files compile successfully
All code now passes comprehensive quality checks:
- ✅ Zero ruff linting errors
- ✅ Consistent code formatting
- ✅ Modern type annotations
- ✅ Proper exception handling
- ✅ All files compile successfully
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add username claiming functionality (@mention claim <username>)
- Add schedule query feature (@mention schedule)
- Add configurable RSS polling parameters
- Add botrc configuration file with defaults for bot behavior
- Add persistent storage for bot settings in Zulip
- Add notification system for config changes and username claims
- Create secure template files for bot configuration
- Update .gitignore to exclude secret configuration files
- Add comprehensive setup documentation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Zulip-related dependencies (zulip, zulip-bots, markdownify)
- Extend UserMetadata with ZulipAssociation support
- Add GitStore methods for user feed management
- Update CLI commands module imports
- Comprehensive test coverage for new models
- Documentation updates for bot features
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Complete Zulip bot implementation with debug mode and stream posting
- Dynamic bot name detection instead of hardcoded "@thicket"
- HTML to Markdown conversion with compact summary formatting
- Zulip user association management (add/remove/list commands)
- Rate limiting (5 messages per batch with 5s pause)
- Catchup mode (posts last 5 entries on first run)
- Smart duplicate author detection to avoid redundancy
- Comprehensive error handling and fallback mechanisms
- Bot configuration via chat commands (stream, topic, interval)
- Clean, non-redundant message formatting for feed updates
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create new OPMLGenerator class for exporting feed collections
- Integrate OPML generation into sync command workflow
- Add proper URL validation with pydantic HttpUrl
- Generate index.opml file in git store after successful sync
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Typesense client library for search functionality
- Implement search command for querying indexed content
- Add upload command for publishing data to external services
- Update dependencies with typesense and mypy packages
- Register new commands in CLI module imports
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove textual and flask dependencies from main deps
- Remove coverage options from pytest config
- Add pytest to dev dependency group
- Remove links_cmd and threads_cmd commands
- Update command imports and exports
- Apply code formatting improvements across all files
- Streamline dependency management for CLI-focused tool
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major refactoring of the links system to store links/backlinks directly in entry JSON files
instead of separate metadata. Replaced the old index command with a new threads command
that visualizes conversation threads using both terminal and web interfaces.
Key changes:
- Add links and backlinks fields to AtomEntry model
- Rewrite links command to update individual entry files with extracted URLs
- Implement bidirectional link tracking (outbound links and inbound backlinks)
- Remove old index command and reference_parser module
- Create new threads command with:
- Thread detection using connected components algorithm
- Link type categorization (self/user/external references)
- Textual-based terminal UI for browsing threads
- Flask web server with D3.js force-directed graph visualization
- Enhanced cross-user attraction in force simulation for clearer conversation threads
- Add Flask and textual as dependencies
The web visualization includes user/link filtering, interactive tooltips, drag/zoom support,
and visual emphasis on cross-user conversations through stronger attraction forces and
thicker link lines.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Consolidate references.json, url_mapping.json, and links.json into unified links.json
- Eliminate duplication by storing each URL only once with metadata flags
- Add is_tracked_post flag and target_username to distinguish internal/external links
- Update all commands (links, index, threads, info) to use unified structure
- Maintain all existing functionality while reducing file I/O and complexity
- Update documentation and help text to reflect changes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed links.json structure to map URLs to lists of atom IDs instead of single IDs
- Added proper deduplication to avoid storing duplicate entry IDs for same URL
- Fixed url_mapping.json by converting HttpUrl objects to strings for proper comparison
- Added debug output to show registered URLs count for troubleshooting
- Updated filtering logic to handle new list-based link structure
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit implements a comprehensive link processing and threading system:
- Add thicket.yaml to .gitignore for local configuration
- Implement link extraction command (links_cmd.py) with URL categorization
- Add reference index building (index_cmd.py) for cross-blog threading
- Create info command for detailed entry information
- Add reference_parser.py for link analysis and threading logic
- Enhance CLI with --tsv flag for tab-separated output format
- Update architecture documentation with threading system details
- Expand CLAUDE.md with uv package management instructions
The system now supports email-style threaded views of blog conversations
by tracking cross-references between different blogs and users.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Core Features:
- Modern CLI with Typer + Rich for beautiful terminal output
- Universal feed parser supporting RSS/Atom with auto-discovery
- Git storage system with structured JSON entries
- Duplicate management with manual curation
- Comprehensive test suite with pytest
Components:
- Data models: Pydantic models for config, feeds, users
- Core logic: FeedParser and GitStore classes
- CLI commands: init, add, sync, list, duplicates
- Tests: Complete test coverage for all components
- Documentation: README with usage examples
Architecture:
- src/thicket/ package structure
- Async HTTP with httpx for feed fetching
- HTML sanitization with bleach for security
- Modern Python packaging with pyproject.toml
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Modern Python stack: Typer + Rich + GitPython + feedparser + pydantic
- Feed auto-discovery: extracts user metadata from Atom/RSS feeds
- Duplicate management: manual curation via duplicates.json
- Git store: single branch, permanent history, sanitized filenames
- Cron-friendly: designed for scheduled execution
- Complete data models and CLI command structure
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>