// Copyright 2026 MarketAlly. All rights reserved. // SPDX-License-Identifier: BSL-1.1 // Example: Using GitCaddy AI Client in .NET using GitCaddy.AI.Client; using GitCaddy.AI.Proto; Console.WriteLine("GitCaddy AI Client Example"); Console.WriteLine("==========================\n"); // Create client using var client = new GitCaddyAIClient("http://localhost:5051"); // Check health Console.WriteLine("Checking service health..."); var health = await client.CheckHealthAsync(); Console.WriteLine($"Service healthy: {health.Healthy}"); Console.WriteLine($"Version: {health.Version}"); if (health.License != null) { Console.WriteLine($"License: {health.License.Tier} tier for {health.License.Customer}"); } Console.WriteLine(); // Example 1: Code Review Console.WriteLine("Example 1: Reviewing a Pull Request"); Console.WriteLine("------------------------------------"); var reviewResponse = await client.ReviewPullRequestAsync(new ReviewPullRequestRequest { RepoId = 1, PullRequestId = 42, PrTitle = "Add user authentication", PrDescription = "Implements JWT-based authentication for the API", BaseBranch = "main", HeadBranch = "feature/auth", Files = { new FileDiff { Path = "src/auth/jwt.go", Status = "added", Language = "go", Patch = @" +package auth + +import ""github.com/golang-jwt/jwt/v5"" + +func GenerateToken(userID string) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + ""user_id"": userID, + }) + return token.SignedString([]byte(""secret"")) +} " } }, Options = new ReviewOptions { CheckSecurity = true, CheckPerformance = true, SuggestImprovements = true } }); Console.WriteLine($"Verdict: {reviewResponse.Verdict}"); Console.WriteLine($"Summary: {reviewResponse.Summary[..Math.Min(500, reviewResponse.Summary.Length)]}...\n"); // Example 2: Explain Code Console.WriteLine("Example 2: Explaining Code"); Console.WriteLine("---------------------------"); var explainResponse = await client.ExplainCodeAsync(new ExplainCodeRequest { RepoId = 1, FilePath = "src/utils/retry.go", Code = @" func Retry(attempts int, sleep time.Duration, f func() error) error { var err error for i := 0; i < attempts; i++ { if err = f(); err == nil { return nil } time.Sleep(sleep) sleep *= 2 } return fmt.Errorf(""after %d attempts: %w"", attempts, err) } ", Question = "What pattern is this implementing?" }); Console.WriteLine($"Explanation: {explainResponse.Explanation[..Math.Min(500, explainResponse.Explanation.Length)]}...\n"); // Example 3: Generate Commit Message Console.WriteLine("Example 3: Generating Commit Message"); Console.WriteLine("-------------------------------------"); var commitResponse = await client.GenerateCommitMessageAsync(new GenerateCommitMessageRequest { RepoId = 1, Style = "conventional", Files = { new FileDiff { Path = "src/api/handlers.go", Status = "modified", Patch = @" @@ -45,6 +45,15 @@ func (h *Handler) GetUser(w http.ResponseWriter, r *http.Request) { +func (h *Handler) DeleteUser(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, ""id"") + if err := h.userService.Delete(r.Context(), id); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusNoContent) +} " } } }); Console.WriteLine($"Suggested message: {commitResponse.Message}"); if (commitResponse.Alternatives.Count > 0) { Console.WriteLine("Alternatives:"); foreach (var alt in commitResponse.Alternatives) { Console.WriteLine($" - {alt}"); } } Console.WriteLine(); // Example 4: Triage Issue Console.WriteLine("Example 4: Triaging an Issue"); Console.WriteLine("-----------------------------"); var triageResponse = await client.TriageIssueAsync(new TriageIssueRequest { RepoId = 1, IssueId = 123, Title = "App crashes when uploading large files", Body = @" When I try to upload a file larger than 100MB, the application crashes with an out of memory error. Steps to reproduce: 1. Go to upload page 2. Select a file > 100MB 3. Click upload 4. App crashes Expected: Should show an error or handle gracefully Actual: Application crashes Environment: Windows 11, Chrome 120 ", AvailableLabels = { "bug", "enhancement", "question", "documentation", "performance", "security", "crash" } }); Console.WriteLine($"Priority: {triageResponse.Priority}"); Console.WriteLine($"Category: {triageResponse.Category}"); Console.WriteLine($"Suggested labels: {string.Join(", ", triageResponse.SuggestedLabels)}"); Console.WriteLine($"Summary: {triageResponse.Summary[..Math.Min(300, triageResponse.Summary.Length)]}...\n"); Console.WriteLine("Done!");