diff --git a/pkg/hooks/procattr_unix.go b/pkg/hooks/procattr_unix.go new file mode 100644 index 0000000..5583ee2 --- /dev/null +++ b/pkg/hooks/procattr_unix.go @@ -0,0 +1,12 @@ +//go:build !windows + +package hooks + +import ( + "os/exec" + "syscall" +) + +func setSysProcAttr(cmd *exec.Cmd) { + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} +} diff --git a/pkg/hooks/procattr_windows.go b/pkg/hooks/procattr_windows.go new file mode 100644 index 0000000..d803a84 --- /dev/null +++ b/pkg/hooks/procattr_windows.go @@ -0,0 +1,9 @@ +//go:build windows + +package hooks + +import "os/exec" + +func setSysProcAttr(cmd *exec.Cmd) { + // Windows has no Setpgid; process groups work differently. +} diff --git a/pkg/hooks/worker.go b/pkg/hooks/worker.go index 36e73c6..0d92147 100644 --- a/pkg/hooks/worker.go +++ b/pkg/hooks/worker.go @@ -334,7 +334,7 @@ func ensureWorkerRunningCtx(ctx context.Context) (int, error) { // Start worker -- detach from hook's process group so Claude Code // killing the hook doesn't take the worker down with it. cmd := exec.Command(workerPath) // #nosec G204 -- workerPath is from internal findWorkerBinary - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + setSysProcAttr(cmd) cmd.Stdout = os.Stderr cmd.Stderr = os.Stderr if err := cmd.Start(); err != nil {