feat(beads): add Release function and gt release command
Implement step recovery mechanism for stuck molecule steps (MVP): - Add Release() and ReleaseWithReason() to beads wrapper - Create gt release command to move in_progress → open - Clears assignee so step can be claimed by another worker - Optionally adds reason as note for tracking Usage: gt release <id> # Release single issue gt release <id> -r "why" # Release with reason This enables nondeterministic idempotence - stuck steps can be safely recovered and retried by releasing and reclaiming. Closes gt-g44u.4 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -321,6 +321,27 @@ func (b *Beads) CloseWithReason(reason string, ids ...string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// Release moves an in_progress issue back to open status.
|
||||
// This is used to recover stuck steps when a worker dies mid-task.
|
||||
// It clears the assignee so the step can be claimed by another worker.
|
||||
func (b *Beads) Release(id string) error {
|
||||
return b.ReleaseWithReason(id, "")
|
||||
}
|
||||
|
||||
// ReleaseWithReason moves an in_progress issue back to open status with a reason.
|
||||
// The reason is added as a note to the issue for tracking purposes.
|
||||
func (b *Beads) ReleaseWithReason(id, reason string) error {
|
||||
args := []string{"update", id, "--status=open", "--assignee="}
|
||||
|
||||
// Add reason as a note if provided
|
||||
if reason != "" {
|
||||
args = append(args, "--notes=Released: "+reason)
|
||||
}
|
||||
|
||||
_, err := b.run(args...)
|
||||
return err
|
||||
}
|
||||
|
||||
// AddDependency adds a dependency: issue depends on dependsOn.
|
||||
func (b *Beads) AddDependency(issue, dependsOn string) error {
|
||||
_, err := b.run("dep", "add", issue, dependsOn)
|
||||
|
||||
Reference in New Issue
Block a user