generated from nhcarrigan/template
feat: CLI v2.1.68–v2.1.74 compatibility updates (#221)
## Summary This PR brings Hikari Desktop up to full compatibility with Claude Code CLI versions v2.1.68 through v2.1.74, implementing all changelog items audited in issues #200–#218. ## Changes ### Bug Fixes - Remove deprecated Claude Opus 4.0 and 4.1 models from the model selector - Auto-migrate users pinned to deprecated models to Opus 4.6 ### New Features - Add cron tool support (`CronCreate`, `CronDelete`, `CronList`) with character state mapping and `CLAUDE_CODE_DISABLE_CRON` settings toggle - Handle `EnterWorktree` and `ExitWorktree` tools in character state mapping and tool display - Add CLI update check with npm registry indicator in the version bar - Add `agent_type` field and support the Agent tool rename from CLI v2.1.69 - Consume `worktree` field from status line hook events - Display per-agent model override in the agent monitor tree - Expose Claude Code CLI built-in slash commands (`/simplify`, `/loop`, `/batch`, `/memory`, `/context`) in the command menu with CLI badges - Add `includeGitInstructions` toggle in settings - Add `ENABLE_CLAUDEAI_MCP_SERVERS` opt-out setting - Linkify MCP binary file paths (PDFs, audio, Office docs) in markdown output - Add auto-memory panel, `/memory` slash command shortcut, and unified toast notification system - Toast notifications for `WorktreeCreate` and `WorktreeRemove` hook events - Sort session resume list by most recent activity, with most recent user message as preview - Convert WSL Linux paths to Windows UNC paths when opening binary files via `open_binary_file` command - Expose `autoMemoryDirectory` setting in ConfigSidebar (Agent Settings section) - Add `/context` as a CLI built-in in the slash command menu - Expose `modelOverrides` setting as a JSON textarea in ConfigSidebar (for AWS Bedrock, Google Vertex, etc.) > **Note:** The CLI update check commit does not have a corresponding issue — it was a bonus addition during the audit sprint. ## Closes Closes #200 Closes #201 Closes #202 Closes #205 Closes #206 Closes #207 Closes #208 Closes #209 Closes #210 Closes #211 Closes #212 Closes #213 Closes #214 Closes #215 Closes #216 Closes #217 Closes #218 Reviewed-on: #221 Co-authored-by: Hikari <hikari@nhcarrigan.com> Co-committed-by: Hikari <hikari@nhcarrigan.com>
This commit was merged in pull request #221.
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
|
||||
import { describe, it, expect } from "vitest";
|
||||
|
||||
const SUPPORTED_CLI_VERSION = "2.1.53";
|
||||
const SUPPORTED_CLI_VERSION = "2.1.74";
|
||||
|
||||
function compareVersions(a: string, b: string): number {
|
||||
const aParts = a.split(".").map(Number);
|
||||
@@ -41,7 +41,7 @@ describe("SUPPORTED_CLI_VERSION", () => {
|
||||
});
|
||||
|
||||
it("matches the expected audited version", () => {
|
||||
expect(SUPPORTED_CLI_VERSION).toBe("2.1.53");
|
||||
expect(SUPPORTED_CLI_VERSION).toBe("2.1.74");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -128,7 +128,55 @@ describe("compareVersions", () => {
|
||||
});
|
||||
|
||||
it("returns 0 for exactly the supported version", () => {
|
||||
expect(compareVersions("2.1.53", SUPPORTED_CLI_VERSION)).toBe(0);
|
||||
expect(compareVersions("2.1.74", SUPPORTED_CLI_VERSION)).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Mirrors the updateAvailable derived logic in CliVersion.svelte
|
||||
function isUpdateAvailable(installedVersion: string, latestNpmVersion: string | null): boolean {
|
||||
if (!latestNpmVersion || installedVersion === "Loading..." || installedVersion === "Unknown") {
|
||||
return false;
|
||||
}
|
||||
const semverMatch = /(\d+\.\d+\.\d+)/.exec(installedVersion);
|
||||
if (!semverMatch) return false;
|
||||
return compareVersions(semverMatch[1], latestNpmVersion) < 0;
|
||||
}
|
||||
|
||||
describe("updateAvailable", () => {
|
||||
it("returns false when latestNpmVersion is null", () => {
|
||||
expect(isUpdateAvailable("2.1.70", null)).toBe(false);
|
||||
});
|
||||
|
||||
it("returns false when installed is Loading...", () => {
|
||||
expect(isUpdateAvailable("Loading...", "2.1.74")).toBe(false);
|
||||
});
|
||||
|
||||
it("returns false when installed is Unknown", () => {
|
||||
expect(isUpdateAvailable("Unknown", "2.1.74")).toBe(false);
|
||||
});
|
||||
|
||||
it("returns false when installed equals latest", () => {
|
||||
expect(isUpdateAvailable("2.1.74", "2.1.74")).toBe(false);
|
||||
});
|
||||
|
||||
it("returns false when installed is ahead of latest", () => {
|
||||
expect(isUpdateAvailable("2.1.75", "2.1.74")).toBe(false);
|
||||
});
|
||||
|
||||
it("returns true when installed is behind latest", () => {
|
||||
expect(isUpdateAvailable("2.1.70", "2.1.74")).toBe(true);
|
||||
});
|
||||
|
||||
it("returns true when installed has a lower minor version", () => {
|
||||
expect(isUpdateAvailable("2.0.99", "2.1.74")).toBe(true);
|
||||
});
|
||||
|
||||
it("handles version strings with extra info like '2.1.70 (build 123)'", () => {
|
||||
expect(isUpdateAvailable("2.1.70 (build 123)", "2.1.74")).toBe(true);
|
||||
});
|
||||
|
||||
it("returns false for unparseable installed version", () => {
|
||||
expect(isUpdateAvailable("not-a-version", "2.1.74")).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user