- Added context-aware server initialization in cmd/server/main.go - Implemented graceful shutdown handling with SIGINT/SIGTERM signals - Added 30-second shutdown timeout for active connections - Updated Greet service to use context.Context as first parameter - Enhanced Zerolog integration with Trace level logging - Added context-aware logging in Greet function calls - Fixed route structure to use /api/v1/greet/* prefix - Updated all handlers and tests to use context - Comprehensive AGENTS.md documentation with verified commands - Added server context management architecture section - Updated API endpoint documentation with working examples Changes: - cmd/server/main.go: Complete rewrite with context and graceful shutdown - pkg/greet/greet.go: Added context parameter and trace logging - pkg/greet/api_v1.go: Updated interface and handlers for context - pkg/greet/greet_test.go: Updated tests to use context - cmd/greet/main.go: Updated CLI to use context - pkg/server/server.go: Trace level config and context logging - AGENTS.md: Comprehensive documentation update - go.mod/go.sum: Added Zerolog dependency All tests passing, server working with graceful shutdown verified.
11 KiB
11 KiB
DanceLessonsCoach - AI Agent Documentation
This file documents the AI agents, tools, and development workflow for the DanceLessonsCoach project.
🎯 Project Overview
DanceLessonsCoach is a Go-based web service with CLI capabilities, featuring:
- RESTful JSON API with Chi router
- High-performance Zerolog logging
- Interface-based architecture
- Context-aware services
- Comprehensive testing
📋 Development Timeline
Phase 1: Foundation (Completed ✅)
- Go 1.26.1 environment setup
- Project structure with
cmd/andpkg/directories - Core Greet service implementation
- CLI interface
- Unit tests
Phase 2: Web API (Completed ✅)
- Chi router integration
- Versioned API endpoints (
/api/v1) - Health endpoint (
/api/health) - JSON responses with proper headers
Phase 3: Logging & Architecture (Completed ✅)
- Zerolog integration with Trace level
- Context-aware logging
- Interface-based design patterns
- Dependency injection
Phase 4: Documentation & Testing (Completed ✅)
- Comprehensive AGENTS.md
- README.md with usage instructions
- Server management guide
- API endpoint documentation
🛠️ Tools & Technologies
| Component | Technology | Version |
|---|---|---|
| Language | Go | 1.26.1 |
| Router | Chi | v5.2.5 |
| Logging | Zerolog | v1.35.0 |
| Testing | Standard Library | - |
| Dependency Management | Go Modules | - |
🗺️ Project Structure
DanceLessonsCoach/
├── cmd/
│ ├── greet/ # CLI application
│ │ └── main.go
│ └── server/ # Web server
│ └── main.go
├── pkg/
│ ├── greet/ # Core domain logic
│ │ ├── api_v1.go # API handlers
│ │ ├── greet.go # Service implementation
│ │ └── greet_test.go # Unit tests
│ └── server/ # HTTP server
│ └── server.go
├── go.mod # Dependencies
├── go.sum # Dependency checksums
├── README.md # User documentation
├── AGENTS.md # This file
└── .gitignore # Ignore patterns
🚀 Server Management
Starting the Server
# Navigate to project directory
cd /Users/gabrielradureau/Work/Vibe/DanceLessonsCoach
# Run server in background
go run cmd/server/main.go &
Expected output:
Server running on :8080
[INF] Starting HTTP server on :8080
[TRC] Registering greet routes
[TRC] Greet routes registered
Features:
- Context-aware server initialization
- Graceful shutdown handling
- Signal-based termination (SIGINT, SIGTERM)
- 30-second shutdown timeout
- Proper resource cleanup
Checking Server Status
# Check health endpoint
curl -s http://localhost:8080/api/health
Expected response: {"status":"healthy"}
Stopping the Server
To stop the server gracefully:
# Send SIGTERM for graceful shutdown
pkill -TERM -f "go run"
# Or send SIGINT (Ctrl+C equivalent)
pkill -INT -f "go run"
Graceful shutdown process:
- Server receives termination signal
- Logs shutdown message
- Stops accepting new connections
- Waits up to 30 seconds for active requests to complete
- Closes all connections cleanly
- Exits with proper cleanup
For force stop (if graceful shutdown hangs):
pkill -f "go"
Verification:
curl -s http://localhost:8080/api/health
# Should return connection refused
🌐 API Endpoints
Base URL
http://localhost:8080
Health Check
GET /api/health
Response:
{"status":"healthy"}
Greet Service
GET /api/v1/greet/
GET /api/v1/greet/{name}
Examples:
# Default greeting
curl http://localhost:8080/api/v1/greet/
# Response: {"message":"Hello world!"}
# Personalized greeting
curl http://localhost:8080/api/v1/greet/John
# Response: {"message":"Hello John!"}
# Another example
curl http://localhost:8080/api/v1/greet/Alice
# Response: {"message":"Hello Alice!"}
🔧 Development Workflow
1. Check Server Status
curl -s http://localhost:8080/api/health
2. Start Development Server
cd /Users/gabrielradureau/Work/Vibe/DanceLessonsCoach
go run cmd/server/main.go &
3. Test API Endpoints
# Test all endpoints as shown above
curl http://localhost:8080/api/v1/greet/YourName
4. Run Tests
# Run all tests
go test ./...
# Run specific package
go test ./pkg/greet/
5. Make Changes
- Edit source files in
pkg/orcmd/ - Follow existing patterns and interfaces
- Add tests for new functionality
6. Stop and Restart
pkill -f "go"
go run cmd/server/main.go &
🧪 Testing
Unit Tests
# Run all tests
go test ./...
# Run with verbose output
go test -v ./...
# Run specific test
go test ./pkg/greet/ -run TestService_Greet
CLI Testing
# Default greeting
go run ./cmd/greet
# Output: Hello world!
# Personalized greeting
go run ./cmd/greet John
# Output: Hello John!
API Testing
# Health check
curl http://localhost:8080/api/health
# Greet endpoints
curl http://localhost:8080/api/v1/greet/John
curl http://localhost:8080/api/v1/greet/
📝 Architecture Decisions
Interface-Based Design
type Greeter interface {
Greet(ctx context.Context, name string) string
}
Benefits:
- Easy mocking for tests
- Dependency injection
- Multiple implementations
- Clear contracts
Context-Aware Services
func (s *Service) Greet(ctx context.Context, name string) string {
log.Trace().Ctx(ctx).Str("name", name).Msg("Greet function called")
// ...
}
Benefits:
- Request tracing
- Cancellation support
- Deadline propagation
- Metadata passing
Server Context Management
// Root context with cancellation
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Server context with graceful shutdown
serverCtx, serverStop := context.WithCancel(ctx)
// HTTP server with context-aware shutdown
srv := &http.Server{
Addr: ":8080",
Handler: server.Router(),
}
// Graceful shutdown with timeout
shutdownCtx, shutdownCancel := context.WithTimeout(
context.Background(),
30*time.Second
)
defer shutdownCancel()
if err := srv.Shutdown(shutdownCtx); err != nil {
log.Error().Err(err).Msg("Server shutdown failed")
}
Benefits:
- Graceful shutdown handling
- Signal-based termination (SIGINT, SIGTERM)
- 30-second timeout for active connections
- Proper resource cleanup
- Context propagation throughout server lifecycle
Zerolog Logging
zerolog.SetGlobalLevel(zerolog.TraceLevel)
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
Benefits:
- High performance
- Structured logging
- Trace level detail
- Color output
Versioned API
router.Route("/api/v1", func(r chi.Router) {
// v1 endpoints
})
Benefits:
- Backward compatibility
- Clear versioning
- Easy migration
- Parallel versions
🔍 Troubleshooting
Port Already in Use
# Find process using port 8080
lsof -i :8080
# Kill the process
kill -9 <PID>
Server Not Responding
# Check if running
curl -s http://localhost:8080/api/health
# Restart server
pkill -f "go"
go run cmd/server/main.go &
Dependency Issues
# Clean and rebuild
go mod tidy
go build ./...
Tests Failing
# Run with verbose output
go test -v ./...
# Check specific test
go test ./pkg/greet/ -run TestName
📚 Code Examples
Adding New API Endpoint
// 1. Add to interface
func (h *apiV1GreetHandler) RegisterRoutes(router chi.Router) {
router.Get("/", h.handleGreetQuery)
router.Get("/{name}", h.handleGreetPath)
router.Post("/custom", h.handleCustomGreet) // New endpoint
}
// 2. Implement handler
func (h *apiV1GreetHandler) handleCustomGreet(w http.ResponseWriter, r *http.Request) {
// Parse request
// Call service
// Return JSON response
}
Adding Logging
// Trace level logging
log.Trace().Ctx(ctx).Str("key", "value").Msg("message")
// Info level
log.Info().Msg("Important event")
// Error level
log.Error().Err(err).Msg("Error occurred")
Using Context
// Pass context through calls
func handler(w http.ResponseWriter, r *http.Request) {
result := service.Greet(r.Context(), "John")
// ...
}
// Create context with values
ctx := context.WithValue(r.Context(), "key", "value")
// Create context with timeout
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
defer cancel()
🎓 Best Practices
Code Organization
- Keep handlers thin, move logic to services
- Use interfaces for dependencies
- Separate route registration from handlers
- Group related functionality
Error Handling
- Return proper HTTP status codes
- Log errors with context
- Don't expose internal errors to clients
- Use structured error responses
Performance
- Use Zerolog's Trace level sparingly in production
- Avoid allocations in hot paths
- Use context timeouts for external calls
- Batch database operations
Testing
- Test interfaces, not implementations
- Use table-driven tests
- Test error cases
- Mock dependencies
📈 Future Enhancements
Potential Features
- Configuration management
- Database integration
- Authentication/Authorization
- Rate limiting
- Metrics and monitoring
- Docker containerization
- CI/CD pipeline
Architectural Improvements
- Request validation middleware
- OpenAPI/Swagger documentation
- Graceful shutdown
- Configuration hot reload
- Circuit breakers
📝 Changelog
2026-04-03 - Current Version
- ✅ Zerolog integration with Trace level
- ✅ Context-aware Greet service
- ✅ Fixed route structure
/api/v1/greet/* - ✅ Comprehensive server management guide
- ✅ Verified all API endpoints working
- ✅ Updated documentation
2026-04-02 - Web API Implementation
- ✅ Chi router integration
- ✅ Versioned API endpoints
- ✅ JSON responses
- ✅ Health endpoint
- ✅ Interface-based design
2026-04-01 - Foundation
- ✅ Go 1.26.1 setup
- ✅ Project structure
- ✅ Core Greet service
- ✅ CLI interface
- ✅ Unit tests
🤖 AI Agent Information
Agent: Mistral Vibe CLI Agent Version: devstral-2 Role: Development Assistant Capabilities:
- Code generation and refactoring
- Test creation
- Documentation
- Architecture guidance
- Best practices enforcement
📋 Quick Reference
Common Commands
# Start server
go run cmd/server/main.go &
# Test API
curl http://localhost:8080/api/v1/greet/John
# Run tests
go test ./...
# Stop server
pkill -f "go"
# CLI usage
go run ./cmd/greet John
Project Structure
cmd/ # Entry points
pkg/ # Core logic
greet/ # Domain services
server/ # HTTP server
go.mod # Dependencies
README.md # User docs
AGENTS.md # This file
Key Interfaces
type Greeter interface {
Greet(ctx context.Context, name string) string
}
type ApiV1Greet interface {
RegisterRoutes(router chi.Router)
}
📞 Support
For issues or questions:
- Check this documentation
- Review test cases
- Examine existing implementations
- Consult Go and Chi documentation
- Ask the AI agent for guidance
This documentation provides a complete guide to developing, testing, and maintaining the DanceLessonsCoach project using the established patterns and best practices.