groove-dev 0.22.6 → 0.22.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -258,10 +258,3 @@ Fully functional multi-agent orchestration system with complete GUI v2 rebuild.
258
258
  - Monitor/QC agent mode (stay active, loop)
259
259
  - Semantic degradation detection
260
260
  - Distribution: demo video, HN launch, Twitter content
261
-
262
- <!-- GROOVE:START -->
263
- ## GROOVE Orchestration (auto-injected)
264
- Active agents: 0
265
- See AGENTS_REGISTRY.md for full agent state.
266
- **Memory policy:** Ignore auto-memory. Do not read or write MEMORY.md. GROOVE manages all context.
267
- <!-- GROOVE:END -->
@@ -1470,6 +1470,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
1470
1470
  }
1471
1471
 
1472
1472
  const defaultDir = daemon.config?.defaultWorkingDir || undefined;
1473
+ const defaultTeamId = daemon.teams.getDefault()?.id || null;
1473
1474
 
1474
1475
  // Separate phase 1 (builders) and phase 2 (QC/finisher)
1475
1476
  const phase1 = agents.filter((a) => !a.phase || a.phase === 1);
@@ -1485,21 +1486,28 @@ Keep responses concise. Help them think, don't lecture them about the system the
1485
1486
 
1486
1487
  // Spawn phase 1 agents immediately
1487
1488
  const spawned = [];
1489
+ const failed = [];
1488
1490
  const phase1Ids = [];
1489
1491
  for (const config of phase1) {
1490
- const validated = validateAgentConfig({
1491
- role: config.role,
1492
- scope: config.scope || [],
1493
- prompt: config.prompt || '',
1494
- provider: config.provider || 'claude-code',
1495
- model: config.model || 'auto',
1496
- permission: config.permission || 'auto',
1497
- workingDir: config.workingDir || defaultDir,
1498
- name: config.name || undefined,
1499
- });
1500
- const agent = await daemon.processes.spawn(validated);
1501
- spawned.push({ id: agent.id, name: agent.name, role: agent.role });
1502
- phase1Ids.push(agent.id);
1492
+ try {
1493
+ const validated = validateAgentConfig({
1494
+ role: config.role,
1495
+ scope: config.scope || [],
1496
+ prompt: config.prompt || '',
1497
+ provider: config.provider || 'claude-code',
1498
+ model: config.model || 'auto',
1499
+ permission: config.permission || 'auto',
1500
+ workingDir: config.workingDir || defaultDir,
1501
+ name: config.name || undefined,
1502
+ });
1503
+ validated.teamId = defaultTeamId;
1504
+ const agent = await daemon.processes.spawn(validated);
1505
+ spawned.push({ id: agent.id, name: agent.name, role: agent.role });
1506
+ phase1Ids.push(agent.id);
1507
+ } catch (err) {
1508
+ failed.push({ role: config.role, error: err.message });
1509
+ console.log(`[Groove] Failed to spawn ${config.role}: ${err.message}`);
1510
+ }
1503
1511
  }
1504
1512
 
1505
1513
  // If there are phase 2 agents, register them for auto-spawn on phase 1 completion
@@ -1513,15 +1521,16 @@ Keep responses concise. Help them think, don't lecture them about the system the
1513
1521
  permission: c.permission || 'auto',
1514
1522
  workingDir: c.workingDir || defaultDir,
1515
1523
  name: c.name || undefined,
1524
+ teamId: defaultTeamId,
1516
1525
  })),
1517
1526
  });
1518
1527
  }
1519
1528
 
1520
1529
  daemon.audit.log('team.launch', {
1521
- phase1: spawned.length, phase2Pending: phase2.length,
1530
+ phase1: spawned.length, phase2Pending: phase2.length, failed: failed.length,
1522
1531
  agents: spawned.map((a) => a.role),
1523
1532
  });
1524
- res.json({ launched: spawned.length, phase2Pending: phase2.length, agents: spawned });
1533
+ res.json({ launched: spawned.length, phase2Pending: phase2.length, agents: spawned, failed });
1525
1534
  } catch (err) {
1526
1535
  res.status(500).json({ error: err.message });
1527
1536
  }
@@ -775,6 +775,7 @@ export class GatewayManager {
775
775
 
776
776
  const agents = plan.agents;
777
777
  const defaultDir = this.daemon.config?.defaultWorkingDir || undefined;
778
+ const defaultTeamId = this.daemon.teams.getDefault()?.id || null;
778
779
 
779
780
  // Separate phases
780
781
  const phase1 = agents.filter((a) => !a.phase || a.phase === 1);
@@ -804,6 +805,7 @@ export class GatewayManager {
804
805
  workingDir: config.workingDir || defaultDir,
805
806
  name: config.name || undefined,
806
807
  });
808
+ validated.teamId = defaultTeamId;
807
809
  const agent = await this.daemon.processes.spawn(validated);
808
810
  spawned.push(agent);
809
811
  phase1Ids.push(agent.id);
@@ -823,6 +825,7 @@ export class GatewayManager {
823
825
  permission: c.permission || 'auto',
824
826
  workingDir: c.workingDir || defaultDir,
825
827
  name: c.name || undefined,
828
+ teamId: defaultTeamId,
826
829
  })),
827
830
  });
828
831
  }