@kendoo.agentdesk/agentdesk 0.21.0 → 0.22.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/CHANGELOG.md CHANGED
@@ -13,6 +13,45 @@ Internal refactors, infrastructure changes, and architectural notes are not list
13
13
  ### Added
14
14
  - `[UI]` Private-session sharing flow. When someone visits a session URL they don't own, they now see a friendly "Shh… this one's private" page with a one-click "Request access" button instead of a blank error. The session owner sees pending requests in a new header inbox and can grant viewer access for just that session or the whole project. Viewer-granted sessions show up in the teammate's sidebar tagged as a viewer.
15
15
 
16
+ ### Changed
17
+ - `[Both]` Security improvements and hardening. No action required.
18
+
19
+ ## [0.22.0] — 2026-05-23
20
+
21
+ ### Changed
22
+ - `[CLI]` `agentdesk team` now defaults to phased mode so per-phase model overrides actually apply. Previously the whole session ran in a single process, which meant the model configured for INTAKE was silently overridden by EXECUTION's model (or vice versa). The fix routes each phase through its own Claude process, honoring per-phase model selection. Pass `--single-process` (or `--no-phased`) to opt back into single-process behavior.
23
+ - `[Both]` Daemon-cancelled sessions now report `status="stopped"` (terminal) instead of `"complete"`. The dashboard renders Stopped in red and surfaces Error and Canceled distinctly instead of collapsing them into a generic "Disconnected" badge.
24
+
25
+ ### Added
26
+ - `[CLI]` New CLI-created tasks auto-assign to the connected user across Jira, Linear, and GitHub. No more "no assignee" tasks landing on the tracker after team kickoff.
27
+ - `[CLI]` Orchestrator prints the resolved model per phase to stderr — useful when verifying per-phase overrides are actually taking effect.
28
+ - `[CLI]` Stream parser detects phase markers per-line (canonical `# PHASE: <NAME>`, heading-style, and natural-language transitions) so the dashboard timeline doesn't get stuck on long-running phases.
29
+
30
+ ### Fixed
31
+ - `[UI]` Daemon `heartbeat` now bumps `lastActivityAt` for the user's active sessions and revives stale ones — prevents misleading "CLI Offline" indicators during deep tool work when the CLI process is alive but Claude is busy in a long bash or edit run.
32
+ - `[UI]` `ProjectSettingsPage` copy reflects that per-phase models always apply now (was previously hedged from the days when single-process runs ignored the override).
33
+
34
+ ## [0.21.0] — 2026-04-28
35
+
36
+ Mobile-design wave plus session-UI polish. Versions `0.20.4` through `0.20.6` were intermediate publishes during the same wave on the same day and are superseded by `0.21.0`.
37
+
38
+ ### Added
39
+ - `[UI]` Full mobile design rolled out across the dashboard, Sessions list, Run screen, composer, and chat surfaces (AD-14 through AD-25). Includes hybrid design tokens, typography aligned with claude/design, mobile chat status bar, magazine-style Sessions header, and bigger chat text on mobile.
40
+ - `[UI]` Topbar mono breadcrumb and ⌘↵ hint on the Run Team page.
41
+ - `[UI]` Transcript run banner and completion footer with article-width body.
42
+ - `[UI]` Composer "›" prefix and a keyboard hint row surfacing the ⌘↵ binding.
43
+
44
+ ### Changed
45
+ - `[UI]` Dashboard is now a 2-column layout (metric strip on top, team foot on bottom).
46
+ - `[UI]` `SessionList` restyle — sharper visuals, selected-only highlighting (no more "row hover lights up every other row").
47
+
48
+ ### Fixed
49
+ - `[UI]` AgentDesk wordmark font no longer regresses to the wrong typeface after the design-token rollout.
50
+ - `[UI]` Settings form state now resets when you switch projects (was previously carrying stale fields from the prior project).
51
+
52
+ ### Removed
53
+ - `[UI]` Unused `SessionStats` component.
54
+
16
55
  ## [0.20.3] — 2026-04-19
17
56
 
18
57
  ### Fixed
package/README.md CHANGED
@@ -21,7 +21,31 @@ You can also add **custom agents** (e.g., a Security Engineer or DevOps speciali
21
21
 
22
22
  ## Getting Started
23
23
 
24
- ### 1. Install
24
+ The fastest way to try AgentDesk is the **Claude Code plugin**. It runs the phased loop (intake → plan → execute → review → summary) entirely inside your existing Claude Code session — no signup, no daemon, no extra install.
25
+
26
+ ### Quickstart — Claude Code plugin
27
+
28
+ Inside any Claude Code session:
29
+
30
+ ```text
31
+ /plugin marketplace add anthropics/claude-plugins-community
32
+ /plugin install agentdesk@claude-community
33
+ /agentdesk <your task or tracker URL>
34
+ ```
35
+
36
+ Five sub-agents run in sequence with a dedicated review pass before SUMMARY produces the final report. State persists in `.agentdesk/session-memory.md`.
37
+
38
+ **What the plugin covers:** the phased workflow, one task at a time, in your terminal. Zero-account, in-process.
39
+
40
+ **What needs the full CLI + dashboard (below):** session history, dashboard visibility, multi-session parallelism, team coordination, tracker integration (Jira/Linear/GitHub write-back), and the long-running daemon.
41
+
42
+ ---
43
+
44
+ ### Full setup — CLI + dashboard
45
+
46
+ For session history, team workflows, and tracker integration, install the AgentDesk CLI and connect it to your `agentdesk.live` account.
47
+
48
+ #### 1. Install
25
49
 
26
50
  ```bash
27
51
  npm i -g @kendoo.agentdesk/agentdesk
@@ -29,7 +53,7 @@ npm i -g @kendoo.agentdesk/agentdesk
29
53
 
30
54
  Requires [Claude Code](https://claude.ai/code) and [Node.js](https://nodejs.org/) 18+.
31
55
 
32
- ### 2. Sign in
56
+ #### 2. Sign in
33
57
 
34
58
  ```bash
35
59
  agentdesk login
@@ -37,7 +61,7 @@ agentdesk login
37
61
 
38
62
  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.
39
63
 
40
- ### 3. Set up your project
64
+ #### 3. Set up your project
41
65
 
42
66
  ```bash
43
67
  agentdesk init
@@ -71,7 +95,7 @@ All menus use arrow-key navigation with color highlighting; Ctrl-C exits cleanly
71
95
 
72
96
  `.agentdesk.json` is kept in sync with the server: every CLI run fetches the authoritative config and rewrites the local file as a credential-free snapshot. Credentials live only on the server, encrypted. If a local edit disagreed with the server's value, a one-line warning lists the overridden fields.
73
97
 
74
- ### 4. Run a team session
98
+ #### 4. Run a team session
75
99
 
76
100
  Work on an existing task:
77
101
 
@@ -1,7 +1,12 @@
1
1
  // Verify tracker API permissions before starting a session
2
2
  // Checks: read tasks, create tasks, update tasks
3
3
 
4
- import { execSync } from "child_process";
4
+ import { execFileSync } from "child_process";
5
+
6
+ // AD-29: any external string (repo name, ref, etc.) must be regex-validated
7
+ // before it goes into a child process. Even with execFile, an upstream caller
8
+ // passing "../../etc" or similar can trip path semantics in the called tool.
9
+ const GITHUB_REPO_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/;
5
10
 
6
11
  const LINEAR_API = "https://api.linear.app/graphql";
7
12
 
@@ -187,18 +192,25 @@ async function checkGitHub({ repo }, creds) {
187
192
  const env = { ...process.env };
188
193
  if (creds?.GITHUB_TOKEN) env.GH_TOKEN = creds.GITHUB_TOKEN;
189
194
 
190
- // Check if gh CLI is available
195
+ // AD-29: refuse anything that isn't a clean owner/repo before going near a
196
+ // subprocess. `repo` comes from server-pushed project settings, which an
197
+ // attacker could control via a chained takeover.
198
+ if (!GITHUB_REPO_RE.test(repo)) {
199
+ return { ok: false, errors: [`Invalid GitHub repo format: ${JSON.stringify(repo)} (expected "owner/name")`] };
200
+ }
201
+
202
+ // Check if gh CLI is available. execFileSync (no shell) — argv is static.
191
203
  try {
192
- execSync("gh --version", { stdio: "pipe" });
204
+ execFileSync("gh", ["--version"], { stdio: "pipe" });
193
205
  } catch {
194
206
  return { ok: false, errors: ["GitHub CLI (gh) is not installed — install it from https://cli.github.com"] };
195
207
  }
196
208
 
197
209
  // Check auth status and grab the authenticated login
198
210
  try {
199
- execSync("gh auth status", { stdio: "pipe", env });
211
+ execFileSync("gh", ["auth", "status"], { stdio: "pipe", env });
200
212
  try {
201
- const who = execSync(`gh api user --jq '{login: .login, name: .name}'`, { stdio: "pipe", encoding: "utf-8", env }).trim();
213
+ const who = execFileSync("gh", ["api", "user", "--jq", "{login: .login, name: .name}"], { stdio: "pipe", encoding: "utf-8", env }).trim();
202
214
  const j = JSON.parse(who);
203
215
  identity = { name: j.name || j.login, login: j.login };
204
216
  } catch {}
@@ -206,9 +218,9 @@ async function checkGitHub({ repo }, creds) {
206
218
  return { ok: false, errors: ["GitHub CLI is not authenticated — run 'gh auth login', or paste a GITHUB_TOKEN"] };
207
219
  }
208
220
 
209
- // Check repo access and permissions
221
+ // Check repo access and permissions — argv form, no shell, repo already validated.
210
222
  try {
211
- const result = execSync(`gh api repos/${repo} --jq ".permissions"`, { stdio: "pipe", encoding: "utf-8", env });
223
+ const result = execFileSync("gh", ["api", `repos/${repo}`, "--jq", ".permissions"], { stdio: "pipe", encoding: "utf-8", env });
212
224
  const perms = JSON.parse(result.trim());
213
225
 
214
226
  if (!perms.pull) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kendoo.agentdesk/agentdesk",
3
- "version": "0.21.0",
3
+ "version": "0.22.1",
4
4
  "description": "AI team orchestrator for Claude Code — run collaborative agent sessions from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,7 +22,7 @@
22
22
  "server": "node server/index.mjs",
23
23
  "build": "vite build",
24
24
  "preview": "vite preview",
25
- "test": "node --test tests/server.test.mjs tests/agents.test.mjs tests/homepage.test.mjs tests/sessionUtils.test.mjs tests/tracker-url.test.mjs tests/session-preflight.test.mjs tests/access.test.mjs",
25
+ "test": "node --test tests/server.test.mjs tests/agents.test.mjs tests/homepage.test.mjs tests/sessionUtils.test.mjs tests/tracker-url.test.mjs tests/session-preflight.test.mjs tests/access.test.mjs tests/project-ownership.test.mjs tests/random-hex.test.mjs",
26
26
  "lint:changelog": "node scripts/lint-changelog.mjs",
27
27
  "prepublishOnly": "node scripts/lint-changelog.mjs"
28
28
  },