Skip to content

Commit b4e2a40

Browse files
committed
docs: move the site to ataru.lovstudio.ai and document the CLI and skills
- README: real headless CLI surface with its limits, plus the two published Agent Skills (lov-ataru-indexing / lov-ataru-search) - Pages custom domain and page metadata move from code.lovstudio.ai; the landing redirect now matches any lovstudio.ai host
1 parent 98657af commit b4e2a40

3 files changed

Lines changed: 52 additions & 9 deletions

File tree

README.md

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ pnpm dev:app:no-watch
105105

106106
## Agent Skill
107107

108-
GUI 只是 Ataru 的一个客户端。面向 Agent 的正确抽象是一项单独的 `Ataru Search Skill`:它负责把“确认索引可用、发起搜索、读取上下文”变成一个稳定动作,而不是让每个 Agent 自己理解 Tantivy、文件路径或来源格式。
108+
GUI 只是 Ataru 的一个客户端。面向 Agent 的正确抽象是 Skill:把“确认索引可用、发起搜索、读取上下文”变成稳定动作,而不是让每个 Agent 自己理解 Tantivy、文件路径或来源格式。这套抽象已经落地为两个可安装的 Agent Skill,见下方 [已发布的 Skill](#已发布的-skill)
109109

110110
### Skill 的最小工作流
111111

@@ -146,6 +146,25 @@ const response = await invoke("ataru_search", {
146146

147147
Skill 不拥有另一套索引,也不复制排序算法;它只是 `api/sdk` 契约的 Agent-facing adapter。独立 `SKILL.md` 包装层应复用这套 `ensure_index → search → inspect` 流程,避免 CLI、桌面端和不同 Agent 之间出现三套行为。
148148

149+
### 已发布的 Skill
150+
151+
| Skill | 职责 | 驱动脚本 |
152+
| --- | --- | --- |
153+
| `lov-ataru-indexing` | 检查索引状态、等待正在进行的构建、执行增量追赶或全量重建、预估语义索引成本 | `scripts/ataru_index.py` |
154+
| `lov-ataru-search` | 召回历史会话上下文,返回可定位命中,并按稳定 ID 回读原文窗口 | `scripts/ataru_recall.py` |
155+
156+
```bash
157+
npx lovstudio skills add ataru-indexing
158+
npx lovstudio skills add ataru-search
159+
```
160+
161+
两个 Skill 都通过 JSON CLI 驱动,不复制排序算法,也不维护第二套索引:
162+
163+
- 二进制解析后先做 `--version` 门控(要求 ≥ 0.41.3),避免旧版本把 CLI 参数 fall through 成一个桌面窗口。
164+
- `lov-ataru-search` 在索引未就绪时**拒绝执行**并返回 `ATARU_INDEX_NOT_READY` / `ATARU_INDEX_BUILDING`,绝不把“索引缺失”伪装成“零命中”。
165+
- CLI 只有关键词模式,因此 Skill 返回的 `mode` 恒为 `keyword``semanticAvailable` 恒为 `false`;需要语义或 hybrid 召回请用桌面端。
166+
- 在实测语料(2705 sessions / 847526 messages / 6.6GB 索引)上,turn 级查询约 48s,因此 Skill 默认超时为 180s(`read` 为 300s)。
167+
149168
## Architecture
150169

151170
Ataru 是一个本地优先的模块化单体。GUI、CLI 和 Agent Skill 都是客户端,核心检索能力集中在 Rust 的 `sdk``api``ai`、来源适配器和索引管线中。
@@ -291,16 +310,40 @@ flowchart TB
291310

292311
**代码:** `src-tauri/src/app/cli.rs``src-tauri/src/app/run.rs`
293312

294-
CLI 在 Tauri 初始化之前处理 `search` 请求,适合 Agent wrapper、脚本和 CI。它支持
295-
`search <query> --json [--limit N] [--level turn|run|session|project]`,以及按稳定身份读取完整会话:
313+
CLI 在 Tauri 初始化之前处理请求,适合 Agent wrapper、脚本和 CI。全部子命令都返回单个 JSON 对象:
296314

297315
```bash
316+
# 版本门控:CLI 必须先确认二进制支持这些子命令
317+
ataru --version --json
318+
319+
# 索引:读取状态 / 触发无界面构建
320+
ataru index status --json
321+
ataru index build --json # 增量追赶
322+
ataru index build --force --json # 全量重建
323+
324+
# 语义索引预估(不写入)
325+
ataru semantic preview --json
326+
327+
# 检索:可选层级与项目过滤
328+
ataru search "索引没有更新" --json \
329+
--level turn --limit 20 \
330+
--project-id PROJECT_ID
331+
332+
# 按稳定身份读取完整会话
298333
ataru session read \
299334
--project-id PROJECT_ID \
300335
--session-id SESSION_ID \
301336
--json
302337
```
303338

339+
**CLI 的真实边界(不要在包装层里承诺更多):**
340+
341+
- 未识别的参数会 fall through 去启动桌面 GUI,因此任何外部脚本都必须先用 `--version` 做版本门控。
342+
- `--level` 会强制 `SearchMode::Keyword`:CLI 只提供关键词检索,语义与 hybrid 仅在桌面端可用。
343+
- `--limit` 上限 200;带 `--level` 的聚合查询上限 100。
344+
- 项目 ID 是以 `-` 开头的路径 slug(如 `-Users-me-code-app`),传给 argparse 类解析器时必须写成 `--project-id=VALUE`
345+
- 索引构建锁只在进程内生效;CLI 与桌面端并发构建依靠「写临时目录再原子替换」兜底,构建前应先读 `index status`
346+
304347
`session read` 输出当前页面可见的消息 JSON,并按源文件顺序保留 `uuid``line_number`、角色和正文。
305348
档案阅读器的“复制给 Agent”还会复制 `ataru-agent-context/v1`,其中包含同一组稳定 ID、真实源文件路径、CLI 参数、Tauri command 和当前页面消息快照。
306349

index.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,22 @@
99
name="description"
1010
content="Ataru helps you quickly and accurately recall past conversations with Claude Code, Codex, and other AI coding tools."
1111
/>
12-
<link rel="canonical" href="https://code.lovstudio.ai/" />
12+
<link rel="canonical" href="https://ataru.lovstudio.ai/" />
1313
<meta property="og:type" content="website" />
14-
<meta property="og:url" content="https://code.lovstudio.ai/" />
14+
<meta property="og:url" content="https://ataru.lovstudio.ai/" />
1515
<meta property="og:title" content="Ataru — Find past AI conversations, fast" />
1616
<meta
1717
property="og:description"
1818
content="Quickly and accurately recall past conversations with Claude Code, Codex, and other AI coding tools."
1919
/>
20-
<meta property="og:image" content="https://code.lovstudio.ai/ataru.png" />
20+
<meta property="og:image" content="https://ataru.lovstudio.ai/ataru.png" />
2121
<meta name="twitter:card" content="summary_large_image" />
2222
<meta name="twitter:title" content="Ataru — Find past AI conversations, fast" />
2323
<meta
2424
name="twitter:description"
2525
content="Quickly and accurately recall past conversations with Claude Code, Codex, and other AI coding tools."
2626
/>
27-
<meta name="twitter:image" content="https://code.lovstudio.ai/ataru.png" />
27+
<meta name="twitter:image" content="https://ataru.lovstudio.ai/ataru.png" />
2828
<style>
2929
/* Splash screen — paints on the very first frame, before React mounts.
3030
Removed by main.tsx once <RouterProvider> renders. */
@@ -97,7 +97,7 @@
9797
// app shell and the beige background would paint a giant block.
9898
(function () {
9999
var hash = location.hash || "";
100-
if (location.hostname === "code.lovstudio.ai" && (!hash || hash === "#" || hash === "#/")) {
100+
if (/(^|\.)lovstudio\.ai$/.test(location.hostname) && (!hash || hash === "#" || hash === "#/")) {
101101
location.replace("/#/landing");
102102
return;
103103
}

public/CNAME

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
code.lovstudio.ai
1+
ataru.lovstudio.ai

0 commit comments

Comments
 (0)