by lovstudio
A desktop companion app for AI coding tools. Browse Claude Code chat history, manage configurations, commands, skills, and more.
# Add to your Claude Code skills
git clone https://github.com/lovstudio/AtaruGuides for using ai agents skills like Ataru.
Last scanned: 8/13/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-08-13T05:40:05.567Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}AI 编程过程中,真正有价值的答案经常已经出现过:一次故障排查、一条关键命令、一个架构取舍,或者一段几周前才讨论过的上下文。但这些内容分散在不同 Agent 的本地会话文件里,靠记忆、目录名和人工翻找很难重新定位。
Ataru 把这些已经发生过的对话变成本地可检索的记忆层:
Turn、Session、Project 三种粒度之间切换。Ataru 的目标不是管理正在运行的 Agent,而是让过去的工作重新变得可用。
| 能力 | 解决的问题 |
|---|---|
| 统一采集 | Claude CLI、Claude App/Web、Codex 等来源的会话格式不同,Ataru 在适配层归一化它们。 |
| 增量索引 | 新消息写入后自动追赶索引,不需要每次从头扫描全部历史。 |
| 中文友好全文检索 | Tantivy + Jieba 同时覆盖中文、代码、域名、包名和错误串。 |
| 混合召回 | 关键词适合精确匹配,自然语言问题可在语义索引可用时使用混合召回。 |
| 层级聚合 | 同一命中可以按回合、会话或项目汇总,减少重复结果。 |
| 上下文回读 | 保留稳定的 Project/Session/Turn/Message 标识、片段、角色、时间和行号。 |
| Agent 接入 | GUI、CLI 和 Agent Skill 共用同一套搜索契约,不把检索逻辑复制到各个客户端。 |
Ataru 的主路径只有两步:把本地会话整理成可检索的记忆,再从命中结果回到原始上下文。
从 GitHub Releases 下载对应平台版本,启动后进入搜索页即可开始。
第一次使用时,Ataru 会先检查本地索引:
idle,启动一次索引构建。search-index:build 事件报告进度。ready 后,搜索输入才会执行查询。索引是派生数据,不会改写原始会话;重建失败时保留上一个健康索引。
git clone --recursive https://github.com/lovstudio/Ataru.git
cd Ataru
pnpm install
pnpm dev:app
前端热更新和不自动重启 Rust 的开发模式:
pnpm dev
pnpm dev:app:no-watch
GUI 只是 Ataru 的一个客户端。面向 Agent 的正确抽象是一项单独的 Ataru Search Skill:它负责把“确认索引可用、发起搜索、读取上下文”变成一个稳定动作,而不是让每个 Agent 自己理解 Tantivy、文件路径或来源格式。
ensure_index → search → inspect → return stable context
| Skill 动作 | 具体行为 | 当前实现边界 |
|---|---|---|
ensure_index |
调用 get_search_index_status;索引未就绪时调用 start_search_index_build(false),等待状态变为 ready 或返回可复制错误。 |
桌面搜索页已经自动执行;独立 Skill/无界面 Runner 必须显式执行这一步。 |
search |
调用版本化的 ataru_search,传入 query、level、mode 和 limit。 |
Rust api 与 TypeScript SDK 已落地。 |
inspect |
使用结果中的稳定 projectId、sessionId、messageId、lineNumber 回读原始会话。 |
不从标题或展示路径重新猜测实体 ID。 |
return |
返回命中、实际检索模式、耗时、warnings 和可深链定位信息。 | 语义不可用时保留 ATARU_*_FALLBACK 警告。 |
面向 Tauri/桌面宿主时,Skill 只需要依赖以下公开命令:
const status = await invoke("get_search_index_status");
if (status.state !== "ready") {
await invoke("start_search_index_build", { force: false });
// 等待 search-index:build 事件,直到 state === "ready" 或 state === "error"
}
const response = await invoke("ataru_search", {
request: {
query: "上次是怎么解决索引没有更新的?",
level: "turn",
mode: "auto",
limit: 20,
},
});
无界面环境可以通过 JSON CLI 调用同一套搜索契约;首次查询前仍需完成 ensure_index。
Skill 不拥有另一套索引,也不复制排序算法;它只是 api/sdk 契约的 Agent-facing adapter。独立 SKILL.md 包装层应复用这套 ensure_index → search → inspect 流程,避免 CLI、桌面端和不同 Agent 之间出现三套行为。
Ataru 是一个本地优先的模块化单体。GUI、CLI 和 Agent Skill 都是客户端,核心检索能力集中在 Rust 的 sdk、api、ai、来源适配器和索引管线中。
flowchart TB
AGENT["Agent / Agent Skill"]
AGENT_SKILL["Ataru Search Skill\nensure_index → search → inspect"]
DESKTOP["Desktop UI\nReact 19"]
CLI["JSON CLI / automation"]
subgraph PUBLIC["Ataru public boundary"]
API["api\nvalidation · orchestration · fallback"]
SDK["sdk\nv1 request/response · stable IDs"]
AGG["Turn / Session / Project\naggregation"]
end
subgraph CORE["Local search core"]
ADAPTERS["Source adapters\nClaude · Codex · legacy"]
INGEST["Ingestion & indexing\nmanifest · incremental · reconcile"]
AI["ai\nintent · semantic recall · RRF"]
end
SOURCES[("Local transcript files")]
TEXT[("Tantivy + Jieba\nkeyword index")]
VECTOR[("SQLite / LanceDB\noptional vector store")]
EMBED["Optional embedding provider"]
CONTEXT["Raw context reader\nmessage · line · deep link"]
AGENT --> AGENT_SKILL
AGENT_SKILL --> API
DESKTOP --> API
CLI --> API
API --> SDK
API --> AGG
API --> AI
AGG --> SDK
SOURCES --> ADAPTERS
ADAPTERS --> INGEST
INGEST --> TEXT
INGEST --> VECTOR
AI --> TEXT
AI --> VECTOR
AI -. "explicit opt-in" .-> EMBED
API --> CONTEXT
CONTEXT --> SDK
职责: 为 Agent 提供单一的历史检索动作,处理索引初始化、查询参数、结果解释和上下文回读。
边界: Skill 不直接扫描 ~/.claude 或 ~/.codex,不解析 JSONL,不维护自己的缓存;所有事实都来自 api 返回的稳定契约。它可以运行在桌面宿主、CLI wrapper 或其他支持 Agent Skills 的环境中。
关键协议: ensure_index、search、inspect、return。其中 ensure_index 是首次使用的必要步骤,不能把“索引尚未构建”伪装成零结果。
sdk:稳定领域契约代码: src-tauri/src/app/ataru/sdk.rs、src/modules/sdk/search.ts
负责:
SearchRequest / SearchResponse / SearchHit。SearchLevel = turn | session | project。SearchMode = auto | keyword | semantic | hybrid。不负责: Tauri 命令、文件系统、HTTP、具体索引实现或 UI 状态。sdk 是依赖图中最底层的公开语言层,不能反向引用 api 或 ai。
api:入口、编排与降级代码: src-tauri/src/app/ataru/api.rs、src/modules/api/ataru.ts
负责:
auto 判断使用关键词或混合检索。ATARU_* warnings。ataru_search、索引状态和索引构建入口。不负责: 解析供应商文件、实现 tokenizer 或决定具体 Embedding 模型。
代码: src-tauri/src/app/session_parsing.rs、src-tauri/src/app/session_listing.rs、src-tauri/src/app/search.rs
负责: 读取不同 Agent 产生的本地 transcript,将不一致的记录转成统一的 Project、Session、Turn 和 Message。来源 ID 能稳定复用时必须保持复用,避免深链和历史映射失效。
输入: Claude CLI/App/Web、Codex 活跃与归档会话文件。
输出: 带来源、项目、会话、回合、消息位置和时间戳的规范化记录。
原则: 不改写原始 transcript;坏记录隔离并报告 ATARU_PARTIAL_SOURCE,其余来源继续可用。
代码: src-tauri/src/app/search.rs、src-tauri/src/app/core.rs
负责:
search-index-manifest.json 比较路径、大小、mtime、摘要和删除标记。索引状态: idle → building → ready;异常进入 error,并保留上一个健康索引。构建进度通过 search-index:build 事件发送给 UI 或 Skill 宿主。
ai:查询意图、语义召回与融合代码: src-tauri/src/app/ataru/ai.rs、src-tauri/src/app/search.rs
负责:
默认行为: 语义检索是 opt-in 增强,不会成为离线可用的前置条件;响应会保留实际 mode 和明确的 fallback warning。
事实来源: 用户本机的 Claude/Codex 会话文件。
派生数据: Tantivy 全文索引、search-index-manifest.json、可选 SQLite/LanceDB 向量索引和会话缓存。
边界: Ataru 可以清除或重建派生索引,但不删除原始会话。远程语义提供方只有在用户显式配置后才参与,并且只接收完成召回所需的最小化文本。
代码: src/modules/ui/AtaruSearchPage.tsx、src/modules/ui/ataru-search/*、src/components/*
负责: 搜索输入、IME 候选提交、层级/模式切换、索引状态、命中高亮、原始上下文预览和复制/深链动作。
重要约束: UI 是契约消费者,不从展示标题重建实体 ID;搜索输入和结果绘制不能等待全量会话读取;索引构建状态必须可见并支持重试。
代码: src-tauri/src/app/cli.rs、src-tauri/src/app/run.rs
CLI 在 Tauri 初始化之前处理 search 请求,适合 Agent wrapper、脚本和 CI。它支持
search <query> --json [--limit N] [--level turn|session|project],以及按稳定身份读取完整会话:
ataru session read \
--project-id PROJECT_ID \
--session-id SESSION_ID \
--json
session read 输出当前页面可见的消息 JSON,并按源文件顺序保留 uuid、line_number、角色和正文。
档案阅读器的“复制给 Agent”还会复制 ataru-agent-context/v1,其中包含同一组稳定 ID、真实源文件路径、CLI 参数、Tauri command 和当前页面消息快照。
新的聚合查询使用 Ataru v1 response。无界面调用方应先完成 ensure_index,不要在索引缺失时重复提交相同查询。
可观测性: 记录本地 request ID、阶段耗时、候选数、结果数、索引版本和 fallback code,不记录原始查询、会话正文、完整路径或密钥。
兼容性: 原始数据格式、既有 Tauri commands、JSON 字段和稳定映射 ID 通过 adapter 保留;v1 允许增加可选字段和 warning,不随意改变已有实体 ID。
transcript write
→ source adapter
→ normalized Project / Session / Turn / Message
→ single-writer queue
→ Tantivy commit + manifest update
→ optional vector index catch-up
→ searchable
Skill / CLI / UI
→ ensure_index
→ api validates request and deadline
→ keyword and/or semantic recall
→ RRF fusion
→ Turn / Session / Project aggregation
→ stable hit + snippet + source location
查询粒度的语义:
| 粒度 | 聚合键 | 最适合 |
|---|---|---|
turn |
project + session + turn |
找到“当时具体怎么解决的” |
session |
project + session |
回看一次完整讨论 |
project |
project |
了解一个项目的历史决策与演进 |
# Frontend development
pnpm dev
# Tauri desktop development
pnpm dev:app
# Frontend HMR without automatic Rust restart
pnpm dev:app:no-watch
# Build a distributable package
pnpm tauri build
src/
Ataru is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by lovstudio. A desktop companion app for AI coding tools. Browse Claude Code chat history, manage configurations, commands, skills, and more. It has 347 GitHub stars.
Yes. Ataru passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/lovstudio/Ataru" and add it to your Claude Code skills directory (see the Installation section above).
Ataru is primarily written in Rust. It is open-source under lovstudio on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh Ataru against similar tools.
No comments yet. Be the first to share your thoughts!