fix: misc improvements and dependency updates

- Update nix vendorHash after fatih/color removal
- Bump version to 0.30.7
- Add GroupID to remaining commands for proper cobra grouping
- Apply semantic color rendering to list and stale commands
- Update pre-commit hook template
This commit is contained in:
Ryan Snodgrass
2025-12-20 13:05:32 -08:00
parent 6ca141712c
commit acfdcebc0f
28 changed files with 168 additions and 73 deletions

View File

@@ -15,6 +15,7 @@ import (
var commentsCmd = &cobra.Command{ var commentsCmd = &cobra.Command{
Use: "comments [issue-id]", Use: "comments [issue-id]",
GroupID: "issues",
Short: "View or manage comments on an issue", Short: "View or manage comments on an issue",
Long: `View or manage comments on an issue. Long: `View or manage comments on an issue.
@@ -216,6 +217,7 @@ Examples:
// commentCmd is a top-level alias for commentsAddCmd // commentCmd is a top-level alias for commentsAddCmd
var commentCmd = &cobra.Command{ var commentCmd = &cobra.Command{
Use: "comment [issue-id] [text]", Use: "comment [issue-id] [text]",
GroupID: "issues",
Short: "Add a comment to an issue (alias for 'comments add')", Short: "Add a comment to an issue (alias for 'comments add')",
Long: `Add a comment to an issue. This is a convenient alias for 'bd comments add'. Long: `Add a comment to an issue. This is a convenient alias for 'bd comments add'.

View File

@@ -34,8 +34,10 @@ var (
compactLimit int compactLimit int
) )
// TODO: Consider consolidating into 'bd doctor --fix' for simpler maintenance UX
var compactCmd = &cobra.Command{ var compactCmd = &cobra.Command{
Use: "compact", Use: "compact",
GroupID: "maint",
Short: "Compact old closed issues to save space", Short: "Compact old closed issues to save space",
Long: `Compact old closed issues using semantic summarization. Long: `Compact old closed issues using semantic summarization.

View File

@@ -12,6 +12,7 @@ import (
var configCmd = &cobra.Command{ var configCmd = &cobra.Command{
Use: "config", Use: "config",
GroupID: "setup",
Short: "Manage configuration settings", Short: "Manage configuration settings",
Long: `Manage configuration settings for external integrations and preferences. Long: `Manage configuration settings for external integrations and preferences.

View File

@@ -15,6 +15,7 @@ import (
var countCmd = &cobra.Command{ var countCmd = &cobra.Command{
Use: "count", Use: "count",
GroupID: "views",
Short: "Count issues matching filters", Short: "Count issues matching filters",
Long: `Count issues matching the specified filters. Long: `Count issues matching the specified filters.

View File

@@ -21,6 +21,7 @@ import (
var daemonCmd = &cobra.Command{ var daemonCmd = &cobra.Command{
Use: "daemon", Use: "daemon",
GroupID: "sync",
Short: "Manage background sync daemon", Short: "Manage background sync daemon",
Long: `Manage the background daemon that automatically syncs issues with git remote. Long: `Manage the background daemon that automatically syncs issues with git remote.

View File

@@ -15,6 +15,7 @@ import (
) )
var daemonsCmd = &cobra.Command{ var daemonsCmd = &cobra.Command{
Use: "daemons", Use: "daemons",
GroupID: "sync",
Short: "Manage multiple bd daemons", Short: "Manage multiple bd daemons",
Long: `Manage bd daemon processes across all repositories and worktrees. Long: `Manage bd daemon processes across all repositories and worktrees.
Subcommands: Subcommands:

View File

@@ -112,6 +112,7 @@ func validateExportPath(path string) error {
var exportCmd = &cobra.Command{ var exportCmd = &cobra.Command{
Use: "export", Use: "export",
GroupID: "sync",
Short: "Export issues to JSONL format", Short: "Export issues to JSONL format",
Long: `Export all issues to JSON Lines format (one JSON object per line). Long: `Export all issues to JSON Lines format (one JSON object per line).
Issues are sorted by ID for consistent diffs. Issues are sorted by ID for consistent diffs.

View File

@@ -161,6 +161,7 @@ func FormatHookWarnings(statuses []HookStatus) string {
var hooksCmd = &cobra.Command{ var hooksCmd = &cobra.Command{
Use: "hooks", Use: "hooks",
GroupID: "setup",
Short: "Manage git hooks for bd auto-sync", Short: "Manage git hooks for bd auto-sync",
Long: `Install, uninstall, or list git hooks that provide automatic bd sync. Long: `Install, uninstall, or list git hooks that provide automatic bd sync.
@@ -407,6 +408,8 @@ func uninstallHooks() error {
// runPreCommitHook flushes pending changes to JSONL before commit. // runPreCommitHook flushes pending changes to JSONL before commit.
// Returns 0 on success (or if not applicable), non-zero on error. // Returns 0 on success (or if not applicable), non-zero on error.
//
//nolint:unparam // Always returns 0 by design - warns but doesn't block commits
func runPreCommitHook() int { func runPreCommitHook() int {
// Check if we're in a bd workspace // Check if we're in a bd workspace
if _, err := os.Stat(".beads"); os.IsNotExist(err) { if _, err := os.Stat(".beads"); os.IsNotExist(err) {
@@ -430,6 +433,7 @@ func runPreCommitHook() int {
// Stage all tracked JSONL files // Stage all tracked JSONL files
for _, f := range []string{".beads/beads.jsonl", ".beads/issues.jsonl", ".beads/deletions.jsonl", ".beads/interactions.jsonl"} { for _, f := range []string{".beads/beads.jsonl", ".beads/issues.jsonl", ".beads/deletions.jsonl", ".beads/interactions.jsonl"} {
if _, err := os.Stat(f); err == nil { if _, err := os.Stat(f); err == nil {
// #nosec G204 -- f is a fixed string from the hardcoded slice above
gitAdd := exec.Command("git", "add", f) gitAdd := exec.Command("git", "add", f)
_ = gitAdd.Run() // Ignore errors - file may not exist _ = gitAdd.Run() // Ignore errors - file may not exist
} }
@@ -440,6 +444,8 @@ func runPreCommitHook() int {
// runPostMergeHook imports JSONL after pull/merge. // runPostMergeHook imports JSONL after pull/merge.
// Returns 0 on success (or if not applicable), non-zero on error. // Returns 0 on success (or if not applicable), non-zero on error.
//
//nolint:unparam // Always returns 0 by design - warns but doesn't block merges
func runPostMergeHook() int { func runPostMergeHook() int {
// Skip during rebase // Skip during rebase
if isRebaseInProgress() { if isRebaseInProgress() {
@@ -504,6 +510,7 @@ func runPrePushHook() int {
files = append(files, f) files = append(files, f)
} else { } else {
// Check if tracked by git // Check if tracked by git
// #nosec G204 -- f is a fixed string from the hardcoded slice above
checkCmd := exec.Command("git", "ls-files", "--error-unmatch", f) checkCmd := exec.Command("git", "ls-files", "--error-unmatch", f)
if checkCmd.Run() == nil { if checkCmd.Run() == nil {
files = append(files, f) files = append(files, f)
@@ -517,6 +524,7 @@ func runPrePushHook() int {
// Check for uncommitted changes using git status // Check for uncommitted changes using git status
args := append([]string{"status", "--porcelain", "--"}, files...) args := append([]string{"status", "--porcelain", "--"}, files...)
// #nosec G204 -- args contains only fixed strings from hardcoded slice
statusCmd := exec.Command("git", args...) statusCmd := exec.Command("git", args...)
output, _ := statusCmd.Output() output, _ := statusCmd.Output()
if len(output) > 0 { if len(output) > 0 {
@@ -539,6 +547,8 @@ func runPrePushHook() int {
// runPostCheckoutHook imports JSONL after branch checkout. // runPostCheckoutHook imports JSONL after branch checkout.
// args: [previous-HEAD, new-HEAD, flag] where flag=1 for branch checkout // args: [previous-HEAD, new-HEAD, flag] where flag=1 for branch checkout
// Returns 0 on success (or if not applicable), non-zero on error. // Returns 0 on success (or if not applicable), non-zero on error.
//
//nolint:unparam // Always returns 0 by design - warns but doesn't block checkouts
func runPostCheckoutHook(args []string) int { func runPostCheckoutHook(args []string) int {
// Only run on branch checkouts (flag=1) // Only run on branch checkouts (flag=1)
if len(args) >= 3 && args[2] != "1" { if len(args) >= 3 && args[2] != "1" {

View File

@@ -22,6 +22,7 @@ import (
var importCmd = &cobra.Command{ var importCmd = &cobra.Command{
Use: "import", Use: "import",
GroupID: "sync",
Short: "Import issues from JSONL format", Short: "Import issues from JSONL format",
Long: `Import issues from JSON Lines format (one JSON object per line). Long: `Import issues from JSON Lines format (one JSON object per line).

View File

@@ -13,6 +13,7 @@ import (
var infoCmd = &cobra.Command{ var infoCmd = &cobra.Command{
Use: "info", Use: "info",
GroupID: "setup",
Short: "Show database and daemon information", Short: "Show database and daemon information",
Long: `Display information about the current database path and daemon status. Long: `Display information about the current database path and daemon status.

View File

@@ -38,6 +38,7 @@ type JiraSyncResult struct {
var jiraCmd = &cobra.Command{ var jiraCmd = &cobra.Command{
Use: "jira", Use: "jira",
GroupID: "advanced",
Short: "Jira integration commands", Short: "Jira integration commands",
Long: `Synchronize issues between beads and Jira. Long: `Synchronize issues between beads and Jira.

View File

@@ -19,6 +19,7 @@ import (
// linearCmd is the root command for Linear integration. // linearCmd is the root command for Linear integration.
var linearCmd = &cobra.Command{ var linearCmd = &cobra.Command{
Use: "linear", Use: "linear",
GroupID: "advanced",
Short: "Linear integration commands", Short: "Linear integration commands",
Long: `Synchronize issues between beads and Linear. Long: `Synchronize issues between beads and Linear.

View File

@@ -16,6 +16,7 @@ import (
"github.com/steveyegge/beads/internal/rpc" "github.com/steveyegge/beads/internal/rpc"
"github.com/steveyegge/beads/internal/storage" "github.com/steveyegge/beads/internal/storage"
"github.com/steveyegge/beads/internal/types" "github.com/steveyegge/beads/internal/types"
"github.com/steveyegge/beads/internal/ui"
"github.com/steveyegge/beads/internal/util" "github.com/steveyegge/beads/internal/util"
"github.com/steveyegge/beads/internal/validation" "github.com/steveyegge/beads/internal/validation"
) )
@@ -101,6 +102,7 @@ func sortIssues(issues []*types.Issue, sortBy string, reverse bool) {
var listCmd = &cobra.Command{ var listCmd = &cobra.Command{
Use: "list", Use: "list",
GroupID: "issues",
Short: "List issues", Short: "List issues",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
status, _ := cmd.Flags().GetString("status") status, _ := cmd.Flags().GetString("status")
@@ -422,8 +424,22 @@ var listCmd = &cobra.Command{
// Long format: multi-line with details // Long format: multi-line with details
fmt.Printf("\nFound %d issues:\n\n", len(issues)) fmt.Printf("\nFound %d issues:\n\n", len(issues))
for _, issue := range issues { for _, issue := range issues {
fmt.Printf("%s%s [P%d] [%s] %s\n", pinIndicator(issue), issue.ID, issue.Priority, issue.IssueType, issue.Status) status := string(issue.Status)
if status == "closed" {
// Entire closed issue is dimmed
line := fmt.Sprintf("%s%s [P%d] [%s] %s\n %s",
pinIndicator(issue), issue.ID, issue.Priority,
issue.IssueType, status, issue.Title)
fmt.Println(ui.RenderClosedLine(line))
} else {
fmt.Printf("%s%s [%s] [%s] %s\n",
pinIndicator(issue),
ui.RenderID(issue.ID),
ui.RenderPriority(issue.Priority),
ui.RenderType(string(issue.IssueType)),
ui.RenderStatus(status))
fmt.Printf(" %s\n", issue.Title) fmt.Printf(" %s\n", issue.Title)
}
if issue.Assignee != "" { if issue.Assignee != "" {
fmt.Printf(" Assignee: %s\n", issue.Assignee) fmt.Printf(" Assignee: %s\n", issue.Assignee)
} }
@@ -443,11 +459,24 @@ var listCmd = &cobra.Command{
if issue.Assignee != "" { if issue.Assignee != "" {
assigneeStr = fmt.Sprintf(" @%s", issue.Assignee) assigneeStr = fmt.Sprintf(" @%s", issue.Assignee)
} }
fmt.Printf("%s%s [P%d] [%s] %s%s%s - %s\n", status := string(issue.Status)
pinIndicator(issue), issue.ID, issue.Priority, issue.IssueType, issue.Status, if status == "closed" {
// Entire closed line is dimmed
line := fmt.Sprintf("%s%s [P%d] [%s] %s%s%s - %s",
pinIndicator(issue), issue.ID, issue.Priority,
issue.IssueType, status, assigneeStr, labelsStr, issue.Title)
fmt.Println(ui.RenderClosedLine(line))
} else {
fmt.Printf("%s%s [%s] [%s] %s%s%s - %s\n",
pinIndicator(issue),
ui.RenderID(issue.ID),
ui.RenderPriority(issue.Priority),
ui.RenderType(string(issue.IssueType)),
ui.RenderStatus(status),
assigneeStr, labelsStr, issue.Title) assigneeStr, labelsStr, issue.Title)
} }
} }
}
return return
} }
@@ -529,9 +558,23 @@ var listCmd = &cobra.Command{
fmt.Printf("\nFound %d issues:\n\n", len(issues)) fmt.Printf("\nFound %d issues:\n\n", len(issues))
for _, issue := range issues { for _, issue := range issues {
labels := labelsMap[issue.ID] labels := labelsMap[issue.ID]
status := string(issue.Status)
fmt.Printf("%s%s [P%d] [%s] %s\n", pinIndicator(issue), issue.ID, issue.Priority, issue.IssueType, issue.Status) if status == "closed" {
// Entire closed issue is dimmed
line := fmt.Sprintf("%s%s [P%d] [%s] %s\n %s",
pinIndicator(issue), issue.ID, issue.Priority,
issue.IssueType, status, issue.Title)
fmt.Println(ui.RenderClosedLine(line))
} else {
fmt.Printf("%s%s [%s] [%s] %s\n",
pinIndicator(issue),
ui.RenderID(issue.ID),
ui.RenderPriority(issue.Priority),
ui.RenderType(string(issue.IssueType)),
ui.RenderStatus(status))
fmt.Printf(" %s\n", issue.Title) fmt.Printf(" %s\n", issue.Title)
}
if issue.Assignee != "" { if issue.Assignee != "" {
fmt.Printf(" Assignee: %s\n", issue.Assignee) fmt.Printf(" Assignee: %s\n", issue.Assignee)
} }
@@ -553,11 +596,24 @@ var listCmd = &cobra.Command{
if issue.Assignee != "" { if issue.Assignee != "" {
assigneeStr = fmt.Sprintf(" @%s", issue.Assignee) assigneeStr = fmt.Sprintf(" @%s", issue.Assignee)
} }
fmt.Printf("%s%s [P%d] [%s] %s%s%s - %s\n", status := string(issue.Status)
pinIndicator(issue), issue.ID, issue.Priority, issue.IssueType, issue.Status, if status == "closed" {
// Entire closed line is dimmed
line := fmt.Sprintf("%s%s [P%d] [%s] %s%s%s - %s",
pinIndicator(issue), issue.ID, issue.Priority,
issue.IssueType, status, assigneeStr, labelsStr, issue.Title)
fmt.Println(ui.RenderClosedLine(line))
} else {
fmt.Printf("%s%s [%s] [%s] %s%s%s - %s\n",
pinIndicator(issue),
ui.RenderID(issue.ID),
ui.RenderPriority(issue.Priority),
ui.RenderType(string(issue.IssueType)),
ui.RenderStatus(status),
assigneeStr, labelsStr, issue.Title) assigneeStr, labelsStr, issue.Title)
} }
} }
}
// Show tip after successful list (direct mode only) // Show tip after successful list (direct mode only)
maybeShowTip(store) maybeShowTip(store)

View File

@@ -16,6 +16,7 @@ import (
var mailCmd = &cobra.Command{ var mailCmd = &cobra.Command{
Use: "mail", Use: "mail",
GroupID: "advanced",
Short: "Send and receive messages via beads", Short: "Send and receive messages via beads",
Long: `Send and receive messages between agents using beads storage. Long: `Send and receive messages between agents using beads storage.

View File

@@ -17,6 +17,7 @@ var (
var mergeCmd = &cobra.Command{ var mergeCmd = &cobra.Command{
Use: "merge <output> <base> <left> <right>", Use: "merge <output> <base> <left> <right>",
GroupID: "sync",
Short: "Git merge driver for beads JSONL files", Short: "Git merge driver for beads JSONL files",
Long: `bd merge is a git merge driver for beads issue tracker JSONL files. Long: `bd merge is a git merge driver for beads issue tracker JSONL files.

View File

@@ -12,8 +12,10 @@ import (
"github.com/steveyegge/beads/internal/storage/sqlite" "github.com/steveyegge/beads/internal/storage/sqlite"
) )
// TODO: Consider integrating into 'bd doctor' migration detection
var migrateIssuesCmd = &cobra.Command{ var migrateIssuesCmd = &cobra.Command{
Use: "migrate-issues", Use: "migrate-issues",
GroupID: "maint",
Short: "Move issues between repositories", Short: "Move issues between repositories",
Long: `Move issues from one source repository to another with filtering and dependency preservation. Long: `Move issues from one source repository to another with filtering and dependency preservation.

View File

@@ -13,8 +13,10 @@ import (
"github.com/steveyegge/beads/internal/syncbranch" "github.com/steveyegge/beads/internal/syncbranch"
) )
// TODO: Consider integrating into 'bd doctor' migration detection
var migrateSyncCmd = &cobra.Command{ var migrateSyncCmd = &cobra.Command{
Use: "migrate-sync <branch-name>", Use: "migrate-sync <branch-name>",
GroupID: "maint",
Short: "Migrate to sync.branch workflow for multi-clone setups", Short: "Migrate to sync.branch workflow for multi-clone setups",
Long: `Migrate to using a dedicated sync branch for beads data. Long: `Migrate to using a dedicated sync branch for beads data.

View File

@@ -22,6 +22,7 @@ var (
var primeCmd = &cobra.Command{ var primeCmd = &cobra.Command{
Use: "prime", Use: "prime",
GroupID: "setup",
Short: "Output AI-optimized workflow context", Short: "Output AI-optimized workflow context",
Long: `Output essential Beads workflow context in AI-optimized markdown format. Long: `Output essential Beads workflow context in AI-optimized markdown format.

View File

@@ -13,6 +13,7 @@ import (
var quickCmd = &cobra.Command{ var quickCmd = &cobra.Command{
Use: "q [title]", Use: "q [title]",
GroupID: "issues",
Short: "Quick capture: create issue and output only ID", Short: "Quick capture: create issue and output only ID",
Long: `Quick capture creates an issue and outputs only the issue ID. Long: `Quick capture creates an issue and outputs only the issue ID.
Designed for scripting and AI agent integration. Designed for scripting and AI agent integration.

View File

@@ -13,6 +13,7 @@ import (
var repoCmd = &cobra.Command{ var repoCmd = &cobra.Command{
Use: "repo", Use: "repo",
GroupID: "advanced",
Short: "Manage multiple repository configuration", Short: "Manage multiple repository configuration",
Long: `Configure and manage multiple repository support for multi-clone sync. Long: `Configure and manage multiple repository support for multi-clone sync.

View File

@@ -16,6 +16,7 @@ import (
var searchCmd = &cobra.Command{ var searchCmd = &cobra.Command{
Use: "search [query]", Use: "search [query]",
GroupID: "issues",
Short: "Search issues by text query", Short: "Search issues by text query",
Long: `Search issues across title, description, and ID. Long: `Search issues across title, description, and ID.

View File

@@ -14,6 +14,7 @@ var (
var setupCmd = &cobra.Command{ var setupCmd = &cobra.Command{
Use: "setup", Use: "setup",
GroupID: "setup",
Short: "Setup integration with AI editors", Short: "Setup integration with AI editors",
Long: `Setup integration files for AI editors like Claude Code, Cursor, Aider, and Factory.ai Droid.`, Long: `Setup integration files for AI editors like Claude Code, Cursor, Aider, and Factory.ai Droid.`,
} }

View File

@@ -1,16 +1,19 @@
package main package main
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"os" "os"
"time" "time"
"github.com/fatih/color"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/steveyegge/beads/internal/rpc" "github.com/steveyegge/beads/internal/rpc"
"github.com/steveyegge/beads/internal/types" "github.com/steveyegge/beads/internal/types"
"github.com/steveyegge/beads/internal/ui"
) )
var staleCmd = &cobra.Command{ var staleCmd = &cobra.Command{
Use: "stale", Use: "stale",
GroupID: "views",
Short: "Show stale issues (not updated recently)", Short: "Show stale issues (not updated recently)",
Long: `Show issues that haven't been updated recently and may need attention. Long: `Show issues that haven't been updated recently and may need attention.
This helps identify: This helps identify:
@@ -88,17 +91,15 @@ This helps identify:
} }
func displayStaleIssues(issues []*types.Issue, days int) { func displayStaleIssues(issues []*types.Issue, days int) {
if len(issues) == 0 { if len(issues) == 0 {
green := color.New(color.FgGreen).SprintFunc() fmt.Printf("\n%s No stale issues found (all active)\n\n", ui.RenderPass("✨"))
fmt.Printf("\n%s No stale issues found (all active)\n\n", green("✨"))
return return
} }
yellow := color.New(color.FgYellow).SprintFunc() fmt.Printf("\n%s Stale issues (%d not updated in %d+ days):\n\n", ui.RenderWarn("⏰"), len(issues), days)
fmt.Printf("\n%s Stale issues (%d not updated in %d+ days):\n\n", yellow("⏰"), len(issues), days)
now := time.Now() now := time.Now()
for i, issue := range issues { for i, issue := range issues {
daysStale := int(now.Sub(issue.UpdatedAt).Hours() / 24) daysStale := int(now.Sub(issue.UpdatedAt).Hours() / 24)
fmt.Printf("%d. [P%d] %s: %s\n", i+1, issue.Priority, issue.ID, issue.Title) fmt.Printf("%d. [%s] %s: %s\n", i+1, ui.RenderPriority(issue.Priority), ui.RenderID(issue.ID), issue.Title)
fmt.Printf(" Status: %s, Last updated: %d days ago\n", issue.Status, daysStale) fmt.Printf(" Status: %s, Last updated: %d days ago\n", ui.RenderStatus(string(issue.Status)), daysStale)
if issue.Assignee != "" { if issue.Assignee != "" {
fmt.Printf(" Assignee: %s\n", issue.Assignee) fmt.Printf(" Assignee: %s\n", issue.Assignee)
} }

View File

@@ -42,6 +42,7 @@ type RecentActivitySummary struct {
var statusCmd = &cobra.Command{ var statusCmd = &cobra.Command{
Use: "status", Use: "status",
GroupID: "views",
Short: "Show issue database overview", Short: "Show issue database overview",
Long: `Show a quick snapshot of the issue database state. Long: `Show a quick snapshot of the issue database state.

View File

@@ -24,6 +24,7 @@ import (
var syncCmd = &cobra.Command{ var syncCmd = &cobra.Command{
Use: "sync", Use: "sync",
GroupID: "sync",
Short: "Synchronize issues with git remote", Short: "Synchronize issues with git remote",
Long: `Synchronize issues with git remote in a single operation: Long: `Synchronize issues with git remote in a single operation:
1. Export pending changes to JSONL 1. Export pending changes to JSONL

View File

@@ -1,5 +1,6 @@
#!/bin/sh #!/bin/sh
# bd-shim v1 # bd-shim v1
# bd-hooks-version: 0.30.7
# #
# bd (beads) pre-commit hook - thin shim # bd (beads) pre-commit hook - thin shim
# #

View File

@@ -11,6 +11,7 @@ import (
var upgradeCmd = &cobra.Command{ var upgradeCmd = &cobra.Command{
Use: "upgrade", Use: "upgrade",
GroupID: "maint",
Short: "Check and manage bd version upgrades", Short: "Check and manage bd version upgrades",
Long: `Commands for checking bd version upgrades and reviewing changes. Long: `Commands for checking bd version upgrades and reviewing changes.

View File

@@ -1,7 +1,7 @@
{ pkgs, self }: { pkgs, self }:
pkgs.buildGoModule { pkgs.buildGoModule {
pname = "beads"; pname = "beads";
version = "0.30.2"; version = "0.30.7";
src = self; src = self;
@@ -9,7 +9,7 @@ pkgs.buildGoModule {
subPackages = [ "cmd/bd" ]; subPackages = [ "cmd/bd" ];
doCheck = false; doCheck = false;
# Go module dependencies hash (computed via nix build) # Go module dependencies hash (computed via nix build)
vendorHash = "sha256-Gyj/Vs3IEWPwqzfNoNBSL4VFifEhjnltlr1AROwGPc4="; vendorHash = "sha256-RDH0YU4GblmS87VCCYVv0FlrW/cxMlcnkRNaHZ2DT4Q=";
# Git is required for tests # Git is required for tests
nativeBuildInputs = [ pkgs.git ]; nativeBuildInputs = [ pkgs.git ];