This commit implements the package structure refactoring as outlined in phase1.md (Task 1A.1). Key changes include: - Reorganized packages into `pkg/garmin` for public API and `internal/` for internal implementations. - Updated all import paths to reflect the new structure. - Consolidated types and client logic into their respective new packages. - Updated `cmd/garth/main.go` to use the new public API. - Fixed various compilation and test issues encountered during the refactoring process. - Converted `internal/api/client/auth_test.go` to a functional test. This establishes a solid foundation for future enhancements and improves maintainability.
14 KiB
Phase 1: Core Functionality Implementation Plan
Duration: 2-3 weeks
Goal: Establish solid foundation with enhanced CLI and core missing features
Overview
Phase 1 focuses on building the essential functionality that users need immediately while establishing the foundation for future enhancements. This phase prioritizes user-facing features and basic API improvements.
Subphase 1A: Package Reorganization & CLI Foundation (Days 1-3)
Objectives
- Restructure packages for better maintainability
- Set up cobra-based CLI framework
- Establish consistent naming conventions
Tasks
1A.1: Package Structure Refactoring
Duration: 1 day
Current Structure → New Structure
garth/ pkg/garmin/
├── client/ ├── client.go # Main client interface
├── data/ ├── activities.go # Activity operations
├── stats/ ├── health.go # Health data operations
├── sso/ ├── stats.go # Statistics operations
├── oauth/ ├── auth.go # Authentication
└── ... └── types.go # Public types
internal/
├── api/ # Low-level API client
├── auth/ # Auth implementation
├── data/ # Data processing
└── utils/ # Internal utilities
cmd/garth/
├── main.go # CLI entry point
├── root.go # Root command
├── auth.go # Auth commands
├── activities.go # Activity commands
├── health.go # Health commands
└── stats.go # Stats commands
Deliverables:
- New package structure implemented
- All imports updated
- No breaking changes to existing functionality
- Package documentation updated
1A.2: CLI Framework Setup
Duration: 1 day
// cmd/garth/root.go
var rootCmd = &cobra.Command{
Use: "garth",
Short: "Garmin Connect CLI tool",
Long: `A comprehensive CLI tool for interacting with Garmin Connect`,
}
// Global flags
var (
configFile string
outputFormat string // json, table, csv
verbose bool
dateFrom string
dateTo string
)
Tasks:
- Install and configure cobra
- Create root command with global flags
- Implement configuration file loading
- Add output formatting infrastructure
- Create help text and usage examples
Deliverables:
- Working CLI framework with
garth --help - Configuration file support
- Output formatting (JSON, table, CSV)
1A.3: Configuration Management
Duration: 1 day
// internal/config/config.go
type Config struct {
Auth struct {
Email string `yaml:"email"`
Domain string `yaml:"domain"`
Session string `yaml:"session_file"`
} `yaml:"auth"`
Output struct {
Format string `yaml:"format"`
File string `yaml:"file"`
} `yaml:"output"`
Cache struct {
Enabled bool `yaml:"enabled"`
TTL string `yaml:"ttl"`
Dir string `yaml:"dir"`
} `yaml:"cache"`
}
Tasks:
- Design configuration schema
- Implement config file loading/saving
- Add environment variable support
- Create config validation
- Add config commands (
garth config init,garth config show)
Deliverables:
- Configuration system working
- Default config file created
- Config commands implemented
Subphase 1B: Enhanced CLI Commands (Days 4-7)
Objectives
- Implement all major CLI commands
- Add interactive features
- Ensure consistent user experience
Tasks
1B.1: Authentication Commands
Duration: 1 day
# Target CLI interface
garth auth login # Interactive login
garth auth login --email user@example.com --password-stdin
garth auth logout # Clear session
garth auth status # Show auth status
garth auth refresh # Refresh tokens
// cmd/garth/auth.go
var authCmd = &cobra.Command{
Use: "auth",
Short: "Authentication management",
}
var loginCmd = &cobra.Command{
Use: "login",
Short: "Login to Garmin Connect",
RunE: runLogin,
}
Tasks:
- Implement
auth loginwith interactive prompts - Add
auth logoutfunctionality - Create
auth statuscommand - Implement secure password input
- Add MFA support (prepare for future)
- Session validation and refresh
Deliverables:
- All auth commands working
- Secure credential handling
- Session persistence working
1B.2: Activity Commands
Duration: 2 days
# Target CLI interface
garth activities list # Recent activities
garth activities list --limit 50 --type running
garth activities get 12345678 # Activity details
garth activities download 12345678 --format gpx
garth activities search --query "morning run"
// pkg/garmin/activities.go
type ActivityOptions struct {
Limit int
Offset int
ActivityType string
DateFrom time.Time
DateTo time.Time
}
type ActivityDetail struct {
BasicInfo Activity
Summary ActivitySummary
Laps []Lap
Metrics []Metric
}
Tasks:
- Enhanced activity listing with filters
- Activity detail fetching
- Search functionality
- Table formatting for activity lists
- Activity download preparation (basic structure)
- Date range filtering
- Activity type filtering
Deliverables:
activities listwith all filtering optionsactivities getshowing detailed infoactivities searchfunctionality- Proper error handling and user feedback
1B.3: Health Data Commands
Duration: 2 days
# Target CLI interface
garth health sleep --from 2024-01-01 --to 2024-01-07
garth health hrv --days 30
garth health stress --week
garth health bodybattery --yesterday
Tasks:
- Implement all health data commands
- Add date range parsing utilities
- Create consistent output formatting
- Add data aggregation options
- Implement caching for expensive operations
- Error handling for missing data
Deliverables:
- All health commands working
- Consistent date filtering across commands
- Proper data formatting and display
1B.4: Statistics Commands
Duration: 1 day
# Target CLI interface
garth stats steps --month
garth stats distance --year
garth stats calories --from 2024-01-01
Tasks:
- Implement statistics commands
- Add aggregation periods (day, week, month, year)
- Create summary statistics
- Add trend analysis
- Implement data export options
Deliverables:
- All stats commands working
- Multiple aggregation options
- Export functionality
Subphase 1C: Activity Download Implementation (Days 8-12)
Objectives
- Implement activity file downloading
- Support multiple formats (GPX, TCX, FIT)
- Add batch download capabilities
Tasks
1C.1: Core Download Infrastructure
Duration: 2 days
// pkg/garmin/activities.go
type DownloadOptions struct {
Format string // "gpx", "tcx", "fit", "csv"
Original bool // Download original uploaded file
OutputDir string
Filename string
}
func (c *Client) DownloadActivity(id string, opts *DownloadOptions) error {
// Implementation
}
Tasks:
- Research Garmin's download endpoints
- Implement format detection and conversion
- Add file writing with proper naming
- Implement progress indication
- Add download validation
- Error handling for failed downloads
Deliverables:
- Working download for at least GPX format
- Progress indication during download
- Proper error handling
1C.2: Multi-Format Support
Duration: 2 days
Tasks:
- Implement TCX format download
- Implement FIT format download (if available)
- Add CSV export for activity summaries
- Format validation and conversion
- Add format-specific options
Deliverables:
- Support for GPX, TCX, and CSV formats
- Format auto-detection
- Format-specific download options
1C.3: Batch Download Features
Duration: 1 day
# Target functionality
garth activities download --all --type running --format gpx
garth activities download --from 2024-01-01 --to 2024-01-31
Tasks:
- Implement batch download with filtering
- Add parallel download support
- Progress bars for multiple downloads
- Resume interrupted downloads
- Duplicate detection and handling
Deliverables:
- Batch download working
- Parallel processing implemented
- Resume capability
Subphase 1D: Missing Health Data Types (Days 13-15)
Objectives
- Implement VO2 max data fetching
- Add heart rate zones
- Complete missing health metrics
Tasks
1D.1: VO2 Max Implementation
Duration: 1 day
// pkg/garmin/health.go
type VO2MaxData struct {
Running *VO2MaxReading `json:"running"`
Cycling *VO2MaxReading `json:"cycling"`
Updated time.Time `json:"updated"`
History []VO2MaxHistory `json:"history"`
}
type VO2MaxReading struct {
Value float64 `json:"value"`
UpdatedAt time.Time `json:"updated_at"`
Source string `json:"source"`
Confidence string `json:"confidence"`
}
Tasks:
- Research VO2 max API endpoints
- Implement data fetching
- Add historical data support
- Create CLI command
- Add data validation
- Format output appropriately
Deliverables:
garth health vo2maxcommand working- Historical data support
- Both running and cycling metrics
1D.2: Heart Rate Zones
Duration: 1 day
type HeartRateZones struct {
RestingHR int `json:"resting_hr"`
MaxHR int `json:"max_hr"`
LactateThreshold int `json:"lactate_threshold"`
Zones []HRZone `json:"zones"`
UpdatedAt time.Time `json:"updated_at"`
}
type HRZone struct {
Zone int `json:"zone"`
MinBPM int `json:"min_bpm"`
MaxBPM int `json:"max_bpm"`
Name string `json:"name"`
}
Tasks:
- Implement HR zones API calls
- Add zone calculation logic
- Create CLI command
- Add zone analysis features
- Implement zone updates (if possible)
Deliverables:
garth health hr-zonescommand- Zone calculation and display
- Integration with other health metrics
1D.3: Additional Health Metrics
Duration: 1 day
type WellnessData struct {
Date time.Time `json:"date"`
RestingHR *int `json:"resting_hr"`
Weight *float64 `json:"weight"`
BodyFat *float64 `json:"body_fat"`
BMI *float64 `json:"bmi"`
BodyWater *float64 `json:"body_water"`
BoneMass *float64 `json:"bone_mass"`
MuscleMass *float64 `json:"muscle_mass"`
}
Tasks:
- Research additional wellness endpoints
- Implement body composition data
- Add resting heart rate trends
- Create comprehensive wellness command
- Add data correlation features
Deliverables:
- Additional health metrics available
- Wellness overview command
- Data trend analysis
Phase 1 Testing & Quality Assurance (Days 14-15)
Tasks
Integration Testing
- End-to-end CLI testing
- Authentication flow testing
- Data fetching validation
- Error handling verification
Documentation
- Update README with new CLI commands
- Add usage examples
- Document configuration options
- Create troubleshooting guide
Performance Testing
- Concurrent operation testing
- Memory usage validation
- Download performance testing
- Large dataset handling
Phase 1 Deliverables Checklist
CLI Tool
- Complete CLI with all major commands
- Configuration file support
- Multiple output formats (JSON, table, CSV)
- Interactive authentication
- Progress indicators for long operations
Core Functionality
- Activity listing with filtering
- Activity detail fetching
- Activity downloading (GPX, TCX, CSV)
- All existing health data accessible via CLI
- VO2 max and heart rate zone data
Code Quality
- Reorganized package structure
- Consistent error handling
- Comprehensive logging
- Basic test coverage (>60%)
- Documentation updated
User Experience
- Intuitive command structure
- Helpful error messages
- Progress feedback
- Consistent data formatting
- Working examples and documentation
Success Criteria
- CLI Completeness: All major Garmin data types accessible via CLI
- Usability: New users can get started within 5 minutes
- Reliability: Commands work consistently without errors
- Performance: Downloads and data fetching perform well
- Documentation: Clear examples and troubleshooting available
Risks & Mitigations
| Risk | Impact | Mitigation |
|---|---|---|
| API endpoint changes | High | Create abstraction layer, add endpoint validation |
| Authentication issues | High | Implement robust error handling and retry logic |
| Download format limitations | Medium | Start with GPX, add others incrementally |
| Performance with large datasets | Medium | Implement pagination and caching |
| Package reorganization complexity | Medium | Do incrementally with thorough testing |
Dependencies
- Cobra CLI framework
- Garmin Connect API stability
- OAuth flow reliability
- File system permissions for downloads
- Network connectivity for API calls
This phase establishes the foundation for all subsequent development while delivering immediate value to users through a comprehensive CLI tool.