From 3e58d6d0a1d9d55fc8d06637da2f804e8840d7d5 Mon Sep 17 00:00:00 2001 From: Jeff Haynie Date: Tue, 29 Apr 2025 17:06:55 -0500 Subject: [PATCH] DevMode: debounce hot reloads --- cmd/dev.go | 13 +++++++++++-- go.mod | 1 + go.sum | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/dev.go b/cmd/dev.go index f7e6edac..61027ab9 100644 --- a/cmd/dev.go +++ b/cmd/dev.go @@ -18,6 +18,7 @@ import ( cstr "github.com/agentuity/go-common/string" csys "github.com/agentuity/go-common/sys" "github.com/agentuity/go-common/tui" + "github.com/bep/debounce" "github.com/spf13/cobra" "github.com/spf13/viper" ) @@ -134,13 +135,21 @@ Examples: // Initial build build(true) - // Watch for changes - watcher, err := dev.NewWatcher(log, dir, theproject.Project.Development.Watch.Files, func(path string) { + restart := func() { build(false) isDeliberateRestart = true log.Debug("killing project server") dev.KillProjectServer(projectServerCmd) log.Debug("killing project server done") + } + + // debounce a lot of changes at once to avoid multiple restarts in succession + debounced := debounce.New(250 * time.Millisecond) + + // Watch for changes + watcher, err := dev.NewWatcher(log, dir, theproject.Project.Development.Watch.Files, func(path string) { + log.Trace("%s has changed", path) + debounced(restart) }) if err != nil { errsystem.New(errsystem.ErrInvalidConfiguration, err, errsystem.WithContextMessage(fmt.Sprintf("Failed to start watcher: %s", err))).ShowErrorAndExit() diff --git a/go.mod b/go.mod index 5409d4fe..8bfa8338 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/Masterminds/semver v1.5.0 github.com/agentuity/go-common v1.0.39 github.com/agentuity/mcp-golang/v2 v2.0.2 + github.com/bep/debounce v1.2.1 github.com/bmatcuk/doublestar/v4 v4.8.1 github.com/charmbracelet/bubbles v0.20.0 github.com/charmbracelet/bubbletea v1.3.4 diff --git a/go.sum b/go.sum index 2f029a1b..7f09d02a 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,8 @@ github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWp github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bmatcuk/doublestar/v4 v4.8.1 h1:54Bopc5c2cAvhLRAzqOGCYHYyhcDHsFF4wWIR5wKP38= github.com/bmatcuk/doublestar/v4 v4.8.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY=