# Claude Code 离线代码搜索：用 SQLite FTS5 返回命中片段和准确行号

SQLite FTS5原生MATCH/snippet/rank与源码行映射实跑，错误查询被拒绝，重建后旧定义不残留。

## 环境

- Python 3；此题标准库脚本或README指定的外部CLI。

## 启动

~~~sh
cd reference
python3 verify.py
# 运行后查看原生结果阅读器（读取records.json）
python3 -m http.server 8787
# 打开 http://127.0.0.1:8787/report.html
~~~

## 七步操作

1. 准备源码集合

输入为六份原创Python、TypeScript和说明文件。按路径与行号拆成记录，练习只索引明确列出的源码，不包含生成目录、依赖或私人代码。

2. 建立FTS5索引

使用SQLite FTS5创建虚拟表，path和line为UNINDEXED元数据，源码文本参与倒排索引。它是离线关键词检索，不是语义向量RAG。

3. 查询关键符号

用 MATCH 搜索 invoice_total，再通过 snippet 给命中词加标记并按rank排序。查询结果应指向定义和说明中的真实位置。

4. 映射真实行号

对每一条结果，用原始文件路径和行号回读对应行，确认该行确实包含目标符号。不能把全文命中以后随意标一个文件首行。

5. 拒绝坏查询

故意提交未闭合引号查询，SQLite必须返回可解释错误。用户输入的FTS查询语法需要单独处理，不能让异常把整个界面当作空结果。

6. 重建变更索引

把 billing.py 定义改为 receipt_total 后重建索引，再搜索旧符号。旧定义路径必须消失，说明重建没有把旧行残留当作最新代码。

7. 保存离线工具

运行 verify.py 可在内存中生成索引并核对行映射；下载包不分发运行时SQLite数据库。Claude Code可按合同补充目录扫描与增量更新，但本题未运行该账号会话。

## 目录身份

- starter：待完成的任务接口与原创输入，TODO不是已完成实现。
- reference：作者原生完成参考和实际产物。records.json/browser-result.json为本地实测记录，不是AI助手回复。
- TASK.md：可交给相应AI助手的原始任务合同。该助手账号生成会话未运行。

## 依赖与许可

原创教学代码以MIT许可提供。第三方项目、模型及浏览器遵循其自身许可。第三方依赖由本地安装获取，不包含node_modules、模型权重、WASM运行时、数据库、缓存或凭据。

## 官方依据

- https://www.sqlite.org/fts5.html
