Phase 7: Polish and CLI tests#16
Conversation
- pyproject.toml with FastMCP, uvicorn, and dev dependencies - Makefile with check, fmt, lint, test, install, uninstall targets - LaunchAgent plist and install/uninstall scripts for auto-start - dev.sh script for development mode with auto-reload - Basic FastMCP server with placeholder tools: - get_status: Returns server status - ingest_logs: Placeholder for log ingestion - query_tool_frequency: Placeholder for frequency queries - Usage guide as MCP resource at session-analytics://guide - Tests for the placeholder tools - README with installation and usage instructions Server runs on port 8081 (to not conflict with event-bus on 8080). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- storage.py with SQLiteStorage class: - Events table with denormalized fields for fast queries - Sessions table for session metadata - Ingestion state tracking for incremental updates - Patterns table for pre-computed insights - Indexes on timestamp, session_id, tool_name, project_path - Data classes: Event, Session, IngestionState, Pattern - CRUD operations for all entities with batch insert support - get_db_stats() for monitoring database health - Updated server.py to use storage for get_status() - Comprehensive test suite (16 tests) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements log file discovery and parsing: - find_log_files(): Discovers JSONL files within date range - parse_tool_use(): Extracts tool info (command, file_path, skill_name) - parse_entry(): Parses entries into Event objects - ingest_file(): Incremental ingestion with mtime/size tracking - ingest_logs(): Full ingestion orchestration - update_session_stats(): Aggregates session statistics Integrates with server.py to provide real data for ingest_logs tool. Closes #3 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements all query MCP tools: - query_tool_frequency: Tool usage counts with project filter - query_timeline: Events in time window with filtering - query_commands: Bash command breakdown with prefix filter - query_sessions: Session metadata and token totals - query_tokens: Token usage grouped by day/session/model Also adds: - ensure_fresh_data(): Auto-refresh mechanism (5 min staleness) - Comprehensive tests for all queries (18 new tests) Closes #4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements pattern detection for /improve-workflow integration: - compute_tool_frequency_patterns(): Tool usage frequency - compute_command_patterns(): Bash command frequency - compute_sequence_patterns(): Tool n-gram detection - compute_permission_gaps(): Commands not in settings.json - get_insights(): Unified insights API for /improve-workflow New MCP tools: - query_sequences: Common tool patterns - query_permission_gaps: Commands needing settings.json - get_insights: Pre-computed patterns Adds 16 new tests (69 total). Closes #5 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds command-line interface for shell access: - session-analytics-cli status: Database stats - session-analytics-cli ingest: Trigger log ingestion - session-analytics-cli frequency: Tool usage counts - session-analytics-cli commands: Bash command breakdown - session-analytics-cli sessions: Session metadata - session-analytics-cli tokens: Token usage by day/session/model - session-analytics-cli sequences: Tool patterns - session-analytics-cli permissions: Commands needing settings.json - session-analytics-cli insights: Pre-computed patterns All commands support --json for machine-readable output. Also updates README with CLI usage documentation. Closes #6 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add comprehensive CLI test coverage (15 tests) - Fix format_output ordering for insights command - Test all CLI commands: status, ingest, frequency, commands, sessions, tokens, sequences, permissions, insights - Test both human-readable and JSON output modes Closes #7 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Pull Request Review: Phase 7 - Polish and CLI TestsSummaryThis PR adds comprehensive CLI test coverage (15 tests) and fixes a bug in ✅ Strengths
🔍 Areas for Improvement1. Error Handling in CLI (Minor)The CLI commands lack exception handling. If the storage initialization or queries fail, users will see raw Python tracebacks instead of friendly error messages. Recommendation: def cmd_status(args):
"""Show database status."""
try:
storage = SQLiteStorage()
stats = storage.get_db_stats()
last_ingest = storage.get_last_ingestion_time()
# ... rest of implementation
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)2. Potential Division by Zero (Minor)In lines.append(f"Size: {data.get('db_size_bytes', 0) / 1024:.1f} KB")While unlikely, if 3. macOS-Only Scripts (Documentation)The LaunchAgent scripts are macOS-specific but this isn't clearly documented in the README. Consider adding a note about platform requirements or providing systemd alternatives for Linux users. Recommendation: ## Platform Support
- **macOS**: Full support with LaunchAgent auto-start
- **Linux**: Manual server start (systemd service coming soon)4. Hardcoded Limits (Minor)The def format_output(data: dict, json_output: bool = False, limit: int = 20) -> str:5. Missing Input Validation (Minor)Arguments like sub.add_argument("--days", type=int, default=7,
help="Days to analyze (default: 7)",
metavar="N",
choices=range(1, 366)) # or use a custom type validator🐛 Potential Bugs1. Insights Ordering Bug Fix ✅The PR description mentions fixing a "format_output ordering bug" where summary check needs to come before sequences. I verified this is correctly implemented in 2. Bash Script Error HandlingIn source .venv/bin/activateIf the venv doesn't exist, this will fail ungracefully. Consider adding: if [ ! -f .venv/bin/activate ]; then
echo "Error: Virtual environment not found. Run 'make dev' first."
exit 1
fi
source .venv/bin/activate📊 Performance Considerations
🧪 Test QualityThe tests are well-written with good coverage:
One suggestion: Consider adding integration tests that verify the full CLI flow (argument parsing → command execution → output), not just the command functions directly. 📝 Code Quality & Style
🎯 Overall AssessmentRating: 9/10 - Excellent work! This PR is production-ready with only minor suggestions for improvement. The bug fix is correct, test coverage is comprehensive, and the code quality is high. The CLI provides a solid interface for both human and programmatic use. ✅ Approval RecommendationI recommend approving and merging this PR. The minor improvements suggested above can be addressed in future PRs as polish items, but they don't block this release. Great job on achieving comprehensive test coverage and maintaining code quality! 🎉 |
- Document all 10 MCP tools with descriptions - Add CLI usage examples for all 9 commands - Include example JSON output for key queries - Document architecture, data model, and integration points - Add development and installation instructions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
PR Review: Phase 7 - Polish and CLI TestsOverviewThis PR adds comprehensive CLI test coverage (15 tests) and fixes a critical bug in the ✅ Strengths1. Bug Fix - Well Identified and Resolved 2. Comprehensive Test Coverage
3. Documentation Quality
4. Code Quality
🔍 Issues & RecommendationsCritical: Missing Test for
|
Summary
format_outputordering bug for insights command (summary check before sequences)Test Plan
Closes #7
🤖 Generated with Claude Code