[object Object]

← back to Cli Printing Press

fix(generator): doctor tries health endpoints before reporting status

651d11e183ce380948cf18519b98045d75790b70 · 2026-03-24 16:21:18 -0700 · Matt Van Horn

Tries /health, /healthz, /status, /ping paths before falling back to
base URL. Reports "reachable" only for 2xx/3xx, "degraded" for 4xx/5xx.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Files touched

Diff

commit 651d11e183ce380948cf18519b98045d75790b70
Author: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Date:   Tue Mar 24 16:21:18 2026 -0700

    fix(generator): doctor tries health endpoints before reporting status
    
    Tries /health, /healthz, /status, /ping paths before falling back to
    base URL. Reports "reachable" only for 2xx/3xx, "degraded" for 4xx/5xx.
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
 internal/generator/templates/doctor.go.tmpl | 38 +++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/internal/generator/templates/doctor.go.tmpl b/internal/generator/templates/doctor.go.tmpl
index a41e7922..99e7d9ce 100644
--- a/internal/generator/templates/doctor.go.tmpl
+++ b/internal/generator/templates/doctor.go.tmpl
@@ -41,12 +41,40 @@ func newDoctorCmd(flags *rootFlags) *cobra.Command {
 			// Check API connectivity
 			if cfg != nil && cfg.BaseURL != "" {
 				httpClient := &http.Client{Timeout: 5 * time.Second}
-				resp, err := httpClient.Get(cfg.BaseURL)
-				if err != nil {
-					report["api"] = fmt.Sprintf("unreachable: %s", err)
-				} else {
+				
+				// Try common health-check paths in order
+				paths := []string{
+					"",
+					"/health",
+					"/healthz",
+					"/status",
+					"/ping",
+				}
+
+				reached := false
+				for _, p := range paths {
+					url := strings.TrimRight(cfg.BaseURL, "/") + p
+					resp, err := httpClient.Get(url)
+					if err != nil {
+						continue
+					}
 					resp.Body.Close()
-					report["api"] = fmt.Sprintf("reachable (HTTP %d)", resp.StatusCode)
+					if resp.StatusCode >= 200 && resp.StatusCode < 400 {
+						report["api"] = fmt.Sprintf("reachable (HTTP %d)", resp.StatusCode)
+						reached = true
+						break
+					}
+				}
+
+				if !reached {
+					// Fall back to reporting the base URL status
+					resp, err := httpClient.Get(cfg.BaseURL)
+					if err != nil {
+						report["api"] = fmt.Sprintf("unreachable: %s", err)
+					} else {
+						resp.Body.Close()
+						report["api"] = fmt.Sprintf("degraded (HTTP %d)", resp.StatusCode)
+					}
 				}
 			} else if cfg != nil && cfg.BaseURL == "" {
 				report["api"] = "not configured (set base_url in config file)"

← 5b3d281e feat(generator): add CRUD aliases to generated CLI commands  ·  back to Cli Printing Press  ·  fix(generator): harden toCamel, flagName, defaultVal and ded 1eda222a →