Add comments feature (bd-162)
- Add comments table to SQLite schema - Add Comment type to internal/types - Implement AddIssueComment and GetIssueComments in storage layer - Update JSONL export/import to include comments - Add comments to 'bd show' output - Create 'bd comments' CLI command structure - Fix UpdateIssueID to update comments table and defer FK checks - Add GetIssueComments/AddIssueComment to Storage interface Note: CLI command needs daemon RPC support (tracked in bd-163) Amp-Thread-ID: https://ampcode.com/threads/T-ece10dd1-cf64-48ff-9adb-dd304d0bcb25 Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
137
cmd/bd/comments.go
Normal file
137
cmd/bd/comments.go
Normal file
@@ -0,0 +1,137 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/user"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var commentsCmd = &cobra.Command{
|
||||
Use: "comments [issue-id]",
|
||||
Short: "View or manage comments on an issue",
|
||||
Long: `View or manage comments on an issue.
|
||||
|
||||
Examples:
|
||||
# List all comments on an issue
|
||||
bd comments bd-123
|
||||
|
||||
# List comments in JSON format
|
||||
bd comments bd-123 --json
|
||||
|
||||
# Add a comment
|
||||
bd comments add bd-123 "This is a comment"
|
||||
|
||||
# Add a comment from a file
|
||||
bd comments add bd-123 -f notes.txt`,
|
||||
Args: cobra.MinimumNArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
issueID := args[0]
|
||||
ctx := context.Background()
|
||||
|
||||
// Get comments
|
||||
comments, err := store.GetIssueComments(ctx, issueID)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error getting comments: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if jsonOutput {
|
||||
data, err := json.MarshalIndent(comments, "", " ")
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error encoding JSON: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Println(string(data))
|
||||
return
|
||||
}
|
||||
|
||||
// Human-readable output
|
||||
if len(comments) == 0 {
|
||||
fmt.Printf("No comments on %s\n", issueID)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("\nComments on %s:\n\n", issueID)
|
||||
for _, comment := range comments {
|
||||
fmt.Printf("[%s] %s at %s\n", comment.Author, comment.Text, comment.CreatedAt.Format("2006-01-02 15:04"))
|
||||
fmt.Println()
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
var commentsAddCmd = &cobra.Command{
|
||||
Use: "add [issue-id] [text]",
|
||||
Short: "Add a comment to an issue",
|
||||
Long: `Add a comment to an issue.
|
||||
|
||||
Examples:
|
||||
# Add a comment
|
||||
bd comments add bd-123 "Working on this now"
|
||||
|
||||
# Add a comment from a file
|
||||
bd comments add bd-123 -f notes.txt`,
|
||||
Args: cobra.MinimumNArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
issueID := args[0]
|
||||
|
||||
// Get comment text from flag or argument
|
||||
commentText, _ := cmd.Flags().GetString("file")
|
||||
if commentText != "" {
|
||||
// Read from file
|
||||
data, err := os.ReadFile(commentText)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error reading file: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
commentText = string(data)
|
||||
} else if len(args) < 2 {
|
||||
fmt.Fprintf(os.Stderr, "Error: comment text required (use -f to read from file)\n")
|
||||
os.Exit(1)
|
||||
} else {
|
||||
commentText = args[1]
|
||||
}
|
||||
|
||||
// Get author from environment or system
|
||||
author := os.Getenv("BD_AUTHOR")
|
||||
if author == "" {
|
||||
author = os.Getenv("USER")
|
||||
}
|
||||
if author == "" {
|
||||
if u, err := user.Current(); err == nil {
|
||||
author = u.Username
|
||||
} else {
|
||||
author = "unknown"
|
||||
}
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
comment, err := store.AddIssueComment(ctx, issueID, author, commentText)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error adding comment: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if jsonOutput {
|
||||
data, err := json.MarshalIndent(comment, "", " ")
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error encoding JSON: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Println(string(data))
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("Comment added to %s\n", issueID)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
commentsCmd.AddCommand(commentsAddCmd)
|
||||
commentsAddCmd.Flags().StringP("file", "f", "", "Read comment text from file")
|
||||
rootCmd.AddCommand(commentsCmd)
|
||||
}
|
||||
Reference in New Issue
Block a user