From cfe15a9d3407a6e7bc0746e67a1dc2a8373aa6ed Mon Sep 17 00:00:00 2001 From: Ben Madore <823868+madorb@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:59:19 -0400 Subject: [PATCH] Enhance .gitignore created during bd init (#98) - Expand .gitignore to include all SQLite-related files (journal, WAL, SHM) - Add daemon runtime files (logs, PID, socket) - Include legacy database filenames - Explicitly allow JSONL files with !*.jsonl pattern - Add test coverage to verify .gitignore content --- cmd/bd/init.go | 19 ++++++++++++++++++- cmd/bd/init_test.go | 25 +++++++++++++++++++++++++ cmd/bd/testdata/init.txt | 8 +++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/cmd/bd/init.go b/cmd/bd/init.go index a20c2a46..3962f6bc 100644 --- a/cmd/bd/init.go +++ b/cmd/bd/init.go @@ -44,7 +44,24 @@ and database file. Optionally specify a custom issue prefix.`, // Create .gitignore in .beads directory gitignorePath := filepath.Join(beadsDir, ".gitignore") - gitignoreContent := "*.db\n*.db-*\n" + gitignoreContent := `# SQLite databases +*.db +*.db-journal +*.db-wal +*.db-shm + +# Daemon runtime files +daemon.log +daemon.pid +bd.sock + +# Legacy database files +db.sqlite +bd.db + +# Keep JSONL exports (source of truth for git) +!*.jsonl +` if err := os.WriteFile(gitignorePath, []byte(gitignoreContent), 0644); err != nil { fmt.Fprintf(os.Stderr, "Warning: failed to create .gitignore: %v\n", err) // Non-fatal - continue anyway diff --git a/cmd/bd/init_test.go b/cmd/bd/init_test.go index 761aba6e..af34f641 100644 --- a/cmd/bd/init_test.go +++ b/cmd/bd/init_test.go @@ -113,6 +113,31 @@ func TestInitCommand(t *testing.T) { t.Error(".beads directory was not created") } + // Verify .gitignore was created with proper content + gitignorePath := filepath.Join(beadsDir, ".gitignore") + gitignoreContent, err := os.ReadFile(gitignorePath) + if err != nil { + t.Errorf(".gitignore file was not created: %v", err) + } else { + // Check for essential patterns + gitignoreStr := string(gitignoreContent) + expectedPatterns := []string{ + "*.db", + "*.db-journal", + "*.db-wal", + "*.db-shm", + "daemon.log", + "daemon.pid", + "bd.sock", + "!*.jsonl", + } + for _, pattern := range expectedPatterns { + if !strings.Contains(gitignoreStr, pattern) { + t.Errorf(".gitignore missing expected pattern: %s", pattern) + } + } + } + // Verify database was created var dbPath string if tt.prefix != "" { diff --git a/cmd/bd/testdata/init.txt b/cmd/bd/testdata/init.txt index 5b8c5301..f3327086 100644 --- a/cmd/bd/testdata/init.txt +++ b/cmd/bd/testdata/init.txt @@ -4,4 +4,10 @@ stdout 'initialized successfully' exists .beads/test.db exists .beads/.gitignore grep '^\*\.db$' .beads/.gitignore -grep '^\*\.db-\*$' .beads/.gitignore +grep '^\*\.db-journal$' .beads/.gitignore +grep '^\*\.db-wal$' .beads/.gitignore +grep '^\*\.db-shm$' .beads/.gitignore +grep '^daemon\.log$' .beads/.gitignore +grep '^daemon\.pid$' .beads/.gitignore +grep '^bd\.sock$' .beads/.gitignore +grep '^!\*\.jsonl$' .beads/.gitignore