From bc3d7cfc6cc012ccaf1ce9f3deacc08a0df0fc80 Mon Sep 17 00:00:00 2001 From: Javis <81982673+Javis603@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:16:21 +0800 Subject: [PATCH 1/2] fix(micode): scan ~/.local/share/mimocode, not micode --- README.ja.md | 6 +++--- README.ko.md | 6 +++--- README.md | 6 +++--- README.zh-cn.md | 6 +++--- crates/tokscale-core/src/clients.rs | 2 +- crates/tokscale-core/src/lib.rs | 2 +- crates/tokscale-core/src/scanner.rs | 4 ++-- crates/tokscale-core/src/sessions/micode.rs | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/README.ja.md b/README.ja.md index a37bdce70..d25ee6852 100644 --- a/README.ja.md +++ b/README.ja.md @@ -85,7 +85,7 @@ | Cline | [Cline](https://github.com/cline/cline) | VS Code globalStorage のタスクディレクトリ(Linux: `~/.config/Code/...`; macOS: `~/Library/Application Support/Code/...`; Windows: `%APPDATA%\Code\...`; サーバー: `~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/`) | ✅ 対応 | | Gajae-Code | [gajae-code (gjc)](https://github.com/Yeachan-Heo/gajae-code) | `~/.gjc/agent/sessions/`(`GJC_CODING_AGENT_DIR`、`GJC_CONFIG_DIR`、`PI_CONFIG_DIR` でオーバーライド可能;Linux/macOS では `$XDG_DATA_HOME/gjc/sessions/` も解決) | ✅ 対応 | | Jcode | [Jcode](https://github.com/1jehuang/jcode) | `~/.jcode/sessions/session_*.json` + `session_*.journal.jsonl` サイドカー(`JCODE_HOME` で上書き可) | ✅ 対応 | -| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/micode/mimocode.db`(XDG データディレクトリ;SQLite) | ✅ 対応 | +| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/mimocode/mimocode.db`(XDG データディレクトリ;SQLite) | ✅ 対応 | | Junie | [Junie](https://www.jetbrains.com/junie/) | `~/.junie/sessions/*/events.jsonl` | ✅ 対応 | | Command Code | [Command Code](https://github.com/CommandCodeAI/command-code) | `~/.commandcode/projects/**/*.jsonl`(トークン使用量はトランスクリプトから約4文字/トークンで推定;ディスクには永続化されない) | ✅ 対応 | | ZCode | [ZCode](https://zcode.z.ai/) | `~/.zcode/projects/**/*.jsonl` | ✅ 対応 | @@ -1289,7 +1289,7 @@ AIコーディングツールはクロスプラットフォームの場所にセ | Warp/Oz | `~/.config/tokscale/warp-cache/usage.json` | `%APPDATA%\tokscale\warp-cache\usage.json` | `tokscale warp sync` で同期;集計リクエスト数と使用金額のみ、トークントランスクリプトは含まない | | Grok Build | `~/.grok/sessions/` | `%USERPROFILE%\.grok\sessions\` | `GROK_HOME` 環境変数で設定可能。`updates.jsonl` セッション更新を解析 | | Jcode | `~/.jcode/sessions/` | `%USERPROFILE%\.jcode\sessions\` | `JCODE_HOME` 環境変数で設定可能。`session_*.json` スナップショットと `session_*.journal.jsonl` サイドカーを解析 | -| MiMo Code | `~/.local/share/micode/` | `%USERPROFILE%\.local\share\micode\` | XDG データディレクトリを使用;SQLite データベース `mimocode.db` | +| MiMo Code | `~/.local/share/mimocode/` | `%USERPROFILE%\.local\share\mimocode\` | XDG データディレクトリを使用;SQLite データベース `mimocode.db` | | Gajae-Code | `~/.gjc/agent/sessions/` | `%USERPROFILE%\.gjc\agent\sessions\` | `GJC_CODING_AGENT_DIR` で設定可能(`GJC_CONFIG_DIR`/`PI_CONFIG_DIR` も解決;Linux/macOS では `$XDG_DATA_HOME/gjc/sessions/` も対応) | | Junie | `~/.junie/sessions/` | `%USERPROFILE%\.junie\sessions\` | すべてのプラットフォームで同じホーム相対パス;`events.jsonl` 使用イベントを解析 | | ZCode | `~/.zcode/projects/` | `%USERPROFILE%\.zcode\projects\` | `*.jsonl` セッショントランスクリプトを解析;Z.ai の GLM モデル向け ADE | @@ -1666,7 +1666,7 @@ Synthetic は他ソースのメッセージを後処理で再帰属します。` ### MiMo Code -場所: `~/.local/share/micode/mimocode.db`(XDG データディレクトリ) +場所: `~/.local/share/mimocode/mimocode.db`(XDG データディレクトリ) MiMo Code は SQLite データベースにセッションデータを保存します。Tokscale はワークスペースコンテキストのために `session` テーブルと結合した `message` テーブルをクエリします: diff --git a/README.ko.md b/README.ko.md index 131bcc3c7..13dcc6147 100644 --- a/README.ko.md +++ b/README.ko.md @@ -85,7 +85,7 @@ | Kiro | Kiro | `~/.kiro/sessions/cli/*.json` (+ `*.jsonl`), `~/.local/share/kiro-cli/data.sqlite3` (macOS: `~/Library/Application Support/kiro-cli/data.sqlite3`), 그리고 Kiro IDE globalStorage 스냅샷 (`Kiro/User/globalStorage/kiro.kiroagent`; macOS Application Support, Linux `~/.config/Kiro`, Windows `%APPDATA%\Kiro`) | ✅ 지원 | | Gajae-Code | [gajae-code (gjc)](https://github.com/Yeachan-Heo/gajae-code) | `~/.gjc/agent/sessions/` (`GJC_CODING_AGENT_DIR`, `GJC_CONFIG_DIR`, `PI_CONFIG_DIR`로 오버라이드 가능; Linux/macOS에서는 `$XDG_DATA_HOME/gjc/sessions/`도 확인) | ✅ 지원 | | Jcode | [Jcode](https://github.com/1jehuang/jcode) | `~/.jcode/sessions/session_*.json` + `session_*.journal.jsonl` 사이드카 (`JCODE_HOME`으로 재정의 가능) | ✅ 지원 | -| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/micode/mimocode.db` (XDG 데이터 디렉토리; SQLite) | ✅ 지원 | +| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/mimocode/mimocode.db` (XDG 데이터 디렉토리; SQLite) | ✅ 지원 | | Junie | [Junie](https://www.jetbrains.com/junie/) | `~/.junie/sessions/*/events.jsonl` | ✅ 지원 | | Command Code | [Command Code](https://github.com/CommandCodeAI/command-code) | `~/.commandcode/projects/**/*.jsonl` (토큰 사용량은 트랜스크립트에서 토큰당 약 4자 기준으로 추정; 디스크에 저장되지 않음) | ✅ 지원 | | ZCode | [ZCode](https://zcode.z.ai/) | `~/.zcode/projects/**/*.jsonl` | ✅ 지원 | @@ -1295,7 +1295,7 @@ AI 코딩 도구들은 크로스 플랫폼 위치에 세션 데이터를 저장 | Warp/Oz | `~/.config/tokscale/warp-cache/usage.json` | `%APPDATA%\tokscale\warp-cache\usage.json` | `tokscale warp sync`로 동기화; 집계된 요청 수와 비용만, 토큰 트랜스크립트 없음 | | Grok Build | `~/.grok/sessions/` | `%USERPROFILE%\.grok\sessions\` | `GROK_HOME` 환경변수로 설정 가능; `updates.jsonl` 세션 업데이트 파싱 | | Jcode | `~/.jcode/sessions/` | `%USERPROFILE%\.jcode\sessions\` | `JCODE_HOME` 환경변수로 설정 가능; `session_*.json` 스냅샷과 `session_*.journal.jsonl` 사이드카 파싱 | -| MiMo Code | `~/.local/share/micode/` | `%USERPROFILE%\.local\share\micode\` | XDG 데이터 디렉토리 사용; SQLite 데이터베이스 `mimocode.db` | +| MiMo Code | `~/.local/share/mimocode/` | `%USERPROFILE%\.local\share\mimocode\` | XDG 데이터 디렉토리 사용; SQLite 데이터베이스 `mimocode.db` | | Gajae-Code | `~/.gjc/agent/sessions/` | `%USERPROFILE%\.gjc\agent\sessions\` | `GJC_CODING_AGENT_DIR`로 설정 가능 (`GJC_CONFIG_DIR`/`PI_CONFIG_DIR`도 지원; Linux/macOS에서는 `$XDG_DATA_HOME/gjc/sessions/`도 확인) | | Junie | `~/.junie/sessions/` | `%USERPROFILE%\.junie\sessions\` | 모든 플랫폼에서 동일한 home 상대 경로 사용; `events.jsonl` 사용 이벤트 파싱 | | ZCode | `~/.zcode/projects/` | `%USERPROFILE%\.zcode\projects\` | `*.jsonl` 세션 트랜스크립트 파싱; Z.ai의 GLM 모델용 ADE | @@ -1697,7 +1697,7 @@ Synthetic은 기존 에이전트 세션을 후처리하여 재귀속합니다. ` ### MiMo Code -위치: `~/.local/share/micode/mimocode.db` (XDG 데이터 디렉토리) +위치: `~/.local/share/mimocode/mimocode.db` (XDG 데이터 디렉토리) MiMo Code는 SQLite 데이터베이스에 세션 데이터를 저장합니다. Tokscale은 워크스페이스 컨텍스트를 위해 `session` 테이블과 조인된 `message` 테이블을 쿼리합니다: diff --git a/README.md b/README.md index c4556d40d..67b4b372e 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ | Cline | [Cline](https://github.com/cline/cline) | VS Code globalStorage tasks (Linux: `~/.config/Code/...`; macOS: `~/Library/Application Support/Code/...`; Windows: `%APPDATA%\Code\...`; server: `~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/`) | ✅ Yes | | Gajae-Code | [gajae-code (gjc)](https://github.com/Yeachan-Heo/gajae-code) | `~/.gjc/agent/sessions/` (override via `GJC_CODING_AGENT_DIR`, `GJC_CONFIG_DIR`, `PI_CONFIG_DIR`; `$XDG_DATA_HOME/gjc/sessions/` on Linux/macOS) | ✅ Yes | | Jcode | [Jcode](https://github.com/1jehuang/jcode) | `~/.jcode/sessions/session_*.json` + `session_*.journal.jsonl` sidecars (override via `JCODE_HOME`) | ✅ Yes | -| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/micode/mimocode.db` (XDG data dir; SQLite) | ✅ Yes | +| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/mimocode/mimocode.db` (XDG data dir; SQLite) | ✅ Yes | | Junie | [Junie](https://www.jetbrains.com/junie/) | `~/.junie/sessions/*/events.jsonl` | ✅ Yes | | Command Code | [Command Code](https://github.com/CommandCodeAI/command-code) | `~/.commandcode/projects/**/*.jsonl` (token usage estimated from transcripts at ~4 chars/token; not persisted on disk) | ✅ Yes | | ZCode | [ZCode](https://zcode.z.ai/) | `~/.zcode/projects/**/*.jsonl` | ✅ Yes | @@ -1300,7 +1300,7 @@ AI coding tools store their session data in cross-platform locations. Most tools | Warp/Oz | `~/.config/tokscale/warp-cache/usage.json` | `%APPDATA%\tokscale\warp-cache\usage.json` | Synced via `tokscale warp sync`; aggregate requests and spend only, no token transcripts | | Grok Build | `~/.grok/sessions/` | `%USERPROFILE%\.grok\sessions\` | Configurable via `GROK_HOME` env var; parses `updates.jsonl` session updates | | Jcode | `~/.jcode/sessions/` | `%USERPROFILE%\.jcode\sessions\` | Configurable via `JCODE_HOME` env var; parses `session_*.json` snapshots plus `session_*.journal.jsonl` sidecars | -| MiMo Code | `~/.local/share/micode/` | `%USERPROFILE%\.local\share\micode\` | Uses XDG data directory; SQLite database `mimocode.db` | +| MiMo Code | `~/.local/share/mimocode/` | `%USERPROFILE%\.local\share\mimocode\` | Uses XDG data directory; SQLite database `mimocode.db` | | Gajae-Code | `~/.gjc/agent/sessions/` | `%USERPROFILE%\.gjc\agent\sessions\` | Configurable via `GJC_CODING_AGENT_DIR` (also `GJC_CONFIG_DIR`/`PI_CONFIG_DIR`; `$XDG_DATA_HOME/gjc/sessions/` flattens on Linux/macOS) | | Junie | `~/.junie/sessions/` | `%USERPROFILE%\.junie\sessions\` | Same home-relative path on all platforms; parses `events.jsonl` usage events | | ZCode | `~/.zcode/projects/` | `%USERPROFILE%\.zcode\projects\` | Parses `*.jsonl` session transcripts; Z.ai's ADE for GLM models | @@ -1721,7 +1721,7 @@ Tokscale also checks Octofriend SQLite at `~/.local/share/octofriend/sqlite.db` ### MiMo Code -Location: `~/.local/share/micode/mimocode.db` (XDG data directory) +Location: `~/.local/share/mimocode/mimocode.db` (XDG data directory) MiMo Code stores session data in a SQLite database. Tokscale queries the `message` table joined with `session` for workspace context: diff --git a/README.zh-cn.md b/README.zh-cn.md index db22d4ffb..89ef602af 100644 --- a/README.zh-cn.md +++ b/README.zh-cn.md @@ -86,7 +86,7 @@ | Cline | [Cline](https://github.com/cline/cline) | VS Code globalStorage 任务(Linux: `~/.config/Code/...`;macOS: `~/Library/Application Support/Code/...`;Windows: `%APPDATA%\Code\...`;server: `~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/`) | ✅ 支持 | | Gajae-Code | [gajae-code (gjc)](https://github.com/Yeachan-Heo/gajae-code) | `~/.gjc/agent/sessions/`(可通过 `GJC_CODING_AGENT_DIR`、`GJC_CONFIG_DIR`、`PI_CONFIG_DIR` 覆盖;Linux/macOS 上 `$XDG_DATA_HOME/gjc/sessions/` 亦支持) | ✅ 支持 | | Jcode | [Jcode](https://github.com/1jehuang/jcode) | `~/.jcode/sessions/session_*.json` + `session_*.journal.jsonl` sidecar(可通过 `JCODE_HOME` 覆盖) | ✅ 支持 | -| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/micode/mimocode.db`(XDG 数据目录;SQLite) | ✅ 支持 | +| MiMo Code | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/mimocode/mimocode.db`(XDG 数据目录;SQLite) | ✅ 支持 | | Junie | [Junie](https://www.jetbrains.com/junie/) | `~/.junie/sessions/*/events.jsonl` | ✅ 支持 | | Command Code | [Command Code](https://github.com/CommandCodeAI/command-code) | `~/.commandcode/projects/**/*.jsonl`(Token 使用量按 ~4 字符/Token 从转录估算;不会持久化到磁盘) | ✅ 支持 | | ZCode | [ZCode](https://zcode.z.ai/) | `~/.zcode/projects/**/*.jsonl` | ✅ 支持 | @@ -1287,7 +1287,7 @@ AI 编程工具将会话数据存储在跨平台位置。大多数工具在所 | Warp/Oz | `~/.config/tokscale/warp-cache/usage.json` | `%APPDATA%\tokscale\warp-cache\usage.json` | 通过 `tokscale warp sync` 同步;仅汇总请求数和消费金额,不含 token 转录 | | Grok Build | `~/.grok/sessions/` | `%USERPROFILE%\.grok\sessions\` | 可通过 `GROK_HOME` 环境变量配置;解析 `updates.jsonl` 会话更新 | | Jcode | `~/.jcode/sessions/` | `%USERPROFILE%\.jcode\sessions\` | 可通过 `JCODE_HOME` 环境变量配置;解析 `session_*.json` 快照以及 `session_*.journal.jsonl` sidecar | -| MiMo Code | `~/.local/share/micode/` | `%USERPROFILE%\.local\share\micode\` | 使用 XDG 数据目录;SQLite 数据库 `mimocode.db` | +| MiMo Code | `~/.local/share/mimocode/` | `%USERPROFILE%\.local\share\mimocode\` | 使用 XDG 数据目录;SQLite 数据库 `mimocode.db` | | Gajae-Code | `~/.gjc/agent/sessions/` | `%USERPROFILE%\.gjc\agent\sessions\` | 可通过 `GJC_CODING_AGENT_DIR`(也可用 `GJC_CONFIG_DIR`/`PI_CONFIG_DIR`;Linux/macOS 上 `$XDG_DATA_HOME/gjc/sessions/` 亦支持)配置 | | Junie | `~/.junie/sessions/` | `%USERPROFILE%\.junie\sessions\` | 所有平台使用相同的 home 相对路径;解析 `events.jsonl` 使用事件 | | ZCode | `~/.zcode/projects/` | `%USERPROFILE%\.zcode\projects\` | 解析 `*.jsonl` 会话记录;Z.ai 的 GLM 模型专用 ADE | @@ -1694,7 +1694,7 @@ Tokscale 还会检测 `~/.local/share/octofriend/sqlite.db`,并在可用时解 ### MiMo Code -位置:`~/.local/share/micode/mimocode.db`(XDG 数据目录) +位置:`~/.local/share/mimocode/mimocode.db`(XDG 数据目录) MiMo Code 将会话数据存储在 SQLite 数据库中。Tokscale 查询 `message` 表并关联 `session` 表获取工作区上下文: diff --git a/crates/tokscale-core/src/clients.rs b/crates/tokscale-core/src/clients.rs index 4301a9f2c..5b63432ab 100644 --- a/crates/tokscale-core/src/clients.rs +++ b/crates/tokscale-core/src/clients.rs @@ -463,7 +463,7 @@ define_clients!( MiMoCode = 30 => { id: "micode", root: PathRoot::XdgData, - relative: "micode", + relative: "mimocode", pattern: "*.db", headless: false, parse_local: true, diff --git a/crates/tokscale-core/src/lib.rs b/crates/tokscale-core/src/lib.rs index 8480b5a3c..5afd714b3 100644 --- a/crates/tokscale-core/src/lib.rs +++ b/crates/tokscale-core/src/lib.rs @@ -3868,7 +3868,7 @@ mod tests { std::env::set_var("HOME", cache_home.path()); { - let micode_dir = source_home.path().join(".local/share/micode"); + let micode_dir = source_home.path().join(".local/share/mimocode"); std::fs::create_dir_all(&micode_dir).unwrap(); let db_path = micode_dir.join("mimocode.db"); diff --git a/crates/tokscale-core/src/scanner.rs b/crates/tokscale-core/src/scanner.rs index 3aa72f6ed..df17a83c0 100644 --- a/crates/tokscale-core/src/scanner.rs +++ b/crates/tokscale-core/src/scanner.rs @@ -915,14 +915,14 @@ fn scan_all_clients_with_env_strategy_inner( ); } - // MiMo Code: SQLite database(s) at ~/.local/share/micode/mimocode*.db + // MiMo Code: SQLite database(s) at ~/.local/share/mimocode/mimocode*.db if enabled.contains(&ClientId::MiMoCode) { let micode_xdg_data = if use_env_roots { std::env::var("XDG_DATA_HOME").unwrap_or_else(|_| format!("{}/.local/share", home_dir)) } else { format!("{}/.local/share", home_dir) }; - let micode_data_dir = PathBuf::from(format!("{}/micode", micode_xdg_data)); + let micode_data_dir = PathBuf::from(format!("{}/mimocode", micode_xdg_data)); // `discover_micode_dbs` already returns a sorted list. result.micode_dbs = discover_micode_dbs(&micode_data_dir); } diff --git a/crates/tokscale-core/src/sessions/micode.rs b/crates/tokscale-core/src/sessions/micode.rs index 535b3bb22..b1dd20242 100644 --- a/crates/tokscale-core/src/sessions/micode.rs +++ b/crates/tokscale-core/src/sessions/micode.rs @@ -1,7 +1,7 @@ //! MiMo Code session parser //! //! Parses messages from: -//! - SQLite database: ~/.local/share/micode/mimocode.db +//! - SQLite database: ~/.local/share/mimocode/mimocode.db use super::utils::open_readonly_sqlite; use super::{ From 26c5749b18f81831026dae0d573c159f9a1d0634 Mon Sep 17 00:00:00 2001 From: Junho Yeo Date: Sun, 28 Jun 2026 08:59:22 +0900 Subject: [PATCH 2/2] refactor(scanner): derive MiMo Code data dir from client metadata The scanner hardcoded the MiMo Code data root (XDG_DATA_HOME + "mimocode"), duplicating the path that lives in `ClientId::MiMoCode` metadata and risking drift the next time the directory changes. Resolve it via `ClientId::MiMoCode.data().resolve_path_with_env_strategy(...)` like OpenCode, Kimi, and the other XDG clients already do. Behavior-preserving: for an XdgData root the helper yields the identical `{XDG_DATA_HOME|~/.local/share}/mimocode` path. Verified by the existing test_micode_authoritative_cost_is_not_repriced_on_first_parse_or_cache_hit. Constraint: scan path must match clients.rs metadata to avoid silent non-detection Confidence: high Scope-risk: narrow --- crates/tokscale-core/src/scanner.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/crates/tokscale-core/src/scanner.rs b/crates/tokscale-core/src/scanner.rs index df17a83c0..b3046fb01 100644 --- a/crates/tokscale-core/src/scanner.rs +++ b/crates/tokscale-core/src/scanner.rs @@ -917,12 +917,14 @@ fn scan_all_clients_with_env_strategy_inner( // MiMo Code: SQLite database(s) at ~/.local/share/mimocode/mimocode*.db if enabled.contains(&ClientId::MiMoCode) { - let micode_xdg_data = if use_env_roots { - std::env::var("XDG_DATA_HOME").unwrap_or_else(|_| format!("{}/.local/share", home_dir)) - } else { - format!("{}/.local/share", home_dir) - }; - let micode_data_dir = PathBuf::from(format!("{}/mimocode", micode_xdg_data)); + // Derive the data dir from the client metadata so the scan path stays + // in sync with `ClientId::MiMoCode` (XdgData root + `mimocode`) rather + // than duplicating it here. + let micode_data_dir = PathBuf::from( + ClientId::MiMoCode + .data() + .resolve_path_with_env_strategy(home_dir, use_env_roots), + ); // `discover_micode_dbs` already returns a sorted list. result.micode_dbs = discover_micode_dbs(&micode_data_dir); }