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.
- package/node_modules/@groove-dev/daemon/src/index.js +4 -4
- package/node_modules/@groove-dev/daemon/src/introducer.js +6 -3
- package/node_modules/@groove-dev/daemon/src/process.js +12 -2
- package/package.json +1 -1
- package/packages/daemon/src/index.js +4 -4
- package/packages/daemon/src/introducer.js +6 -3
- package/packages/daemon/src/process.js +12 -2
|
@@ -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
|
-
//
|
|
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'
|
|
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(
|
|
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 +
|
|
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.
|
|
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.
|
|
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
|
-
//
|
|
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'
|
|
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(
|
|
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 +
|
|
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.
|
|
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
|