feat: Add mol_type schema field for molecule type classification (bd-oxgi)
Add mol_type field to beads for swarm coordination: - Values: 'swarm' (multi-polecat), 'patrol' (recurring ops), 'work' (default) - Nullable, defaults to empty string (treated as 'work') Changes: - Add mol_type column to SQLite schema and migration 031 - Add MolType type with IsValid() validation in types.go - Update insertIssue/GetIssue to handle mol_type - Add --mol-type flag to create command - Add mol_type filtering to list and ready commands - Update RPC protocol for daemon mode support - Update test schema in migrations_test.go 🤝 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -112,6 +112,14 @@ var createCmd = &cobra.Command{
|
||||
rigOverride, _ := cmd.Flags().GetString("rig")
|
||||
prefixOverride, _ := cmd.Flags().GetString("prefix")
|
||||
wisp, _ := cmd.Flags().GetBool("ephemeral")
|
||||
molTypeStr, _ := cmd.Flags().GetString("mol-type")
|
||||
var molType types.MolType
|
||||
if molTypeStr != "" {
|
||||
molType = types.MolType(molTypeStr)
|
||||
if !molType.IsValid() {
|
||||
FatalError("invalid mol-type %q (must be swarm, patrol, or work)", molTypeStr)
|
||||
}
|
||||
}
|
||||
|
||||
// Handle --rig or --prefix flag: create issue in a different rig
|
||||
// Both flags use the same forgiving lookup (accepts rig names or prefixes)
|
||||
@@ -249,6 +257,7 @@ var createCmd = &cobra.Command{
|
||||
WaitsForGate: waitsForGate,
|
||||
Ephemeral: wisp,
|
||||
CreatedBy: getActorWithGit(),
|
||||
MolType: string(molType),
|
||||
}
|
||||
|
||||
resp, err := daemonClient.Create(createArgs)
|
||||
@@ -295,6 +304,7 @@ var createCmd = &cobra.Command{
|
||||
EstimatedMinutes: estimatedMinutes,
|
||||
Ephemeral: wisp,
|
||||
CreatedBy: getActorWithGit(),
|
||||
MolType: molType,
|
||||
}
|
||||
|
||||
ctx := rootCtx
|
||||
@@ -476,6 +486,7 @@ func init() {
|
||||
createCmd.Flags().String("prefix", "", "Create issue in rig by prefix (e.g., --prefix bd- or --prefix bd or --prefix beads)")
|
||||
createCmd.Flags().IntP("estimate", "e", 0, "Time estimate in minutes (e.g., 60 for 1 hour)")
|
||||
createCmd.Flags().Bool("ephemeral", false, "Create as ephemeral (ephemeral, not exported to JSONL)")
|
||||
createCmd.Flags().String("mol-type", "", "Molecule type: swarm (multi-polecat), patrol (recurring ops), work (default)")
|
||||
// Note: --json flag is defined as a persistent flag in main.go, not here
|
||||
rootCmd.AddCommand(createCmd)
|
||||
}
|
||||
|
||||
@@ -356,6 +356,18 @@ var listCmd = &cobra.Command{
|
||||
// Parent filtering
|
||||
parentID, _ := cmd.Flags().GetString("parent")
|
||||
|
||||
// Molecule type filtering
|
||||
molTypeStr, _ := cmd.Flags().GetString("mol-type")
|
||||
var molType *types.MolType
|
||||
if molTypeStr != "" {
|
||||
mt := types.MolType(molTypeStr)
|
||||
if !mt.IsValid() {
|
||||
fmt.Fprintf(os.Stderr, "Error: invalid mol-type %q (must be swarm, patrol, or work)\n", molTypeStr)
|
||||
os.Exit(1)
|
||||
}
|
||||
molType = &mt
|
||||
}
|
||||
|
||||
// Pretty and watch flags (GH#654)
|
||||
prettyFormat, _ := cmd.Flags().GetBool("pretty")
|
||||
watchMode, _ := cmd.Flags().GetBool("watch")
|
||||
@@ -533,6 +545,11 @@ var listCmd = &cobra.Command{
|
||||
filter.ParentID = &parentID
|
||||
}
|
||||
|
||||
// Molecule type filtering
|
||||
if molType != nil {
|
||||
filter.MolType = molType
|
||||
}
|
||||
|
||||
// Check database freshness before reading
|
||||
// Skip check when using daemon (daemon auto-imports on staleness)
|
||||
ctx := rootCtx
|
||||
@@ -906,6 +923,9 @@ func init() {
|
||||
// Parent filtering: filter children by parent issue
|
||||
listCmd.Flags().String("parent", "", "Filter by parent issue ID (shows children of specified issue)")
|
||||
|
||||
// Molecule type filtering
|
||||
listCmd.Flags().String("mol-type", "", "Filter by molecule type: swarm, patrol, or work")
|
||||
|
||||
// Pretty and watch flags (GH#654)
|
||||
listCmd.Flags().Bool("pretty", false, "Display issues in a tree format with status/priority symbols")
|
||||
listCmd.Flags().BoolP("watch", "w", false, "Watch for changes and auto-update display (implies --pretty)")
|
||||
|
||||
@@ -40,6 +40,16 @@ This is useful for agents executing molecules to see which steps can run next.`,
|
||||
labelsAny, _ := cmd.Flags().GetStringSlice("label-any")
|
||||
issueType, _ := cmd.Flags().GetString("type")
|
||||
parentID, _ := cmd.Flags().GetString("parent")
|
||||
molTypeStr, _ := cmd.Flags().GetString("mol-type")
|
||||
var molType *types.MolType
|
||||
if molTypeStr != "" {
|
||||
mt := types.MolType(molTypeStr)
|
||||
if !mt.IsValid() {
|
||||
fmt.Fprintf(os.Stderr, "Error: invalid mol-type %q (must be swarm, patrol, or work)\n", molTypeStr)
|
||||
os.Exit(1)
|
||||
}
|
||||
molType = &mt
|
||||
}
|
||||
// Use global jsonOutput set by PersistentPreRun (respects config.yaml + env vars)
|
||||
|
||||
// Normalize labels: trim, dedupe, remove empty
|
||||
@@ -73,6 +83,9 @@ This is useful for agents executing molecules to see which steps can run next.`,
|
||||
if parentID != "" {
|
||||
filter.ParentID = &parentID
|
||||
}
|
||||
if molType != nil {
|
||||
filter.MolType = molType
|
||||
}
|
||||
// Validate sort policy
|
||||
if !filter.SortPolicy.IsValid() {
|
||||
fmt.Fprintf(os.Stderr, "Error: invalid sort policy '%s'. Valid values: hybrid, priority, oldest\n", sortPolicy)
|
||||
@@ -89,6 +102,7 @@ This is useful for agents executing molecules to see which steps can run next.`,
|
||||
Labels: labels,
|
||||
LabelsAny: labelsAny,
|
||||
ParentID: parentID,
|
||||
MolType: molTypeStr,
|
||||
}
|
||||
if cmd.Flags().Changed("priority") {
|
||||
priority, _ := cmd.Flags().GetInt("priority")
|
||||
@@ -421,6 +435,7 @@ func init() {
|
||||
readyCmd.Flags().StringP("type", "t", "", "Filter by issue type (task, bug, feature, epic, merge-request)")
|
||||
readyCmd.Flags().String("mol", "", "Filter to steps within a specific molecule")
|
||||
readyCmd.Flags().String("parent", "", "Filter to descendants of this bead/epic")
|
||||
readyCmd.Flags().String("mol-type", "", "Filter by molecule type: swarm, patrol, or work")
|
||||
rootCmd.AddCommand(readyCmd)
|
||||
blockedCmd.Flags().String("parent", "", "Filter to descendants of this bead/epic")
|
||||
rootCmd.AddCommand(blockedCmd)
|
||||
|
||||
Reference in New Issue
Block a user