Compare commits

..

7 Commits

Author SHA1 Message Date
hikari 1f155f9fe9 feat: implement CLI v2.1.81 features and global CLAUDE.md editor
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m22s
CI / Lint & Test (pull_request) Successful in 16m52s
CI / Build Linux (pull_request) Successful in 22m33s
CI / Build Windows (cross-compile) (pull_request) Successful in 34m6s
- #248: add output_style field to System init message (forward-compat)
- #245: add fast_mode_state field to Result message (forward-compat)
- #246: add model_usage field to Result message with per-model logging
- #247: add total_cost_usd field to Result message (authoritative cost)
- #237: add bare_mode config option (passes --bare flag to Claude Code)
- #239: add show_clear_context_on_plan_accept config option (settings JSON)
- #244: add custom_model_option config option (ANTHROPIC_CUSTOM_MODEL_OPTION env)
- #262: add global CLAUDE.md editor to config sidebar (get/save_global_claude_md commands)
- fix: wire disable_cron and disable_skill_shell_execution into all start_claude invocations
- fix: wire all new config fields into all start_claude invocations
2026-04-13 11:28:57 -07:00
hikari f7654bfaf9 chore: update supported CLI version to 2.1.104 (closes #260)
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m7s
CI / Lint & Test (pull_request) Successful in 17m8s
CI / Build Linux (pull_request) Successful in 23m21s
CI / Build Windows (cross-compile) (pull_request) Successful in 34m27s
2026-04-13 10:21:34 -07:00
hikari edea33310b feat: expose disableSkillShellExecution setting in config UI (closes #259) 2026-04-13 10:19:50 -07:00
hikari 54b3a524c4 chore: handle Monitor tool in stream parsing (closes #258) 2026-04-13 10:07:20 -07:00
hikari 5846b30529 feat: handle PermissionDenied hook event and drive Permission character state (closes #256) 2026-04-13 10:03:31 -07:00
hikari 6fe7e97550 feat: handle TaskCreated hook event (closes #254) 2026-04-13 09:58:09 -07:00
hikari 022d7d7b6c feat: handle CwdChanged and FileChanged hook events (closes #253) 2026-04-13 09:33:03 -07:00
6 changed files with 27 additions and 91 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "hikari-desktop",
"version": "1.14.0",
"version": "1.13.0",
"description": "",
"type": "module",
"scripts": {
@@ -56,7 +56,7 @@
"@tauri-apps/api": "2.10.1",
"@tauri-apps/plugin-clipboard-manager": "2.3.2",
"@tauri-apps/plugin-dialog": "2.6.0",
"@tauri-apps/plugin-fs": "2.5.0",
"@tauri-apps/plugin-fs": "2.4.5",
"@tauri-apps/plugin-notification": "2.3.3",
"@tauri-apps/plugin-opener": "2.5.3",
"@tauri-apps/plugin-os": "2.3.2",
+5 -5
View File
@@ -96,8 +96,8 @@ importers:
specifier: 2.6.0
version: 2.6.0
'@tauri-apps/plugin-fs':
specifier: 2.5.0
version: 2.5.0
specifier: 2.4.5
version: 2.4.5
'@tauri-apps/plugin-notification':
specifier: 2.3.3
version: 2.3.3
@@ -993,8 +993,8 @@ packages:
'@tauri-apps/plugin-dialog@2.6.0':
resolution: {integrity: sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg==}
'@tauri-apps/plugin-fs@2.5.0':
resolution: {integrity: sha512-c83kbz61AK+rKjhS+je9+stIO27nXj7p9cqeg36TwkIUtxpCFTttlHHtqon6h6FN54cXjyAjlMPOJcW3mwE5XQ==}
'@tauri-apps/plugin-fs@2.4.5':
resolution: {integrity: sha512-dVxWWGE6VrOxC7/jlhyE+ON/Cc2REJlM35R3PJX3UvFw2XwYhLGQVAIyrehenDdKjotipjYEVc4YjOl3qq90fA==}
'@tauri-apps/plugin-notification@2.3.3':
resolution: {integrity: sha512-Zw+ZH18RJb41G4NrfHgIuofJiymusqN+q8fGUIIV7vyCH+5sSn5coqRv/MWB9qETsUs97vmU045q7OyseCV3Qg==}
@@ -2935,7 +2935,7 @@ snapshots:
dependencies:
'@tauri-apps/api': 2.10.1
'@tauri-apps/plugin-fs@2.5.0':
'@tauri-apps/plugin-fs@2.4.5':
dependencies:
'@tauri-apps/api': 2.10.1
+1 -1
View File
@@ -1648,7 +1648,7 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "hikari-desktop"
version = "1.14.0"
version = "1.13.0"
dependencies = [
"chrono",
"dirs 5.0.1",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "hikari-desktop"
version = "1.14.0"
version = "1.13.0"
description = "Hikari - Claude Code Visual Assistant"
authors = ["Naomi Carrigan"]
edition = "2021"
+17 -81
View File
@@ -2618,101 +2618,37 @@ pub async fn open_binary_file(app: AppHandle, path: String) -> Result<(), String
}
}
/// Read `~/.claude/CLAUDE.md` via WSL (for Windows).
/// Returns an empty string if the file does not exist.
#[cfg(target_os = "windows")]
async fn get_global_claude_md_via_wsl() -> Result<String, String> {
use std::process::Command;
let output = Command::new("wsl")
.hide_window()
.args(["-e", "bash", "-l", "-c", "cat ~/.claude/CLAUDE.md 2>/dev/null || true"])
.output()
.map_err(|e| format!("Failed to execute WSL command: {}", e))?;
Ok(String::from_utf8_lossy(&output.stdout).to_string())
}
/// Write content to `~/.claude/CLAUDE.md` via WSL (for Windows).
/// Creates the file (and `~/.claude/` directory) if they do not exist.
#[cfg(target_os = "windows")]
async fn save_global_claude_md_via_wsl(content: String) -> Result<(), String> {
use std::io::Write;
use std::process::{Command, Stdio};
let mut child = Command::new("wsl")
.hide_window()
.args([
"-e",
"bash",
"-l",
"-c",
"mkdir -p ~/.claude && cat > ~/.claude/CLAUDE.md",
])
.stdin(Stdio::piped())
.spawn()
.map_err(|e| format!("Failed to execute WSL command: {}", e))?;
if let Some(stdin) = child.stdin.as_mut() {
stdin
.write_all(content.as_bytes())
.map_err(|e| format!("Failed to write content to WSL stdin: {}", e))?;
}
let status = child
.wait()
.map_err(|e| format!("Failed to wait for WSL command: {}", e))?;
if !status.success() {
return Err("Failed to save CLAUDE.md via WSL".to_string());
}
Ok(())
}
/// Read the contents of `~/.claude/CLAUDE.md`.
/// Returns an empty string if the file does not exist.
#[tauri::command]
pub async fn get_global_claude_md() -> Result<String, String> {
#[cfg(target_os = "windows")]
return get_global_claude_md_via_wsl().await;
let path = dirs::home_dir()
.ok_or_else(|| "Could not determine home directory".to_string())?
.join(".claude")
.join("CLAUDE.md");
#[cfg(not(target_os = "windows"))]
{
let path = dirs::home_dir()
.ok_or_else(|| "Could not determine home directory".to_string())?
.join(".claude")
.join("CLAUDE.md");
if !path.exists() {
return Ok(String::new());
}
std::fs::read_to_string(&path).map_err(|e| format!("Failed to read CLAUDE.md: {}", e))
if !path.exists() {
return Ok(String::new());
}
std::fs::read_to_string(&path).map_err(|e| format!("Failed to read CLAUDE.md: {}", e))
}
/// Write content to `~/.claude/CLAUDE.md`.
/// Creates the file (and `~/.claude/` directory) if they do not exist.
#[tauri::command]
pub async fn save_global_claude_md(content: String) -> Result<(), String> {
#[cfg(target_os = "windows")]
return save_global_claude_md_via_wsl(content).await;
let claude_dir = dirs::home_dir()
.ok_or_else(|| "Could not determine home directory".to_string())?
.join(".claude");
#[cfg(not(target_os = "windows"))]
{
let claude_dir = dirs::home_dir()
.ok_or_else(|| "Could not determine home directory".to_string())?
.join(".claude");
if !claude_dir.exists() {
std::fs::create_dir_all(&claude_dir)
.map_err(|e| format!("Failed to create ~/.claude directory: {}", e))?;
}
let path = claude_dir.join("CLAUDE.md");
std::fs::write(&path, content).map_err(|e| format!("Failed to write CLAUDE.md: {}", e))
if !claude_dir.exists() {
std::fs::create_dir_all(&claude_dir)
.map_err(|e| format!("Failed to create ~/.claude directory: {}", e))?;
}
let path = claude_dir.join("CLAUDE.md");
std::fs::write(&path, content).map_err(|e| format!("Failed to write CLAUDE.md: {}", e))
}
#[cfg(test)]
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "hikari-desktop",
"version": "1.14.0",
"version": "1.13.0",
"identifier": "com.naomi.hikari-desktop",
"build": {
"beforeDevCommand": "pnpm dev",