From f69437068291483ee7f35acd0c0def0f3a28c9ab Mon Sep 17 00:00:00 2001 From: Vidya Sagar Reddy Desu <35026133+vidya381@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:32:05 -0600 Subject: [PATCH 1/3] split Java detection into Maven and Gradle --- internal/detector/detector.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/internal/detector/detector.go b/internal/detector/detector.go index c801a98..e579a15 100644 --- a/internal/detector/detector.go +++ b/internal/detector/detector.go @@ -11,6 +11,8 @@ type DetectedStack struct { Node bool Python bool Java bool + Maven bool + Gradle bool Docker bool Postgres bool Redis bool @@ -25,8 +27,9 @@ func Detect(dir string) DetectedStack { stack.Node = fileExists(filepath.Join(dir, "package.json")) stack.Python = fileExists(filepath.Join(dir, "requirements.txt")) || fileExists(filepath.Join(dir, "pyproject.toml")) - stack.Java = fileExists(filepath.Join(dir, "pom.xml")) || - fileExists(filepath.Join(dir, "build.gradle")) + stack.Maven = fileExists(filepath.Join(dir, "pom.xml")) + stack.Gradle = fileExists(filepath.Join(dir, "build.gradle")) + stack.Java = stack.Maven || stack.Gradle stack.Docker = fileExists(filepath.Join(dir, "Dockerfile")) || fileExists(filepath.Join(dir, "docker-compose.yml")) || fileExists(filepath.Join(dir, "docker-compose.yaml")) From a577c04acb932c038cd348b0fe2eca912f648f54 Mon Sep 17 00:00:00 2001 From: Vidya Sagar Reddy Desu <35026133+vidya381@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:32:39 -0600 Subject: [PATCH 2/3] add binary checks for Go, Node, Python, Java --- internal/check/registry.go | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/internal/check/registry.go b/internal/check/registry.go index ee00d03..799902c 100644 --- a/internal/check/registry.go +++ b/internal/check/registry.go @@ -1,21 +1,32 @@ package check -import "github.com/vidya381/devcheck/internal/detector" +import ( + "github.com/vidya381/devcheck/internal/checks" + "github.com/vidya381/devcheck/internal/detector" +) func Build(stack detector.DetectedStack) []Check { - var checks []Check + var cs []Check if stack.Go { - // add Go checks + cs = append(cs, &checks.BinaryCheck{Binary: "go"}) } if stack.Node { - // add Node checks + cs = append(cs, &checks.BinaryCheck{Binary: "node"}) + cs = append(cs, &checks.BinaryCheck{Binary: "npm"}) } if stack.Python { - // add Python checks + cs = append(cs, &checks.BinaryCheck{Binary: "python3"}) + cs = append(cs, &checks.BinaryCheck{Binary: "pip"}) } if stack.Java { - // add Java checks + cs = append(cs, &checks.BinaryCheck{Binary: "java"}) + if stack.Maven { + cs = append(cs, &checks.BinaryCheck{Binary: "mvn"}) + } + if stack.Gradle { + cs = append(cs, &checks.BinaryCheck{Binary: "gradle"}) + } } if stack.Docker { // add Docker checks @@ -28,7 +39,7 @@ func Build(stack detector.DetectedStack) []Check { } // always run env check if .env.example exists - // checks = append(checks, &EnvCheck{}) + // cs = append(cs, &EnvCheck{}) - return checks + return cs } From 3847372ba453a2b8aa30df6d520be52929084ad5 Mon Sep 17 00:00:00 2001 From: Vidya Sagar Reddy Desu <35026133+vidya381@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:34:48 -0600 Subject: [PATCH 3/3] move BinaryCheck into check package to fix import cycle --- internal/{checks => check}/binary.go | 14 ++++++-------- internal/{checks => check}/binary_test.go | 8 +++----- internal/check/registry.go | 21 +++++++++------------ 3 files changed, 18 insertions(+), 25 deletions(-) rename internal/{checks => check}/binary.go (67%) rename internal/{checks => check}/binary_test.go (74%) diff --git a/internal/checks/binary.go b/internal/check/binary.go similarity index 67% rename from internal/checks/binary.go rename to internal/check/binary.go index 99997e7..597cdb2 100644 --- a/internal/checks/binary.go +++ b/internal/check/binary.go @@ -1,11 +1,9 @@ -package checks +package check import ( "context" "fmt" "os/exec" - - "github.com/vidya381/devcheck/internal/check" ) type BinaryCheck struct { @@ -16,19 +14,19 @@ func (c *BinaryCheck) Name() string { return fmt.Sprintf("%s installed", c.Binary) } -func (c *BinaryCheck) Run(_ context.Context) check.Result { +func (c *BinaryCheck) Run(_ context.Context) Result { _, err := exec.LookPath(c.Binary) if err != nil { - return check.Result{ + return Result{ Name: c.Name(), - Status: check.StatusFail, + Status: StatusFail, Message: fmt.Sprintf("%s not found on PATH", c.Binary), Fix: fmt.Sprintf("Install %s and make sure it is on your PATH", c.Binary), } } - return check.Result{ + return Result{ Name: c.Name(), - Status: check.StatusPass, + Status: StatusPass, Message: fmt.Sprintf("%s is installed", c.Binary), } } diff --git a/internal/checks/binary_test.go b/internal/check/binary_test.go similarity index 74% rename from internal/checks/binary_test.go rename to internal/check/binary_test.go index 37ce4d5..7e585c0 100644 --- a/internal/checks/binary_test.go +++ b/internal/check/binary_test.go @@ -1,16 +1,14 @@ -package checks +package check import ( "context" "testing" - - "github.com/vidya381/devcheck/internal/check" ) func TestBinaryCheck_Pass(t *testing.T) { c := &BinaryCheck{Binary: "go"} result := c.Run(context.Background()) - if result.Status != check.StatusPass { + if result.Status != StatusPass { t.Errorf("expected pass, got %v: %s", result.Status, result.Message) } } @@ -18,7 +16,7 @@ func TestBinaryCheck_Pass(t *testing.T) { func TestBinaryCheck_Fail(t *testing.T) { c := &BinaryCheck{Binary: "definitelynotabinary12345"} result := c.Run(context.Background()) - if result.Status != check.StatusFail { + if result.Status != StatusFail { t.Errorf("expected fail, got %v", result.Status) } } diff --git a/internal/check/registry.go b/internal/check/registry.go index 799902c..12e827e 100644 --- a/internal/check/registry.go +++ b/internal/check/registry.go @@ -1,31 +1,28 @@ package check -import ( - "github.com/vidya381/devcheck/internal/checks" - "github.com/vidya381/devcheck/internal/detector" -) +import "github.com/vidya381/devcheck/internal/detector" func Build(stack detector.DetectedStack) []Check { var cs []Check if stack.Go { - cs = append(cs, &checks.BinaryCheck{Binary: "go"}) + cs = append(cs, &BinaryCheck{Binary: "go"}) } if stack.Node { - cs = append(cs, &checks.BinaryCheck{Binary: "node"}) - cs = append(cs, &checks.BinaryCheck{Binary: "npm"}) + cs = append(cs, &BinaryCheck{Binary: "node"}) + cs = append(cs, &BinaryCheck{Binary: "npm"}) } if stack.Python { - cs = append(cs, &checks.BinaryCheck{Binary: "python3"}) - cs = append(cs, &checks.BinaryCheck{Binary: "pip"}) + cs = append(cs, &BinaryCheck{Binary: "python3"}) + cs = append(cs, &BinaryCheck{Binary: "pip"}) } if stack.Java { - cs = append(cs, &checks.BinaryCheck{Binary: "java"}) + cs = append(cs, &BinaryCheck{Binary: "java"}) if stack.Maven { - cs = append(cs, &checks.BinaryCheck{Binary: "mvn"}) + cs = append(cs, &BinaryCheck{Binary: "mvn"}) } if stack.Gradle { - cs = append(cs, &checks.BinaryCheck{Binary: "gradle"}) + cs = append(cs, &BinaryCheck{Binary: "gradle"}) } } if stack.Docker {