Implement handoffs using pinned beads (gt-cu7r)
Replace mail-based handoff system with pinned beads that persist across sessions. This fixes the issue where handoff messages get closed before successors can read them. Changes: - beads: Add StatusPinned constant and handoff functions: - HandoffBeadTitle() for well-known naming - FindHandoffBead() to locate role handoff bead - GetOrCreateHandoffBead() to ensure bead exists - UpdateHandoffContent() to set handoff message - ClearHandoffContent() to reset after reading - cmd/handoff: Update to use pinned beads instead of mail - sendHandoffMail() now updates pinned bead content - cmd/prime: Display handoff content on startup - outputHandoffContent() reads and shows handoff bead - cmd/rig: Add reset command with --handoff flag - gt rig reset --handoff clears handoff content Generated with Claude Code Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/steveyegge/gastown/internal/beads"
|
||||
"github.com/steveyegge/gastown/internal/config"
|
||||
"github.com/steveyegge/gastown/internal/git"
|
||||
"github.com/steveyegge/gastown/internal/rig"
|
||||
@@ -63,10 +64,25 @@ var rigRemoveCmd = &cobra.Command{
|
||||
RunE: runRigRemove,
|
||||
}
|
||||
|
||||
var rigResetCmd = &cobra.Command{
|
||||
Use: "reset",
|
||||
Short: "Reset rig state (handoff content, etc.)",
|
||||
Long: `Reset various rig state.
|
||||
|
||||
By default, resets all resettable state. Use flags to reset specific items.
|
||||
|
||||
Examples:
|
||||
gt rig reset # Reset all state
|
||||
gt rig reset --handoff # Clear handoff content only`,
|
||||
RunE: runRigReset,
|
||||
}
|
||||
|
||||
// Flags
|
||||
var (
|
||||
rigAddPrefix string
|
||||
rigAddCrew string
|
||||
rigAddPrefix string
|
||||
rigAddCrew string
|
||||
rigResetHandoff bool
|
||||
rigResetRole string
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -74,9 +90,13 @@ func init() {
|
||||
rigCmd.AddCommand(rigAddCmd)
|
||||
rigCmd.AddCommand(rigListCmd)
|
||||
rigCmd.AddCommand(rigRemoveCmd)
|
||||
rigCmd.AddCommand(rigResetCmd)
|
||||
|
||||
rigAddCmd.Flags().StringVar(&rigAddPrefix, "prefix", "", "Beads issue prefix (default: derived from name)")
|
||||
rigAddCmd.Flags().StringVar(&rigAddCrew, "crew", "main", "Default crew workspace name")
|
||||
|
||||
rigResetCmd.Flags().BoolVar(&rigResetHandoff, "handoff", false, "Clear handoff content")
|
||||
rigResetCmd.Flags().StringVar(&rigResetRole, "role", "", "Role to reset (default: auto-detect from cwd)")
|
||||
}
|
||||
|
||||
func runRigAdd(cmd *cobra.Command, args []string) error {
|
||||
@@ -238,6 +258,45 @@ func runRigRemove(cmd *cobra.Command, args []string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func runRigReset(cmd *cobra.Command, args []string) error {
|
||||
// Find workspace
|
||||
townRoot, err := workspace.FindFromCwdOrError()
|
||||
if err != nil {
|
||||
return fmt.Errorf("not in a Gas Town workspace: %w", err)
|
||||
}
|
||||
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return fmt.Errorf("getting current directory: %w", err)
|
||||
}
|
||||
|
||||
// Determine role to reset
|
||||
roleKey := rigResetRole
|
||||
if roleKey == "" {
|
||||
// Auto-detect from cwd
|
||||
ctx := detectRole(cwd, townRoot)
|
||||
if ctx.Role == RoleUnknown {
|
||||
return fmt.Errorf("could not detect role from current directory; use --role to specify")
|
||||
}
|
||||
roleKey = string(ctx.Role)
|
||||
}
|
||||
|
||||
// If no specific flags, reset all; otherwise only reset what's specified
|
||||
resetAll := !rigResetHandoff
|
||||
|
||||
bd := beads.New(townRoot)
|
||||
|
||||
// Reset handoff content
|
||||
if resetAll || rigResetHandoff {
|
||||
if err := bd.ClearHandoffContent(roleKey); err != nil {
|
||||
return fmt.Errorf("clearing handoff content: %w", err)
|
||||
}
|
||||
fmt.Printf("%s Cleared handoff content for %s\n", style.Success.Render("✓"), roleKey)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Helper to check if path exists
|
||||
func pathExists(path string) bool {
|
||||
_, err := os.Stat(path)
|
||||
|
||||
Reference in New Issue
Block a user