@kendoo.agentdesk/agentdesk 0.8.0 → 0.8.2
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/README.md +15 -4
- package/cli/agent-prompts.mjs +6 -1
- package/cli/orchestrator.mjs +7 -0
- package/cli/stream-parser.mjs +6 -0
- package/cli/team.mjs +6 -3
- package/package.json +1 -1
- package/prompts/team.md +5 -0
package/README.md
CHANGED
|
@@ -79,6 +79,7 @@ agentdesk update Update to the latest version
|
|
|
79
79
|
|------|-------------|
|
|
80
80
|
| `--description`, `-d` | Task description or requirements |
|
|
81
81
|
| `--cwd` | Working directory (defaults to current) |
|
|
82
|
+
| `--legacy` | Use single-process mode (cheaper, less independent reasoning) |
|
|
82
83
|
|
|
83
84
|
## Configuration
|
|
84
85
|
|
|
@@ -115,12 +116,22 @@ AgentDesk also auto-discovers agents from `.claude/agents/`, `.claude/commands/`
|
|
|
115
116
|
|
|
116
117
|
## How It Works
|
|
117
118
|
|
|
119
|
+
Each agent runs as its own independent Claude session — not one model role-playing multiple personas. This produces genuine independent reasoning, real disagreements, and better output.
|
|
120
|
+
|
|
118
121
|
1. You run `agentdesk team TASK-ID` in your project directory
|
|
119
122
|
2. AgentDesk detects your project type, reads `CLAUDE.md`, and discovers existing agents
|
|
120
|
-
3. The
|
|
121
|
-
4.
|
|
122
|
-
5.
|
|
123
|
-
6.
|
|
123
|
+
3. The orchestrator manages 5 phases: **Intake** > **Brainstorm** > **Planning** > **Execution** > **Review**
|
|
124
|
+
4. In brainstorm/planning/review, all agents run **in parallel** — each gets their own Claude session
|
|
125
|
+
5. In execution, agents run sequentially: Dennis implements > Sam audits > Luna+Mark review > Vera tests > Bart QA
|
|
126
|
+
6. The session streams live to [agentdesk.live](https://agentdesk.live) where you can watch and send messages to the team
|
|
127
|
+
7. Token usage is tracked and displayed per session
|
|
128
|
+
|
|
129
|
+
### Session Modes
|
|
130
|
+
|
|
131
|
+
| Mode | Command | Description |
|
|
132
|
+
|------|---------|-------------|
|
|
133
|
+
| Sub-agents (default) | `agentdesk team -d "..."` | Each agent is an independent Claude session. Better reasoning, ~4-5x tokens. |
|
|
134
|
+
| Legacy | `agentdesk team -d "..." --legacy` | Single Claude process, all agents as personas. Cheaper, less independent. |
|
|
124
135
|
|
|
125
136
|
## Daemon (Remote Sessions)
|
|
126
137
|
|
package/cli/agent-prompts.mjs
CHANGED
|
@@ -10,7 +10,12 @@ const PHASE_INSTRUCTIONS = {
|
|
|
10
10
|
3. Check for existing PRs: \`gh pr list --search <task-id> --json number,title,state\`
|
|
11
11
|
4. Explore the codebase briefly to understand what we're working with.
|
|
12
12
|
5. Summarize: what needs to be done, what already exists, and what the starting point is.
|
|
13
|
-
6. Recommend which phase to start from (BRAINSTORM for new work, EXECUTION if branch exists)
|
|
13
|
+
6. Recommend which phase to start from (BRAINSTORM for new work, EXECUTION if branch exists).
|
|
14
|
+
|
|
15
|
+
IMPORTANT: At the end of your intake summary, you MUST provide a short title for this session on its own line in this exact format:
|
|
16
|
+
SESSION_TITLE: <4-8 word title>
|
|
17
|
+
Example: SESSION_TITLE: Fix checkout total calculation
|
|
18
|
+
This title will be displayed in the dashboard navbar, so keep it short and descriptive.`,
|
|
14
19
|
},
|
|
15
20
|
|
|
16
21
|
brainstorm: {
|
package/cli/orchestrator.mjs
CHANGED
|
@@ -146,6 +146,13 @@ export async function runOrchestrator({
|
|
|
146
146
|
const intakeResult = await spawnAgent("Jane", jane, "intake");
|
|
147
147
|
state.phaseSummaries.intake = summarizeResults([intakeResult]);
|
|
148
148
|
|
|
149
|
+
// Extract short title from Jane's intake (SESSION_TITLE: ...)
|
|
150
|
+
const titleMatch = intakeResult.rawOutput.match(/SESSION_TITLE:\s*(.+)/);
|
|
151
|
+
if (titleMatch) {
|
|
152
|
+
const shortTitle = titleMatch[1].trim().slice(0, 60);
|
|
153
|
+
emit({ type: "session:update", title: shortTitle });
|
|
154
|
+
}
|
|
155
|
+
|
|
149
156
|
// ===========================
|
|
150
157
|
// PHASE 2: BRAINSTORM (parallel, 3-5 rounds)
|
|
151
158
|
// ===========================
|
package/cli/stream-parser.mjs
CHANGED
|
@@ -84,6 +84,12 @@ export function createStreamParser({ teamNames, callbacks }) {
|
|
|
84
84
|
callbacks.onSessionUpdate?.({ taskId: taskIdMatch[1] });
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
// Detect short title from Jane
|
|
88
|
+
const titleMatch = text.match(/SESSION_TITLE:\s*(.+)/);
|
|
89
|
+
if (titleMatch) {
|
|
90
|
+
callbacks.onSessionUpdate?.({ title: titleMatch[1].trim().slice(0, 60) });
|
|
91
|
+
}
|
|
92
|
+
|
|
87
93
|
const textLines = text.split("\n");
|
|
88
94
|
let i = 0;
|
|
89
95
|
while (i < textLines.length) {
|
package/cli/team.mjs
CHANGED
|
@@ -239,8 +239,11 @@ export async function runTeam(taskId, opts = {}) {
|
|
|
239
239
|
console.log(` ${success ? "✓" : "✗"} ${summary}`);
|
|
240
240
|
vizSend({ type: "tool:result", success, summary });
|
|
241
241
|
},
|
|
242
|
-
onSessionUpdate({ taskId: newTaskId }) {
|
|
243
|
-
if (
|
|
242
|
+
onSessionUpdate({ taskId: newTaskId, title: newTitle }) {
|
|
243
|
+
if (newTitle) {
|
|
244
|
+
vizSend({ type: "session:update", title: newTitle });
|
|
245
|
+
}
|
|
246
|
+
if (newTaskId && createTask) {
|
|
244
247
|
taskId = newTaskId;
|
|
245
248
|
if (tracker === "linear" && config.linear?.workspace) {
|
|
246
249
|
taskLink = `https://linear.app/${config.linear.workspace}/issue/${newTaskId}`;
|
|
@@ -251,7 +254,7 @@ export async function runTeam(taskId, opts = {}) {
|
|
|
251
254
|
if (repo) taskLink = `https://github.com/${repo}/issues/${newTaskId}`;
|
|
252
255
|
}
|
|
253
256
|
console.log(`\n # Task: ${newTaskId}${taskLink ? ` (${taskLink})` : ""}\n`);
|
|
254
|
-
vizSend({ type: "session:update", taskId: newTaskId, taskLink, title: description || newTaskId });
|
|
257
|
+
vizSend({ type: "session:update", taskId: newTaskId, taskLink, title: newTitle || description || newTaskId });
|
|
255
258
|
}
|
|
256
259
|
},
|
|
257
260
|
onSessionEnd({ duration, steps, inputTokens, outputTokens }) {
|
package/package.json
CHANGED
package/prompts/team.md
CHANGED
|
@@ -359,6 +359,11 @@ Based on what you find, Jane determines the starting point:
|
|
|
359
359
|
- Branch exists but no PR: Review what's implemented, continue from EXECUTION.
|
|
360
360
|
- PR exists: Review the PR status, continue accordingly.
|
|
361
361
|
|
|
362
|
+
IMPORTANT: At the end of the intake, Jane MUST provide a short title for this session on its own line in this exact format:
|
|
363
|
+
SESSION_TITLE: <4-8 word title>
|
|
364
|
+
Example: SESSION_TITLE: Fix checkout total calculation
|
|
365
|
+
This title is displayed in the dashboard navbar, so keep it short and descriptive.
|
|
366
|
+
|
|
362
367
|
---
|
|
363
368
|
|
|
364
369
|
## BRAINSTORM (3-5 rounds)
|