@kendoo.agentdesk/agentdesk 0.31.0 → 0.31.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
@@ -8,6 +8,11 @@ All user-facing changes to AgentDesk. Each entry is tagged:
8
8
 
9
9
  Internal refactors, infrastructure changes, and architectural notes are not listed here.
10
10
 
11
+ ## [0.31.1] — 2026-09-21
12
+
13
+ ### Fixed
14
+ - `[Both]` Saving project settings without credentials (which the CLI's config sync does by design) no longer erases the stored Jira, Linear or GitHub credentials, and no longer resets settings the write did not mention. 0.31.0 made the CLI re-sync settings on every run, which wiped tracker credentials for affected projects — if pre-flight says your tracker email or token is missing, re-enter it once in project settings.
15
+
11
16
  ## [0.31.0] — 2026-09-21
12
17
 
13
18
  ### Changed
package/cli/config.mjs CHANGED
@@ -134,13 +134,19 @@ export async function loadConfig(dir, opts = {}) {
134
134
  // True when `local` has any non-null leaf that's null/missing on `server`.
135
135
  // Walked recursively for nested blocks (linear, jira, github). Used to
136
136
  // decide whether it's worth pushing a heal sync.
137
- function hasFieldsServerLacks(local, server) {
137
+ //
138
+ // Only fields the server actually accepts (SETTINGS_FIELDS) count at the top
139
+ // level: a local-only field such as teamProfile can never be "healed", and
140
+ // treating it as a gap made every run push a credential-free payload —
141
+ // which is what a heal push is, by design — forever.
142
+ function hasFieldsServerLacks(local, server, top = true) {
138
143
  const isObj = v => v && typeof v === "object" && !Array.isArray(v);
139
144
  for (const [key, v] of Object.entries(local || {})) {
145
+ if (top && !SETTINGS_FIELDS.includes(key)) continue;
140
146
  if (v === null || v === undefined) continue;
141
147
  const s = server?.[key];
142
148
  if (isObj(v)) {
143
- if (!isObj(s) || hasFieldsServerLacks(v, s)) return true;
149
+ if (!isObj(s) || hasFieldsServerLacks(v, s, false)) return true;
144
150
  } else {
145
151
  if (s === null || s === undefined) return true;
146
152
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kendoo.agentdesk/agentdesk",
3
- "version": "0.31.0",
3
+ "version": "0.31.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 tests/project-ownership.test.mjs tests/random-hex.test.mjs tests/projects-registry.test.mjs tests/phase-loop.test.mjs tests/proc.test.mjs tests/crypto.test.mjs tests/dotenv.test.mjs tests/update-check.test.mjs tests/setup-helpers.test.mjs tests/project-key.test.mjs tests/tracker-project.test.mjs tests/tracker-check.test.mjs tests/config.test.mjs tests/engine-env.test.mjs tests/engine-events.test.mjs tests/engine-verdict.test.mjs tests/engine-hooks.test.mjs tests/engine-agents.test.mjs tests/session-isolation.test.mjs tests/engine-session.test.mjs tests/engine-prompts.test.mjs tests/engine-schemas.test.mjs tests/engine-claude-auth.test.mjs tests/worktrees.test.mjs tests/workspaces-api.test.mjs tests/engine-outcome.test.mjs tests/session-outcomes.test.mjs tests/outcome-hydration.test.mjs tests/mobile-outcomes.test.mjs tests/session-queue.test.mjs tests/useFollowScroll.test.mjs tests/session-usage.test.mjs tests/task-lookup.test.mjs tests/engine-evidence.test.mjs tests/engine-handoff.test.mjs tests/engine-team-profile.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 tests/projects-registry.test.mjs tests/phase-loop.test.mjs tests/proc.test.mjs tests/crypto.test.mjs tests/dotenv.test.mjs tests/update-check.test.mjs tests/setup-helpers.test.mjs tests/project-key.test.mjs tests/tracker-project.test.mjs tests/tracker-check.test.mjs tests/config.test.mjs tests/engine-env.test.mjs tests/engine-events.test.mjs tests/engine-verdict.test.mjs tests/engine-hooks.test.mjs tests/engine-agents.test.mjs tests/session-isolation.test.mjs tests/engine-session.test.mjs tests/engine-prompts.test.mjs tests/engine-schemas.test.mjs tests/engine-claude-auth.test.mjs tests/worktrees.test.mjs tests/workspaces-api.test.mjs tests/engine-outcome.test.mjs tests/session-outcomes.test.mjs tests/outcome-hydration.test.mjs tests/mobile-outcomes.test.mjs tests/session-queue.test.mjs tests/useFollowScroll.test.mjs tests/session-usage.test.mjs tests/task-lookup.test.mjs tests/engine-evidence.test.mjs tests/engine-handoff.test.mjs tests/engine-team-profile.test.mjs tests/project-settings.test.mjs",
26
26
  "test:coverage": "node --test --experimental-test-coverage --test-coverage-include='cli/**' --test-coverage-include='server/**' --test-coverage-lines=60 --test-coverage-branches=62 tests/*.test.mjs",
27
27
  "lint": "eslint .",
28
28
  "lint:fix": "eslint . --fix",