groove-dev 0.25.11 → 0.25.13

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.
@@ -308,14 +308,14 @@ export class Daemon {
308
308
  const initMapCreated = this.indexer.generateInitMap();
309
309
  if (initMapCreated) {
310
310
  console.log('[Groove] Init map generated — GROOVE_PROJECT_MAP.md');
311
- // Seed journalist with the init map so it maintains it from here
312
- this.journalist.seedFromInitMap();
313
- // Record the init scan as a cold-start skip — the first planner
314
- // will read the map instead of spending 8K+ tokens scanning
315
311
  this.tokens.recordColdStartSkipped();
316
312
  this.audit.log('init.map', { stats: this.indexer.getStatus().stats });
317
313
  }
318
314
 
315
+ // Always seed journalist from existing map so getLastSynthesis()
316
+ // returns data on every startup (not just first run)
317
+ this.journalist.seedFromInitMap();
318
+
319
319
  resolvePromise(this);
320
320
  });
321
321
  });
@@ -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
@@ -258,14 +258,24 @@ export class ProcessManager {
258
258
  const rolePrompt = ROLE_PROMPTS[agent.role];
259
259
  if (rolePrompt) {
260
260
  if (!spawnConfig.prompt) {
261
- 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.`;
262
270
  } else if (spawnConfig.prompt.startsWith('# Agent Handoff Brief')) {
263
271
  spawnConfig.prompt += '\n\n## Role Constraints\n\n' + rolePrompt.trim();
264
272
  } else {
265
273
  spawnConfig.prompt = rolePrompt + 'Task: ' + spawnConfig.prompt;
266
274
  }
267
275
  } else if (!spawnConfig.prompt) {
268
- 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.`;
269
279
  }
270
280
 
271
281
  // Inject skill content into the prompt
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.25.11",
3
+ "version": "0.25.13",
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)",
@@ -308,14 +308,14 @@ export class Daemon {
308
308
  const initMapCreated = this.indexer.generateInitMap();
309
309
  if (initMapCreated) {
310
310
  console.log('[Groove] Init map generated — GROOVE_PROJECT_MAP.md');
311
- // Seed journalist with the init map so it maintains it from here
312
- this.journalist.seedFromInitMap();
313
- // Record the init scan as a cold-start skip — the first planner
314
- // will read the map instead of spending 8K+ tokens scanning
315
311
  this.tokens.recordColdStartSkipped();
316
312
  this.audit.log('init.map', { stats: this.indexer.getStatus().stats });
317
313
  }
318
314
 
315
+ // Always seed journalist from existing map so getLastSynthesis()
316
+ // returns data on every startup (not just first run)
317
+ this.journalist.seedFromInitMap();
318
+
319
319
  resolvePromise(this);
320
320
  });
321
321
  });
@@ -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
@@ -258,14 +258,24 @@ export class ProcessManager {
258
258
  const rolePrompt = ROLE_PROMPTS[agent.role];
259
259
  if (rolePrompt) {
260
260
  if (!spawnConfig.prompt) {
261
- 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.`;
262
270
  } else if (spawnConfig.prompt.startsWith('# Agent Handoff Brief')) {
263
271
  spawnConfig.prompt += '\n\n## Role Constraints\n\n' + rolePrompt.trim();
264
272
  } else {
265
273
  spawnConfig.prompt = rolePrompt + 'Task: ' + spawnConfig.prompt;
266
274
  }
267
275
  } else if (!spawnConfig.prompt) {
268
- 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.`;
269
279
  }
270
280
 
271
281
  // Inject skill content into the prompt