README.md

July 2, 2026 · View on GitHub

Jikji

Jikji find: local file discovery for AI agents
파일 하나 찾을 때마다 38,650 토큰, 57초, 11.7회 LLM 호출을 쓰던 raw agent 탐색을 줄이는 비파괴 로컬 탐색 스킬
같은 551건에서 Jikji find는 파일 하나당 447 토큰, 2.1초, 1회 호출로 더 높은 Hit@1을 냈다.

License: MIT Rust CLI Safety: non destructive

Jikji find - local file discovery for AI agents

Live intro · GitHub · Benchmarks · Agent install guide · Skill file

Public homepage: https://nomadamas.github.io/jikji/. It is a GitHub Pages static site, so the public landing page is served through GitHub's CDN rather than a local tunnel.


What is Jikji?

Jikji prepares an explicit local folder so AI agents can find files, folders, metadata, and parsed document text without repeatedly crawling the original filesystem.

Jikji does not move, rename, delete, or reorganize user files. It creates generated maps and caches under .jikji/ plus .jikji_agent_map.md.

This repository is currently a monorepo during the Rust port. The Rust workspace under crates/ is the active CLI implementation, while the Python package under python/jikji/ remains as the reference implementation and parity-test source until the port is fully retired.

The public agent command is:

jikji find ROOT "natural language file clue" --json

jikji find builds a multi-query, multi-route candidate slate from metadata, file maps, parser caches, graph routes, and local text indexes. The agent can then use one bounded LLM judgment over the returned top-k slate instead of spending many exploratory chat turns on ls, find, grep, document opening, and query guessing.

Why It Saves Calls And Gets More Accurate

Jikji is faster because the expensive discovery work is done before the agent is asked to find a file:

  • No parse-at-search-time loop: PDF, HWP/HWPX, Office, text, subtitles, HTML, archives, and opt-in media OCR/ASR are parsed into .jikji/doc_text/ and metadata caches during prepare.
  • No repeated path wandering: folder profiles, file cards, duplicate hints, route rows, and .jikji_agent_map.md turn a messy tree into an agent-readable file map.
  • Fielded local search: path, filename, folder, extension, body text, metadata, and deterministic semantic terms are indexed separately, so obvious path clues and body-only clues both rank well.
  • LLM Wiki for agents: each source gets a compact grounded wiki page, so the agent can inspect a short source summary instead of opening large raw files.
  • Knowledge graph routes: source, folder, term, intent, and duplicate nodes are prebuilt into .jikji/knowledge_graph.json and .jikji/graph_routes.jsonl for low-token candidate routing.
  • Multi-route candidate slate: jikji find generates query variants, gathers top-k candidates from metadata, file-map, wiki/cache, graph, and text routes, deduplicates by path, then returns one slate for bounded agent judgment.
  • Freshness without search-time prepare: Jikji find checks a source-tree signature and reports when it is using the previous index. Refreshing is done through jikji prepare / jikji refresh, not by surprise work inside find.

This is RAG-style retrieval context, not a mandatory vector DB or cloud RAG stack. Jikji's default index is local and deterministic: no embeddings, cloud parser, or LLM call is required to prepare or search. The LLM is used only by the agent when it needs to choose from the returned candidate slate.

Quick Start

Tell your CLI agent this one sentence:

GitHub 저장소 https://github.com/NomaDamas/jikji 에서 Jikji를 설치하고, 내 CLI 에이전트들이 `jikji find`를 바로 쓰도록 Jikji skill까지 연결해줘.
git clone https://github.com/nomadamas/jikji.git
cd jikji
cargo install --path crates/jikji-cli

jikji agent-skill-install --agent all --json
jikji prepare ~/Documents --json
jikji find ~/Documents "contract pdf from last spring" --json

You can also install a published binary from the GitHub Releases page and place the jikji executable on PATH. crates.io publishing uses trusted publishing from the main publish workflow; token-based publishing is only a manual fallback for maintainers. Release and crates.io maintainer setup is documented in docs/release-publishing.md.

Korean example:

jikji find ~/Documents "작년 봄 계약서 PDF" --json

agent-skill-install queues a low-impact post-install prepare for common user material folders and document-heavy folders it can safely discover under the user home directory. That initial prepare focuses on document extensions such as PDF, HWP/HWPX, Word, Excel, PowerPoint, and RTF. jikji find itself does not prepare unindexed roots; it searches only existing Jikji indexes. For setup and diagnostics:

jikji prepare ROOT --json
jikji refresh ROOT --json
jikji doctor ROOT --json
jikji map ROOT
jikji clean ROOT --dry-run --json

prepare writes the Jikji routing block in AGENTS.md, CLAUDE.md, and .cursorrules by default. Use jikji prepare ROOT --no-agent-rules to skip those block updates for a root.

Why Agents Need It

Raw local agents typically do this:

guess query -> list folders -> grep files -> open documents -> repeat

Jikji-equipped agents start here:

jikji find ROOT "query" --json -> read answer_paths/candidates -> verify only top evidence

Use Jikji as the first action whenever an explicit root is available. Raw filesystem search is a fallback only after the returned handoff_action allows it.

Measured Headline

HippoCamp Fullset, 551 local file-search cases, same Hermes task scope. The table is the fullset total; the README headline above uses per-case averages.

mode         cases  Hit@1   Hit@10  calls  input tokens  output tokens  total tokens  seconds    est. cost
raw Hermes     551  0.6697  0.7786  6,420  19,799,362    1,496,916      21,296,278    31,231.9   13,361원
Jikji find     551  0.7949  0.7949    551     228,684       17,632         246,316     1,164.2      156원

Per file-search case, raw Hermes averaged 11.7 LLM calls, 38,650 total tokens, 56.7s, and about 24원; Jikji find averaged 1 call, 447 total tokens, 2.1s, and about 0.3원.

Fullset result: Hit@1 improves from 0.6697 to 0.7949, Hit@10 improves from 0.7786 to 0.7949, LLM calls drop 6,420 -> 551 (11.65x), wall time drops 31,231.9s -> 1,164.2s (26.83x), and total tokens drop 21,296,278 -> 246,316 (86.46x). This is why the public product is now Jikji find.

Other benchmark examples are shown in docs/jikji-benchmarks.html, including media OCR/ASR, Korean public-data XLSX, hard KOGL document sets, Workspace-Bench-Lite, MIRACL-VISION, EDiTh, and BEIR diagnostics.

Agent Protocol

Paste this behavior into Claude Code, Codex, Hermes, OpenCode/OpenClone-style agents, or any CLI-capable local agent:

Use Jikji for local file discovery when an explicit root is available.
First call: jikji find ROOT "query" --json.
Prefer answer_paths[] first. Preserve order when agent_should_not_rerank is true.
When handoff_action is direct_use, accept answer_paths[] / paths[] and avoid broad crawling.
When handoff_action is jikji_retry, run exactly one sharper Jikji find retry before raw fallback.
When handoff_action is raw_fallback_after_retry, raw search is allowed only after that retry failed, stayed empty, or stayed clearly wrong.
Inspect evidence_pack[].next_read, candidates[].next_read, or original files only for final verification.
Never move, rename, delete, or reorganize user files.

Install the reusable skill instruction:

jikji agent-skill-install --agent all --json
jikji hermes-skill-install --json
jikji codex-skill-install --json
jikji skill-export --dest /path/to/that-agent/skills/jikji/SKILL.md --json

What Jikji Creates

.jikji_agent_map.md         root guide for humans and agents
AGENTS.md / CLAUDE.md / .cursorrules  routing block pointing agents to `jikji find`
.jikji/search_index.sqlite  instant lexical/content/metadata search index
.jikji/doc_text/            parsed PDF/HWP/HWPX/Office/etc. text cache
.jikji/file_cards.jsonl     per-file cards, tags, parse status, evidence
.jikji/folder_profile.jsonl folder roles and navigation context
.jikji/agent_routes.md      safe fallback route for autonomous agents
.jikji/wiki/index.md        deterministic local LLM Wiki entry point
.jikji/wiki/sources/*.md    compact grounded Markdown page per source
.jikji/knowledge_graph.json source/folder/term/intent/duplicate graph
.jikji/graph_routes.jsonl   low-token route rows

Repository Layout

This repository is intentionally structured as a Rust/Python monorepo:

crates/                    Rust workspace crates and the shipped CLI
python/jikji/              Python reference, benchmark, and media package
tests/parity/              Cross-stack contract tests
tests/golden/              Checked-in Python golden fixtures for Rust parity
tools/parity/              Python-vs-Rust parity and benchmark harnesses
skills/                    Local-agent skill assets
docs/                      Product, release, and benchmark documentation

The Rust CLI is the product distribution surface. The Python package remains a first-class workspace member for reference behavior, benchmark compatibility, golden fixture capture, and optional media/OCR-ASR support.

Generated artifacts can be regenerated or removed with jikji clean. The routing block in AGENTS.md / CLAUDE.md / .cursorrules is updated in place on each prepare and can be skipped with jikji prepare ROOT --no-agent-rules; jikji clean removes the block while preserving any user-authored content.

The Rust CLI command surface includes prepare, refresh, clean, map, doctor, find, search, brief, discover, graph, gui, agent-skill-install, agent-specific skill installers, skill-export, and the hidden post-install-prepare worker command. Eval and benchmark fixture commands, hippocamp-fetch, hermes-bench, hermes-compare, and benchmark-value-report are Python-only benchmark compatibility commands. They are present as explicit compatibility commands because benchmark parity must use the same Python evaluator for Python Jikji and Rust Jikji.

Media Text

PDF, HWP/HWPX, Office, text, subtitles, HTML, JSON/YAML, and archives are indexed within size and timeout limits. Image, audio, and video content OCR/ASR is opt-in through the Python media bridge so the default Rust binary remains lightweight and Python-free for normal prepare/search/find. The split Rust crates can also be reused directly: jikji-parser for deterministic parsers, jikji-index for sidecar artifact generation, jikji-search for local search/discovery, and jikji-agent for local-agent integrations. jikji-bench is internal and is not published. because it can use CPU/RAM:

pip install "jikji[media]"
jikji prepare ROOT --enable-media-index --media-index-max-mb 25

Development

python3 -m venv .venv
.venv/bin/pip install -e python/jikji
.venv/bin/pip install pytest ruff
.venv/bin/ruff check python/jikji/src python/jikji/tests tests/parity tools/parity
.venv/bin/pytest python/jikji/tests tests/parity -q
.venv/bin/python -m compileall -q python/jikji/src python/jikji/tests tests/parity tools/parity

License

MIT License. See LICENSE.