groove-dev 0.25.10 → 0.25.12

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.
@@ -1637,7 +1637,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
1637
1637
  role: config.role,
1638
1638
  scope: config.scope || [],
1639
1639
  prompt: config.prompt || '',
1640
- provider: config.provider || 'claude-code',
1640
+ provider: config.provider || undefined,
1641
1641
  model: config.model || 'auto',
1642
1642
  permission: config.permission || 'auto',
1643
1643
  workingDir: config.workingDir || projectWorkingDir,
@@ -1660,7 +1660,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
1660
1660
  waitFor: phase1Ids,
1661
1661
  agents: phase2.map((c) => ({
1662
1662
  role: c.role, scope: c.scope || [], prompt: c.prompt || '',
1663
- provider: c.provider || 'claude-code', model: c.model || 'auto',
1663
+ provider: c.provider || undefined, model: c.model || 'auto',
1664
1664
  permission: c.permission || 'auto',
1665
1665
  workingDir: c.workingDir || projectWorkingDir,
1666
1666
  name: c.name || undefined,
@@ -16,9 +16,10 @@ export class Introducer {
16
16
  generateContext(newAgent, options = {}) {
17
17
  const { taskNegotiation } = options;
18
18
  const agents = this.daemon.registry.getAll();
19
- // Include ALL agents (running + completed) so new agents know what the team did
19
+ // Only include ACTIVE agents not completed/killed ones from previous sessions
20
+ // Completed agents' work is captured in the journalist's project map, not here
20
21
  const others = agents.filter((a) => a.id !== newAgent.id &&
21
- (a.status === 'running' || a.status === 'starting' || a.status === 'completed'));
22
+ (a.status === 'running' || a.status === 'starting'));
22
23
 
23
24
  const lines = [
24
25
  `# GROOVE Agent Context`,
@@ -150,7 +151,9 @@ export class Introducer {
150
151
  const mapPath = resolve(this.daemon.projectDir, 'GROOVE_PROJECT_MAP.md');
151
152
  if (existsSync(mapPath)) {
152
153
  lines.push('');
153
- lines.push(`Read GROOVE_PROJECT_MAP.md for current project context from The Journalist.`);
154
+ lines.push(`## Background Context`);
155
+ lines.push('');
156
+ lines.push(`GROOVE_PROJECT_MAP.md contains a structural overview of this project. This is BACKGROUND INFORMATION ONLY — it is NOT your task. Do not treat existing files or previous work as something you should continue or improve unless the user explicitly asks you to.`);
154
157
  }
155
158
 
156
159
  // Codebase structure injection — give agents instant orientation
@@ -4,7 +4,7 @@
4
4
  import { spawn as cpSpawn } from 'child_process';
5
5
  import { createWriteStream, mkdirSync, chmodSync, existsSync, readFileSync, unlinkSync } from 'fs';
6
6
  import { resolve } from 'path';
7
- import { getProvider } from './providers/index.js';
7
+ import { getProvider, getInstalledProviders } from './providers/index.js';
8
8
  import { validateAgentConfig } from './validate.js';
9
9
 
10
10
  // Role-specific prompt prefixes — applied during spawn regardless of entry point
@@ -168,7 +168,6 @@ export class ProcessManager {
168
168
  // Resolve provider — auto-detect best installed if not specified
169
169
  let providerName = config.provider;
170
170
  if (!providerName) {
171
- const { getInstalledProviders } = await import('./providers/index.js');
172
171
  const installed = getInstalledProviders();
173
172
  if (installed.length === 0) {
174
173
  throw new Error('No AI providers installed. Install Claude Code, Gemini CLI, Codex, or Ollama first.');
@@ -184,8 +183,6 @@ export class ProcessManager {
184
183
  throw new Error(`Unknown provider: ${providerName}`);
185
184
  }
186
185
  if (!provider.constructor.isInstalled()) {
187
- // Try to find any installed provider as fallback
188
- const { getInstalledProviders } = await import('./providers/index.js');
189
186
  const installed = getInstalledProviders();
190
187
  if (installed.length > 0) {
191
188
  throw new Error(
@@ -261,14 +258,24 @@ export class ProcessManager {
261
258
  const rolePrompt = ROLE_PROMPTS[agent.role];
262
259
  if (rolePrompt) {
263
260
  if (!spawnConfig.prompt) {
264
- spawnConfig.prompt = rolePrompt + 'No task has been assigned yet. Introduce yourself briefly and ask the user what they would like you to work on. Stay focused — do not analyze the codebase until given a task.';
261
+ spawnConfig.prompt = rolePrompt + `IMPORTANT: No task has been assigned yet. You MUST wait for the user to tell you what to do.
262
+
263
+ Do NOT:
264
+ - Start building, coding, or creating anything
265
+ - Continue or improve previous agents' work
266
+ - Treat the project map or existing files as your task
267
+ - Analyze the codebase proactively
268
+
269
+ DO: Introduce yourself in one sentence and ask the user what they would like you to work on. Then wait.`;
265
270
  } else if (spawnConfig.prompt.startsWith('# Agent Handoff Brief')) {
266
271
  spawnConfig.prompt += '\n\n## Role Constraints\n\n' + rolePrompt.trim();
267
272
  } else {
268
273
  spawnConfig.prompt = rolePrompt + 'Task: ' + spawnConfig.prompt;
269
274
  }
270
275
  } else if (!spawnConfig.prompt) {
271
- spawnConfig.prompt = `You are a ${agent.role} agent. No task has been assigned yet. Introduce yourself briefly and ask the user what they would like you to work on. Stay focused — do not analyze the codebase until given a task.`;
276
+ spawnConfig.prompt = `You are a ${agent.role} agent.
277
+
278
+ IMPORTANT: No task has been assigned yet. You MUST wait for the user to tell you what to do. Do NOT start building, coding, or continuing previous work. Do NOT treat existing files or the project map as your task. Introduce yourself in one sentence and ask the user what they would like you to work on. Then wait.`;
272
279
  }
273
280
 
274
281
  // Inject skill content into the prompt
@@ -81,7 +81,7 @@ export function validateAgentConfig(config) {
81
81
  name: config.name || undefined,
82
82
  scope: config.scope || [],
83
83
  prompt: config.prompt || '',
84
- provider: config.provider || 'claude-code',
84
+ provider: config.provider || undefined,
85
85
  model: typeof config.model === 'string' ? config.model : null,
86
86
  workingDir: typeof config.workingDir === 'string' ? config.workingDir : undefined,
87
87
  teamId: config.teamId || undefined,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.25.10",
3
+ "version": "0.25.12",
4
4
  "description": "Open-source agent orchestration layer — the AI company OS. MCP integrations (Slack, Gmail, Stripe, 15+), agent scheduling (cron), business roles (CMO, CFO, EA). GUI dashboard, multi-agent coordination, zero cold-start, infinite sessions. Works with Claude Code, Codex, Gemini CLI, Ollama.",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "author": "Groove Dev <hello@groovedev.ai> (https://groovedev.ai)",
@@ -1637,7 +1637,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
1637
1637
  role: config.role,
1638
1638
  scope: config.scope || [],
1639
1639
  prompt: config.prompt || '',
1640
- provider: config.provider || 'claude-code',
1640
+ provider: config.provider || undefined,
1641
1641
  model: config.model || 'auto',
1642
1642
  permission: config.permission || 'auto',
1643
1643
  workingDir: config.workingDir || projectWorkingDir,
@@ -1660,7 +1660,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
1660
1660
  waitFor: phase1Ids,
1661
1661
  agents: phase2.map((c) => ({
1662
1662
  role: c.role, scope: c.scope || [], prompt: c.prompt || '',
1663
- provider: c.provider || 'claude-code', model: c.model || 'auto',
1663
+ provider: c.provider || undefined, model: c.model || 'auto',
1664
1664
  permission: c.permission || 'auto',
1665
1665
  workingDir: c.workingDir || projectWorkingDir,
1666
1666
  name: c.name || undefined,
@@ -16,9 +16,10 @@ export class Introducer {
16
16
  generateContext(newAgent, options = {}) {
17
17
  const { taskNegotiation } = options;
18
18
  const agents = this.daemon.registry.getAll();
19
- // Include ALL agents (running + completed) so new agents know what the team did
19
+ // Only include ACTIVE agents not completed/killed ones from previous sessions
20
+ // Completed agents' work is captured in the journalist's project map, not here
20
21
  const others = agents.filter((a) => a.id !== newAgent.id &&
21
- (a.status === 'running' || a.status === 'starting' || a.status === 'completed'));
22
+ (a.status === 'running' || a.status === 'starting'));
22
23
 
23
24
  const lines = [
24
25
  `# GROOVE Agent Context`,
@@ -150,7 +151,9 @@ export class Introducer {
150
151
  const mapPath = resolve(this.daemon.projectDir, 'GROOVE_PROJECT_MAP.md');
151
152
  if (existsSync(mapPath)) {
152
153
  lines.push('');
153
- lines.push(`Read GROOVE_PROJECT_MAP.md for current project context from The Journalist.`);
154
+ lines.push(`## Background Context`);
155
+ lines.push('');
156
+ lines.push(`GROOVE_PROJECT_MAP.md contains a structural overview of this project. This is BACKGROUND INFORMATION ONLY — it is NOT your task. Do not treat existing files or previous work as something you should continue or improve unless the user explicitly asks you to.`);
154
157
  }
155
158
 
156
159
  // Codebase structure injection — give agents instant orientation
@@ -4,7 +4,7 @@
4
4
  import { spawn as cpSpawn } from 'child_process';
5
5
  import { createWriteStream, mkdirSync, chmodSync, existsSync, readFileSync, unlinkSync } from 'fs';
6
6
  import { resolve } from 'path';
7
- import { getProvider } from './providers/index.js';
7
+ import { getProvider, getInstalledProviders } from './providers/index.js';
8
8
  import { validateAgentConfig } from './validate.js';
9
9
 
10
10
  // Role-specific prompt prefixes — applied during spawn regardless of entry point
@@ -168,7 +168,6 @@ export class ProcessManager {
168
168
  // Resolve provider — auto-detect best installed if not specified
169
169
  let providerName = config.provider;
170
170
  if (!providerName) {
171
- const { getInstalledProviders } = await import('./providers/index.js');
172
171
  const installed = getInstalledProviders();
173
172
  if (installed.length === 0) {
174
173
  throw new Error('No AI providers installed. Install Claude Code, Gemini CLI, Codex, or Ollama first.');
@@ -184,8 +183,6 @@ export class ProcessManager {
184
183
  throw new Error(`Unknown provider: ${providerName}`);
185
184
  }
186
185
  if (!provider.constructor.isInstalled()) {
187
- // Try to find any installed provider as fallback
188
- const { getInstalledProviders } = await import('./providers/index.js');
189
186
  const installed = getInstalledProviders();
190
187
  if (installed.length > 0) {
191
188
  throw new Error(
@@ -261,14 +258,24 @@ export class ProcessManager {
261
258
  const rolePrompt = ROLE_PROMPTS[agent.role];
262
259
  if (rolePrompt) {
263
260
  if (!spawnConfig.prompt) {
264
- spawnConfig.prompt = rolePrompt + 'No task has been assigned yet. Introduce yourself briefly and ask the user what they would like you to work on. Stay focused — do not analyze the codebase until given a task.';
261
+ spawnConfig.prompt = rolePrompt + `IMPORTANT: No task has been assigned yet. You MUST wait for the user to tell you what to do.
262
+
263
+ Do NOT:
264
+ - Start building, coding, or creating anything
265
+ - Continue or improve previous agents' work
266
+ - Treat the project map or existing files as your task
267
+ - Analyze the codebase proactively
268
+
269
+ DO: Introduce yourself in one sentence and ask the user what they would like you to work on. Then wait.`;
265
270
  } else if (spawnConfig.prompt.startsWith('# Agent Handoff Brief')) {
266
271
  spawnConfig.prompt += '\n\n## Role Constraints\n\n' + rolePrompt.trim();
267
272
  } else {
268
273
  spawnConfig.prompt = rolePrompt + 'Task: ' + spawnConfig.prompt;
269
274
  }
270
275
  } else if (!spawnConfig.prompt) {
271
- spawnConfig.prompt = `You are a ${agent.role} agent. No task has been assigned yet. Introduce yourself briefly and ask the user what they would like you to work on. Stay focused — do not analyze the codebase until given a task.`;
276
+ spawnConfig.prompt = `You are a ${agent.role} agent.
277
+
278
+ IMPORTANT: No task has been assigned yet. You MUST wait for the user to tell you what to do. Do NOT start building, coding, or continuing previous work. Do NOT treat existing files or the project map as your task. Introduce yourself in one sentence and ask the user what they would like you to work on. Then wait.`;
272
279
  }
273
280
 
274
281
  // Inject skill content into the prompt
@@ -81,7 +81,7 @@ export function validateAgentConfig(config) {
81
81
  name: config.name || undefined,
82
82
  scope: config.scope || [],
83
83
  prompt: config.prompt || '',
84
- provider: config.provider || 'claude-code',
84
+ provider: config.provider || undefined,
85
85
  model: typeof config.model === 'string' ? config.model : null,
86
86
  workingDir: typeof config.workingDir === 'string' ? config.workingDir : undefined,
87
87
  teamId: config.teamId || undefined,