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.
- package/node_modules/@groove-dev/daemon/src/api.js +2 -2
- package/node_modules/@groove-dev/daemon/src/introducer.js +6 -3
- package/node_modules/@groove-dev/daemon/src/process.js +13 -6
- package/node_modules/@groove-dev/daemon/src/validate.js +1 -1
- package/package.json +1 -1
- package/packages/daemon/src/api.js +2 -2
- package/packages/daemon/src/introducer.js +6 -3
- package/packages/daemon/src/process.js +13 -6
- package/packages/daemon/src/validate.js +1 -1
|
@@ -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 ||
|
|
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 ||
|
|
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
|
-
//
|
|
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
|
|
@@ -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 +
|
|
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.
|
|
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 ||
|
|
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.
|
|
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 ||
|
|
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 ||
|
|
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
|
-
//
|
|
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
|
|
@@ -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 +
|
|
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.
|
|
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 ||
|
|
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,
|