diff --git a/container/internal/git/checkpoint_manager.go b/container/internal/git/checkpoint_manager.go index 035e599b..8f59e58d 100644 --- a/container/internal/git/checkpoint_manager.go +++ b/container/internal/git/checkpoint_manager.go @@ -23,6 +23,13 @@ func GetCheckpointTimeout() time.Duration { return DefaultCheckpointTimeoutSeconds * time.Second } +// IsCheckpointEnabled returns whether automatic checkpoint creation is enabled +// Disabled by default, can be enabled by setting CATNIP_ENABLE_CHECKPOINTS=true +func IsCheckpointEnabled() bool { + value := os.Getenv("CATNIP_ENABLE_CHECKPOINTS") + return value == "true" || value == "1" +} + // CheckpointManager handles checkpoint functionality for sessions type CheckpointManager interface { ShouldCreateCheckpoint() bool diff --git a/container/internal/git/checkpoint_manager_test.go b/container/internal/git/checkpoint_manager_test.go index a3ffb7c6..befd6fb3 100644 --- a/container/internal/git/checkpoint_manager_test.go +++ b/container/internal/git/checkpoint_manager_test.go @@ -97,6 +97,37 @@ func TestGetCheckpointTimeout(t *testing.T) { assert.Equal(t, DefaultCheckpointTimeoutSeconds*time.Second, timeout) } +func TestIsCheckpointEnabled(t *testing.T) { + // Test disabled by default + _ = os.Unsetenv("CATNIP_ENABLE_CHECKPOINTS") + enabled := IsCheckpointEnabled() + assert.False(t, enabled) + + // Test enabled with "true" + _ = os.Setenv("CATNIP_ENABLE_CHECKPOINTS", "true") + defer func() { _ = os.Unsetenv("CATNIP_ENABLE_CHECKPOINTS") }() + enabled = IsCheckpointEnabled() + assert.True(t, enabled) + + // Test enabled with "1" + _ = os.Setenv("CATNIP_ENABLE_CHECKPOINTS", "1") + enabled = IsCheckpointEnabled() + assert.True(t, enabled) + + // Test disabled with other values + _ = os.Setenv("CATNIP_ENABLE_CHECKPOINTS", "false") + enabled = IsCheckpointEnabled() + assert.False(t, enabled) + + _ = os.Setenv("CATNIP_ENABLE_CHECKPOINTS", "0") + enabled = IsCheckpointEnabled() + assert.False(t, enabled) + + _ = os.Setenv("CATNIP_ENABLE_CHECKPOINTS", "yes") + enabled = IsCheckpointEnabled() + assert.False(t, enabled) +} + func TestShouldCreateCheckpoint(t *testing.T) { cm := &SessionCheckpointManager{ lastCommitTime: time.Now(), diff --git a/container/internal/services/claude_monitor.go b/container/internal/services/claude_monitor.go index c198ac45..b7641900 100644 --- a/container/internal/services/claude_monitor.go +++ b/container/internal/services/claude_monitor.go @@ -716,6 +716,11 @@ func (m *WorktreeCheckpointManager) HandleTitleChange(newTitle string) { // startCheckpointTimer starts or restarts the checkpoint timer func (m *WorktreeCheckpointManager) startCheckpointTimer() { + // Check if checkpoints are enabled via environment variable + if !git.IsCheckpointEnabled() { + return + } + timeout := git.GetCheckpointTimeout() // Start timer silently m.checkpointTimer = time.AfterFunc(timeout, func() {