Enable daemon RPC support for delete operations to trigger auto-sync, Fix for issue #527 (#528)

Enable daemon RPC support for delete operations to trigger auto-sync.

This PR adds delete operation support to the RPC daemon, ensuring that delete operations emit mutation events and trigger auto-sync like other mutating operations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
This commit is contained in:
Charles P. Cross
2025-12-12 16:19:31 -05:00
committed by GitHub
parent 454e8f5f9a
commit 8af08460a7
6 changed files with 346 additions and 19 deletions

View File

@@ -409,6 +409,98 @@ func (s *Server) handleClose(req *Request) Response {
}
}
func (s *Server) handleDelete(req *Request) Response {
var deleteArgs DeleteArgs
if err := json.Unmarshal(req.Args, &deleteArgs); err != nil {
return Response{
Success: false,
Error: fmt.Sprintf("invalid delete args: %v", err),
}
}
store := s.storage
if store == nil {
return Response{
Success: false,
Error: "storage not available (global daemon deprecated - use local daemon instead with 'bd daemon' in your project)",
}
}
// Validate that we have issue IDs to delete
if len(deleteArgs.IDs) == 0 {
return Response{
Success: false,
Error: "no issue IDs provided for deletion",
}
}
// DryRun mode: just return what would be deleted
if deleteArgs.DryRun {
data, _ := json.Marshal(map[string]interface{}{
"dry_run": true,
"issue_count": len(deleteArgs.IDs),
"issues": deleteArgs.IDs,
})
return Response{
Success: true,
Data: data,
}
}
ctx := s.reqCtx(req)
deletedCount := 0
errors := make([]string, 0)
// Delete each issue
for _, issueID := range deleteArgs.IDs {
// Verify issue exists before deleting
issue, err := store.GetIssue(ctx, issueID)
if err != nil {
errors = append(errors, fmt.Sprintf("%s: %v", issueID, err))
continue
}
if issue == nil {
errors = append(errors, fmt.Sprintf("%s: not found", issueID))
continue
}
// Delete the issue
if err := store.DeleteIssue(ctx, issueID); err != nil {
errors = append(errors, fmt.Sprintf("%s: %v", issueID, err))
continue
}
// Emit mutation event for event-driven daemon
s.emitMutation(MutationDelete, issueID)
deletedCount++
}
// Build response
result := map[string]interface{}{
"deleted_count": deletedCount,
"total_count": len(deleteArgs.IDs),
}
if len(errors) > 0 {
result["errors"] = errors
if deletedCount == 0 {
// All deletes failed
return Response{
Success: false,
Error: fmt.Sprintf("failed to delete all issues: %v", errors),
}
}
// Partial success
result["partial_success"] = true
}
data, _ := json.Marshal(result)
return Response{
Success: true,
Data: data,
}
}
func (s *Server) handleList(req *Request) Response {
var listArgs ListArgs
if err := json.Unmarshal(req.Args, &listArgs); err != nil {