@kendoo.agentdesk/agentdesk 0.3.0 → 0.3.1
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 +24 -17
- package/bin/agentdesk.mjs +16 -19
- package/cli/init.mjs +104 -17
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AgentDesk
|
|
2
2
|
|
|
3
|
-
AI team orchestrator
|
|
3
|
+
AI team orchestrator. Run collaborative agent sessions from your terminal and watch them live on [agentdesk.live](https://agentdesk.live).
|
|
4
4
|
|
|
5
5
|
AgentDesk spawns a team of 7 specialized AI agents that collaborate on your tasks:
|
|
6
6
|
|
|
@@ -22,36 +22,44 @@ AgentDesk spawns a team of 7 specialized AI agents that collaborate on your task
|
|
|
22
22
|
npm i -g @kendoo.agentdesk/agentdesk
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Requires [Node.js](https://nodejs.org/) 18
|
|
25
|
+
Requires [Node.js](https://nodejs.org/) 18+.
|
|
26
26
|
|
|
27
|
-
### 2.
|
|
27
|
+
### 2. Sign in
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
agentdesk login
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Opens your browser to [agentdesk.live](https://agentdesk.live) where you sign up or log in (email/password or Google). Your API key is saved automatically.
|
|
34
34
|
|
|
35
35
|
### 3. Set up your project
|
|
36
36
|
|
|
37
|
-
Navigate to your project and run init:
|
|
38
|
-
|
|
39
37
|
```bash
|
|
40
38
|
agentdesk init
|
|
41
39
|
```
|
|
42
40
|
|
|
41
|
+
This detects your project, asks which task tracker you use (Linear, Jira, GitHub Issues, or none), and saves the config to `.agentdesk.json`.
|
|
42
|
+
|
|
43
43
|
### 4. Run a team session
|
|
44
44
|
|
|
45
|
+
With a task tracker:
|
|
46
|
+
|
|
45
47
|
```bash
|
|
46
48
|
agentdesk team KEN-517
|
|
47
49
|
agentdesk team BUG-42 -d "Fix the checkout total calculation"
|
|
48
50
|
```
|
|
49
51
|
|
|
52
|
+
Without a tracker — pass requirements directly:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
agentdesk team add-auth -d "Add Google OAuth to the login page"
|
|
56
|
+
```
|
|
57
|
+
|
|
50
58
|
Open [agentdesk.live](https://agentdesk.live) to watch the session live.
|
|
51
59
|
|
|
52
60
|
## Configuration
|
|
53
61
|
|
|
54
|
-
|
|
62
|
+
`agentdesk init` creates `.agentdesk.json` in your project root. You can also edit it manually:
|
|
55
63
|
|
|
56
64
|
```json
|
|
57
65
|
{
|
|
@@ -65,8 +73,9 @@ Create `.agentdesk.json` in your project root to customize behavior:
|
|
|
65
73
|
| Tracker | Config |
|
|
66
74
|
|---------|--------|
|
|
67
75
|
| Linear | `{ "tracker": "linear", "linear": { "workspace": "..." } }` |
|
|
68
|
-
| Jira | `{ "tracker": "jira", "jira": { "baseUrl": "https://
|
|
76
|
+
| Jira | `{ "tracker": "jira", "jira": { "baseUrl": "https://company.atlassian.net" } }` |
|
|
69
77
|
| GitHub Issues | `{ "tracker": "github", "github": { "repo": "owner/repo" } }` |
|
|
78
|
+
| None | No config needed — pass `-d "description"` when running a session |
|
|
70
79
|
|
|
71
80
|
### Declaring project agents
|
|
72
81
|
|
|
@@ -87,12 +96,12 @@ If your project has existing AI agents, bots, or automation, declare them so the
|
|
|
87
96
|
|
|
88
97
|
AgentDesk also auto-discovers agents from `.claude/agents/`, `.claude/commands/`, `.mcp.json`, GitHub Actions workflows, Dependabot, and Renovate configs.
|
|
89
98
|
|
|
90
|
-
##
|
|
99
|
+
## Commands
|
|
91
100
|
|
|
92
101
|
```
|
|
93
|
-
agentdesk login
|
|
94
|
-
agentdesk logout
|
|
95
|
-
agentdesk init
|
|
102
|
+
agentdesk login Sign in to AgentDesk
|
|
103
|
+
agentdesk logout Sign out and remove credentials
|
|
104
|
+
agentdesk init Set up project and configure tracker
|
|
96
105
|
agentdesk team <TASK-ID> Run a team session on a task
|
|
97
106
|
agentdesk team <TASK-ID> -d "..." Run with a task description
|
|
98
107
|
```
|
|
@@ -101,19 +110,17 @@ agentdesk team <TASK-ID> -d "..." Run with a task description
|
|
|
101
110
|
|
|
102
111
|
| Flag | Description |
|
|
103
112
|
|------|-------------|
|
|
104
|
-
| `--description`, `-d` | Task description
|
|
113
|
+
| `--description`, `-d` | Task description or requirements |
|
|
105
114
|
| `--cwd` | Working directory (defaults to current) |
|
|
106
115
|
|
|
107
116
|
## How It Works
|
|
108
117
|
|
|
109
118
|
1. You run `agentdesk team TASK-ID` in your project directory
|
|
110
119
|
2. AgentDesk detects your project type, reads `CLAUDE.md`, and discovers existing agents
|
|
111
|
-
3.
|
|
112
|
-
4. The
|
|
113
|
-
5. The session streams live to [agentdesk.live](https://agentdesk.live) where you can watch and send messages to the team
|
|
120
|
+
3. 7 AI agents collaborate on your task in structured phases: **Brainstorm** > **Planning** > **Execution** > **Review**
|
|
121
|
+
4. The session streams live to [agentdesk.live](https://agentdesk.live) where you can watch and send messages to the team
|
|
114
122
|
|
|
115
123
|
## Requirements
|
|
116
124
|
|
|
117
125
|
- [Node.js](https://nodejs.org/) 18+
|
|
118
|
-
- [Claude Code](https://claude.ai/claude-code) CLI installed and authenticated
|
|
119
126
|
- An AgentDesk account at [agentdesk.live](https://agentdesk.live)
|
package/bin/agentdesk.mjs
CHANGED
|
@@ -1,42 +1,39 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// AgentDesk CLI — AI team orchestrator
|
|
3
|
+
// AgentDesk CLI — AI team orchestrator
|
|
4
4
|
|
|
5
5
|
const args = process.argv.slice(2);
|
|
6
6
|
const command = args[0];
|
|
7
7
|
|
|
8
8
|
if (!command || command === "help" || command === "--help") {
|
|
9
9
|
console.log(`
|
|
10
|
-
AgentDesk — AI team orchestrator
|
|
10
|
+
AgentDesk — AI team orchestrator
|
|
11
11
|
|
|
12
12
|
Getting started:
|
|
13
|
-
1.
|
|
14
|
-
2.
|
|
15
|
-
3.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
agentdesk login
|
|
19
|
-
agentdesk logout
|
|
20
|
-
agentdesk init
|
|
13
|
+
1. agentdesk login Sign in to your account
|
|
14
|
+
2. agentdesk init Set up your project (choose tracker, save config)
|
|
15
|
+
3. agentdesk team TASK-123 Run a team session
|
|
16
|
+
|
|
17
|
+
Commands:
|
|
18
|
+
agentdesk login Sign in to AgentDesk
|
|
19
|
+
agentdesk logout Sign out and remove credentials
|
|
20
|
+
agentdesk init Set up project and configure tracker
|
|
21
21
|
agentdesk team <TASK-ID> Run a team session on a task
|
|
22
22
|
agentdesk team <TASK-ID> -d "..." Run with a task description
|
|
23
23
|
|
|
24
24
|
Options:
|
|
25
|
-
--description, -d Task description
|
|
25
|
+
--description, -d Task description or requirements
|
|
26
26
|
--cwd Working directory (defaults to current)
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"linear": { "workspace": "..." } // for task links in the dashboard
|
|
33
|
-
}
|
|
28
|
+
Task trackers:
|
|
29
|
+
agentdesk init configures your tracker (Linear, Jira, GitHub Issues).
|
|
30
|
+
Without a tracker, pass requirements directly:
|
|
31
|
+
agentdesk team my-feature -d "Add dark mode support"
|
|
34
32
|
|
|
35
33
|
Examples:
|
|
36
|
-
agentdesk login
|
|
37
|
-
agentdesk init
|
|
38
34
|
agentdesk team KEN-517
|
|
39
35
|
agentdesk team BUG-42 -d "Fix the checkout total calculation"
|
|
36
|
+
agentdesk team add-auth -d "Add Google OAuth to the login page"
|
|
40
37
|
|
|
41
38
|
Dashboard: https://agentdesk.live
|
|
42
39
|
`);
|
package/cli/init.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
// `agentdesk init` —
|
|
1
|
+
// `agentdesk init` — interactive project setup with tracker configuration
|
|
2
2
|
|
|
3
|
-
import { existsSync, readFileSync } from "fs";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
4
4
|
import { join } from "path";
|
|
5
|
+
import { createInterface } from "readline";
|
|
5
6
|
import { detectProject } from "./detect.mjs";
|
|
6
7
|
import { loadConfig } from "./config.mjs";
|
|
7
8
|
import { getStoredApiKey } from "./login.mjs";
|
|
@@ -15,11 +16,34 @@ function loadApiKey(dir) {
|
|
|
15
16
|
return match?.[1]?.trim() || getStoredApiKey();
|
|
16
17
|
}
|
|
17
18
|
|
|
19
|
+
function ask(rl, question) {
|
|
20
|
+
return new Promise(resolve => rl.question(question, resolve));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function selectOption(rl, prompt, options) {
|
|
24
|
+
console.log(` ${prompt}`);
|
|
25
|
+
console.log("");
|
|
26
|
+
options.forEach((opt, i) => {
|
|
27
|
+
console.log(` ${i + 1}) ${opt.label}`);
|
|
28
|
+
});
|
|
29
|
+
console.log("");
|
|
30
|
+
|
|
31
|
+
while (true) {
|
|
32
|
+
const answer = await ask(rl, ` Choose (1-${options.length}): `);
|
|
33
|
+
const num = parseInt(answer.trim(), 10);
|
|
34
|
+
if (num >= 1 && num <= options.length) return options[num - 1];
|
|
35
|
+
console.log(` Please enter a number between 1 and ${options.length}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
18
39
|
export async function runInit(cwd) {
|
|
19
40
|
const project = detectProject(cwd);
|
|
20
|
-
const
|
|
21
|
-
const tracker = config.tracker || (project.hasLinear ? "linear" : null);
|
|
41
|
+
const existingConfig = loadConfig(cwd);
|
|
22
42
|
const projectId = project.name || cwd.split("/").pop();
|
|
43
|
+
const configPath = join(cwd, ".agentdesk.json");
|
|
44
|
+
const hasConfig = existsSync(configPath);
|
|
45
|
+
|
|
46
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
23
47
|
|
|
24
48
|
console.log("");
|
|
25
49
|
console.log(" AgentDesk — Project Setup");
|
|
@@ -28,9 +52,8 @@ export async function runInit(cwd) {
|
|
|
28
52
|
console.log(` Project: ${project.name || "unknown"}`);
|
|
29
53
|
console.log(` Type: ${project.label}`);
|
|
30
54
|
console.log(` Directory: ${project.dir}`);
|
|
31
|
-
console.log(` Git: ${project.hasGit ? "
|
|
32
|
-
console.log(` CLAUDE.md: ${project.hasClaudeMd ? "
|
|
33
|
-
console.log(` Tracker: ${tracker || "— (none)"}`);
|
|
55
|
+
console.log(` Git: ${project.hasGit ? "yes" : "no"}`);
|
|
56
|
+
console.log(` CLAUDE.md: ${project.hasClaudeMd ? "yes" : "no (recommended)"}`);
|
|
34
57
|
console.log("");
|
|
35
58
|
|
|
36
59
|
if (project.testCommand) console.log(` Test: ${project.testCommand}`);
|
|
@@ -38,7 +61,68 @@ export async function runInit(cwd) {
|
|
|
38
61
|
if (project.lintCommand) console.log(` Lint: ${project.lintCommand}`);
|
|
39
62
|
if (project.testCommand || project.buildCommand || project.lintCommand) console.log("");
|
|
40
63
|
|
|
41
|
-
//
|
|
64
|
+
// --- Tracker selection ---
|
|
65
|
+
const trackerOptions = [
|
|
66
|
+
{ label: "Linear", value: "linear" },
|
|
67
|
+
{ label: "Jira", value: "jira" },
|
|
68
|
+
{ label: "GitHub Issues", value: "github" },
|
|
69
|
+
{ label: "None (use descriptions only)", value: null },
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
const selected = await selectOption(rl, "Task tracker:", trackerOptions);
|
|
73
|
+
const tracker = selected.value;
|
|
74
|
+
console.log("");
|
|
75
|
+
|
|
76
|
+
// Build config
|
|
77
|
+
const config = {};
|
|
78
|
+
if (tracker) config.tracker = tracker;
|
|
79
|
+
|
|
80
|
+
if (tracker === "linear") {
|
|
81
|
+
const current = existingConfig.linear?.workspace || "";
|
|
82
|
+
const answer = await ask(rl, ` Linear workspace slug${current ? ` (${current})` : ""}: `);
|
|
83
|
+
const ws = answer.trim() || current;
|
|
84
|
+
if (ws) config.linear = { workspace: ws };
|
|
85
|
+
console.log("");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (tracker === "jira") {
|
|
89
|
+
const current = existingConfig.jira?.baseUrl || "";
|
|
90
|
+
const answer = await ask(rl, ` Jira base URL${current ? ` (${current})` : ""}: `);
|
|
91
|
+
const url = answer.trim() || current;
|
|
92
|
+
if (url) config.jira = { baseUrl: url };
|
|
93
|
+
console.log("");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (tracker === "github") {
|
|
97
|
+
const current = existingConfig.github?.repo || "";
|
|
98
|
+
const answer = await ask(rl, ` GitHub repo${current ? ` (${current})` : ""} (owner/repo): `);
|
|
99
|
+
const r = answer.trim() || current;
|
|
100
|
+
if (r) config.github = { repo: r };
|
|
101
|
+
console.log("");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// --- Save .agentdesk.json ---
|
|
105
|
+
let merged = {};
|
|
106
|
+
if (hasConfig) {
|
|
107
|
+
try { merged = JSON.parse(readFileSync(configPath, "utf-8")); } catch {}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (tracker) {
|
|
111
|
+
merged.tracker = tracker;
|
|
112
|
+
if (config.linear) merged.linear = config.linear;
|
|
113
|
+
if (config.jira) merged.jira = config.jira;
|
|
114
|
+
if (config.github) merged.github = config.github;
|
|
115
|
+
} else {
|
|
116
|
+
delete merged.tracker;
|
|
117
|
+
delete merged.linear;
|
|
118
|
+
delete merged.jira;
|
|
119
|
+
delete merged.github;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
writeFileSync(configPath, JSON.stringify(merged, null, 2) + "\n");
|
|
123
|
+
console.log(` Saved .agentdesk.json`);
|
|
124
|
+
|
|
125
|
+
// --- Register with server ---
|
|
42
126
|
try {
|
|
43
127
|
const res = await fetch(`${SERVER}/api/projects`, {
|
|
44
128
|
method: "POST",
|
|
@@ -55,24 +139,27 @@ export async function runInit(cwd) {
|
|
|
55
139
|
}),
|
|
56
140
|
});
|
|
57
141
|
if (res.ok) {
|
|
58
|
-
console.log("
|
|
59
|
-
} else {
|
|
60
|
-
console.log(" ⚠ AgentDesk server not available — project will register on first session");
|
|
142
|
+
console.log(" Registered with agentdesk.live");
|
|
61
143
|
}
|
|
62
144
|
} catch {
|
|
63
|
-
|
|
145
|
+
// Server not available
|
|
64
146
|
}
|
|
65
147
|
|
|
66
148
|
console.log("");
|
|
67
|
-
console.log(" Ready
|
|
149
|
+
console.log(" Ready! Run a team session:");
|
|
68
150
|
console.log("");
|
|
69
|
-
|
|
70
|
-
|
|
151
|
+
if (tracker) {
|
|
152
|
+
console.log(` agentdesk team TASK-123`);
|
|
153
|
+
console.log(` agentdesk team TASK-123 -d "Optional extra context"`);
|
|
154
|
+
} else {
|
|
155
|
+
console.log(` agentdesk team my-feature -d "Add dark mode support"`);
|
|
156
|
+
}
|
|
71
157
|
console.log("");
|
|
72
158
|
|
|
73
159
|
if (!project.hasClaudeMd) {
|
|
74
|
-
console.log(" Tip: Create a CLAUDE.md
|
|
75
|
-
console.log(" understand your codebase conventions, architecture, and commands.");
|
|
160
|
+
console.log(" Tip: Create a CLAUDE.md to help the agents understand your codebase.");
|
|
76
161
|
console.log("");
|
|
77
162
|
}
|
|
163
|
+
|
|
164
|
+
rl.close();
|
|
78
165
|
}
|