Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

intentgrep

用自然语言在选定文件或 JSONL 记录中找原文,沿用 grep 的行、文件、管道和退出码习惯。已知符号、字符串或正则表达式时,直接用 grep/rg;需要按意思找线索时,再用 intentgrep。

intentgrep -rn --context-lines 2 '哪些代码在取消后停止后台工作?' src
intentgrep -n -C 2 '记录数据库迁移决定的内容' notes.md
intentgrep --task filter --input jsonl --json '记录明确描述一次失败部署' records.jsonl

它把所选原文交给 TypeSafe Jev 判断,返回原文与评分,不生成答案,不要求先建 embedding 索引或 AST。默认逐行搜索;代码需要邻近行时,用 --context-lines 给模型补充上下文。

包名:@shareai-lab/intentgrep;命令:intentgrep。 当前版本为 0.1.0 预览。源码与完整评估记录在 shareAI-lab/intentgrep。同时保留 jevgrep 兼容命令;npm 上的无 scope 包 jevgrep 是其他项目。

第一次试用

需要 Node.js 22 或更新版本,运行时没有第三方依赖。直接运行固定版本,无需全局安装:

npx --yes --package=@shareai-lab/intentgrep@0.1.0 intentgrep --help

先对合成数据做一次离线计划:

printf '%s\n' 'The deployment failed.' 'The deployment succeeded.' | \
  npx --yes --package=@shareai-lab/intentgrep@0.1.0 intentgrep \
  --plan --task filter --max-requests 8 --max-input-bytes 80000 \
  'The line explicitly describes a failed deployment.'

计划读取本地输入,展示候选数、请求体字节与判断方式,不需要 API key,也不调用模型。准备好 TYPESAFE_API_KEY 环境变量后,把 --plan 换成 --json,在相同范围执行真实查询。不要把 key 写进命令参数、示例文件或日志。

默认模型固定 jev-1.13.0;--model 可以改动。--base-url/TYPESAFE_BASE_URL 用于兼容端点,支持 HTTPS 或本机 loopback HTTP,不跟随重定向。真实查询会发送所选原文、metadata、模型上下文与额外判断指引。 如果不允许远程处理这些材料,使用离线计划或获准的端点。

长期反复使用的人或 Agent 可以安装到自己的 Node 环境:

npm install -g @shareai-lab/intentgrep@0.1.0
intentgrep --version
intentgrep --help

后文为简洁使用 intentgrep;没有全局安装时,继续使用上面的 npx 前缀。团队工具可作为项目依赖固定在 lockfile 中,用 npm script 调用。全局安装不等于给 Node 应用安装 SDK。

需要本地构建时,克隆仓库,运行 npm ci && npm pack,再把 npx 的 --package 改为生成的 .tgz 绝对路径。

grep 用户可以沿用什么

形式是 intentgrep [OPTIONS] PATTERN [FILE...]。PATTERN 是非空自然语言查询或条件,不是正则表达式。

  • 默认单位是物理行,保留输入文件/记录顺序,不自动带行号或分数。-n 显示行号,--score 显示附加评分。
  • 单个文件或 stdin 默认不带文件名前缀;多个输入操作数或递归搜索显示文件名。-H 强制显示,-h 隐藏;--label 给 stdin 命名。
  • 目录需要 -r;-r 没有文件操作数时搜索当前目录。没有文件操作数且没有 -r 时读取 stdin;- 也表示 stdin,终端输入以 EOF 结束。
  • -e 可重复提供条件,-f 从文件逐行读取条件;多条件按 OR 选择。查询文本内的换行也分隔条件。空白条件会报错;空的 -f 文件不选任何记录,配合 -v 则选择所有记录,无需模型调用。
  • -- 结束选项解析,适用于以 - 开头的查询或文件名。-rn 等短选项组合可用。
intentgrep -n '描述请求失败后的重试' client.ts
intentgrep -rnl '定义了取消处理' src
intentgrep -e '描述限流' -e '描述退避重试' client.ts worker.ts
printf '%s\n' 'Retries after a timeout.' | intentgrep --label example '描述重试'
选项 行为
-v 反转阈值选择;不是对相反命题的证明
-c 按文件输出选中单位的数量,包括 0
-l / -L 列出有选中记录/没有选中记录的文件;空文本文件参与判断,跳过的二进制文件不算空文件
-q 不输出,发现首个选中记录后停止继续判断
-m N 每个来源最多选中前 N 个;-m 0 不调用模型,不是取最高分 N 个
-A N / -B N / -C N 输出命中行之后/之前/前后的原文,相邻组会合并
-Z 文件名后使用 NUL 分隔,适合继续传入其他工具
-s 不打印错误信息,错误退出码仍为 2

-q 优先于其它输出方式;文件列表优先于计数;JSON/JSONL 不与计数、文件列表或 quiet 混用。输出上下文中,选中行和上下文行分别使用 : 与 - 分隔前缀,不相连的组之间输出 --。普通管道保留原文字符;终端可见输出会处理控制字符,NUL 文件名输出保持真实文件名。

这里没有复用正则模式选项的含义;-E/-F/-P/-i/-w/-x/-o/-R 不受支持,需要精确匹配时使用 grep/rg。

搜索线索与筛选记录

CLI 默认 --task search;SDK 默认 task: 'filter'。 这是两种不同的判断问题:

task 模型需要判断什么 适合的输入
search 这一段是否为调查当前问题提供具体有用的证据,不要求它独自证明整个答案 代码、文档、决策记录中的线索
filter 这条记录本身是否满足给定条件 要归类或筛选的 JSONL/应用记录

寻找“用户是否批准迁移”的证据时,用户的拒绝、延期和撤回也可能是有用结果。若用 filter 问“记录明确包含批准”,它们通常不满足这个条件。任何一种分数都不能把助手提议变成用户确认。

--profile auto|generic|code|docs|memory 调整判断关注点。CLI 默认 auto,只把文件扩展名当作弱提示;SDK 默认 generic。memory 关注说话人、时间和证据状态,code 关注代码证据,显式 profile 覆盖自动选择。它们不会自动加载项目内的提示文件。

可以用 --instructions '额外判断准则' 或 --instructions-file rubric.txt 补充领域规则,二者互斥。它们补充现有任务,不替换整个协议,也不执行代码。-f 与 --instructions-file 的文件输入限 1 MiB、合法 UTF-8 普通文件,拒绝末级符号链接、FIFO 和设备;-f - 仍可显式读取 stdin。例子:

intentgrep --task search --profile memory \
  --instructions '批准、延期和撤回都可能是相关证据;保留说话人和时间。' \
  '关于数据库迁移,用户作过哪些决定?' decisions.md

--layout isolated|shared 用于可复现地比较提示布局。默认 isolated 把每条候选放入自己的问题;shared 把本批候选放入公共 state,问题再指向目标候选。布局会改变请求与效果,需要对目标后端实测,不保证某个布局始终更快或更准。

离线计划的 prompt 字段记录提示版本、task、profile、layout、实际 profiles 以及额外指引的哈希,便于检查这次到底怎么判断。

两种上下文不要混用

--context-lines N 把目标行前后的 N 行作为模型输入,帮助理解目标行;默认 0,邻近行不因为附带进入模型就自动算作命中。-A/-B/-C 只增加结果输出中的原文,不改变模型看到的材料。

# 模型看到每个候选两侧 3 行;只输出选中行。
intentgrep -n --context-lines 3 '处理任务取消' worker.ts

# 模型仍只看到目标行;结果另外显示相邻 3 行。
intentgrep -n -C 3 '处理任务取消' worker.ts

如需判断一个完整段落或代码窗口,显式选择 --unit paragraph|window|document。window 使用 --lines 12 --overlap 2;这些扩展单位下,文本输出按源行合并,-c 计数仍是选中单位,不能当作不重复的物理行数量。line 模式保留空白行,不把一个长行拆成多个计数单位;超长行会失败,提示改用合适的扩展单位或调整长度限制。

范围、停止条件与结果

所有本地输入先完整预检,再开始付费请求。即使 -q 已有可能很快命中,未知路径、格式或大小错误也会在模型调用前失败。这是有意保留的差异,不采用 GNU grep 某些场景下“已有匹配盖过输入错误”的退出语义。

模型判断阶段,-q/-l/-m 可以停止后续工作;-L 在某文件出现首个选中记录后可跳过其余记录。已经发出的请求无法保证从远端撤回。JSON 中的 complete: false 与 stopReason: 'match-limit' 表示提前停止;summary.evaluated 是实际判断数,未判断记录不被当作 false。

默认按来源顺序输出。--sort score 按分数排序;--top N 同时使用评分排序并限制返回数,仍需要判断整个候选范围。排名不能与 -q/-l/-L/-c/-m 或输出上下文混用。--sort source 与 --top 也不能一起用。

relevance 是本次问题的模型评分。多条件时,它是各条件评分的最大值,不是经过校准的“至少一个条件成立”的联合概率。默认阈值为 0.6;-v 只反转是否过阈值。低分可能是证据不足或漏判,不意味着相反事实已经成立。

退出码:0 存在选中记录,1 没有选中记录,2 输入、预算、网络或响应失败;--help/--version/--plan 成功返回 0。-L 同样按是否存在选中记录计算退出码,不按是否打印了文件名;只打印无匹配文件名时可能返回 1。SIGINT/SIGTERM 分别返回 130/143。查询错误不输出已完成的小部分结果冒充成功;下游关闭管道不会产生 EPIPE 堆栈。

--json 输出 {schemaVersion, scope, plan, result};--jsonl 输出 match 行与最终 summary。结果包含原记录、源路径/行号/SHA-256 和评分;result.results 只含已判断记录,保留输入顺序。文件变化后应重新检查,不用旧哈希冒充当前内容。

递归发现包含隐藏文件,--no-hidden 可关闭。支持重复 --include、--exclude、--exclude-dir;glob 只支持 *、**、?,不承诺完整 .gitignore 语义。明显凭据和常见依赖/产物目录仍有可见的范围保护;显式给定的非敏感根不因发现规则被静默跳过。这不是秘密扫描器,普通文件也可能含敏感内容。

发现的 symlink 不遍历,显式末级 symlink 也被拒绝;输入祖先中的目录别名解析后再检查真实路径。跳过项与排除规则在 scope 中可查,不能把省略范围称作“搜索了全部仓库”。

限制 默认
单候选 --chunk-chars 2000 个 Unicode 码点
--max-candidates / --max-files 500 / 1000
--max-file-bytes / --max-bytes 1 MiB / 10 MiB
--batch-size / --concurrency 8 / 4
单请求 --max-request-bytes 24000 字节
全查询 --max-requests / --max-input-bytes 100 次尝试 / 1000000 字节
每次 --timeout / 额外 --retries 30000 ms / 2

请求次数与字节包含重试和指引/metadata/模型上下文。提前停止的计划会标记 stopEarly 与 canCompleteWithinBudget;完整扫描计划可能超预算,但实际运行仍逐次强制预算,耗尽时失败。字节不是精确 token 或金额估计;token usage 只累加成功响应,无法知道失败或超时请求的远端收费。

独立安装 Agent Skills

仓库提供 intentgrep 和 intent-memory 两份 Skill。它们是宿主的操作指引,不是 CLI 的子命令;npm 安装也不会通过生命周期脚本安装 Skill。

在要使用 Skill 的项目里运行。skills@1.7.0 本身需要 Node >=22.20.0:

npx --yes skills@1.7.0 add shareAI-lab/intentgrep --list
npx --yes skills@1.7.0 add shareAI-lab/intentgrep \
  --skill intentgrep intent-memory --agent codex --copy --yes

这使用 Vercel Skills CLI,默认安装到当前项目;跨项目使用时显式加 --global。--skill 在这里属于 Skills 安装器。也可以将仓库名换成本地 checkout 的绝对路径。

Skill 与 CLI 分开准备:长期 Agent 可使用前面的全局安装,团队也可固定项目依赖。宿主根据任务选择精确搜索、读文件或语义搜索,不必每一步都调用 intentgrep。memory Skill 允许把有界检索委派给宿主已有的轻量 Agent,默认至多 3 轮,共用尝试/字节预算;它不会常驻运行、自动写记忆或把评分升级为授权。

Node 后端:同包 SDK 子路径

应用先依据调用者身份从自己的数据库挑选获准记录,再调用查询核心。SDK 只是同一包的 @shareai-lab/intentgrep/sdk 子路径;不需要第二个包,也不连接数据库或替代业务认证。

npm install --save-exact @shareai-lab/intentgrep@0.1.0
import { JevClient, planQuery, queryRecords } from '@shareai-lab/intentgrep/sdk';

const records = [
  { id: 'r1', text: 'The deployment exited with code 1 before changing production.' },
  { id: 'r2', text: 'The deployment finished successfully.' }
];
const predicate = 'The record explicitly describes a failed deployment';
const options = { task: 'filter', maxRequests: 8, maxInputBytes: 80000 };
console.log(planQuery(records, predicate, options));

// Actual query requires TYPESAFE_API_KEY in the server environment.
const result = await queryRecords(new JevClient(), records, predicate, options);
console.log(result.matches);

SDK 默认 filter/generic/isolated,而 CLI 默认 search/auto/isolated;调查问题时显式选择 task: 'search'。instructions 提供额外判断准则;SDK 的 context 提供共享背景,记录的 context.before/after 可提供邻近原文。

checks 为每条记录增加独立 filter 判断,即使主 task 是 search,也不会把这些检查改为线索搜索。它们不自动排除记录,由调用者解释并验证。queryRecords 接受多个 OR 条件、AbortSignal 与 Evaluator,共享 CLI 的分批和预算;自定义 evaluator 如有重试,必须在每次尝试前调用 beforeAttempt。

examples/sdk.mjs 演示寻找记忆证据与附加检查,默认只打印计划;显式 --live 才请求模型。低层 JevClient.evaluate() 可使用 typed questions,但不是入门必需,也不承诺替代官方 TypeSafe SDK 的全部能力。

Python 流水线:JSONL 进,JSON 出

每行是 {id?, text, metadata?};--text-field 可改文本字段。JSONL 的一个对象是一个语义记录,物理文件行只用于来源定位。metadata 同样进入模型,应用须先完成访问范围过滤。

生产流水线可在部署时将固定版本安装到自己的工具目录,随后直接调用固定 bin,不必每个请求都经 npx 获取包:

npm install --prefix .intentgrep-tools --save-exact @shareai-lab/intentgrep@0.1.0
import json
import subprocess

records = [{"id": "r1", "text": "The deployment exited with code 1."}]
proc = subprocess.run(
    [".intentgrep-tools/node_modules/.bin/intentgrep", "--plan", "--task", "filter",
     "--input", "jsonl", "--max-requests", "8", "--max-input-bytes", "80000",
     "The record explicitly describes a failed deployment"],
    input="".join(json.dumps(row) + "\n" for row in records),
    text=True, capture_output=True, timeout=150,
)
if proc.returncode not in (0, 1):
    raise RuntimeError(proc.stderr)
result = json.loads(proc.stdout)

示例先运行计划;把 --plan 换成 --json 才是实际查询。真实查询的退出码 1 仍是有效 JSON 的无匹配结果,不能与错误混淆。传参数数组而非拼接 shell 字符串;API key 通过进程环境继承。完整可运行例子见 examples/python_pipeline.py,当前不另发 Python SDK。

验证与边界

npm test
npm run check
node examples/sdk.mjs
python3 examples/python_pipeline.py

2026-09-22 使用官方 jev-1.13.0 实测:100/100 确定性测试、28/28 CLI 场景通过。三个 Agent 独立设计并交叉审查代码、文档/日志/业务、记忆场景:开发集两轮 179/180,独立留出集两轮 174/180;附加 checks 共 110/110。重复运行不增加独立样本数,模型判断仍有错误。

新版提示词把直接问题与候选放在一起,避免主查询进入独立 checks 的共享背景。仍需注意:调用重试函数可能被误认成定义重试循环;dry-run、审批和计划可能被误认成实际完成。前者应明确要求候选自身包含什么实现,后者应先用代码过滤固定 metadata 字段,再做语义判断。metadata 流水线示例 默认离线,--live 才调用模型。

完整方案、保留的失败、对照实验、成本和复现方式见 官方评估记录。这是合成场景评估,不是生产准确率或全语言保证;确定性测试验证输入输出和预算,不能替代模型质量测试。

历史上使用 Qwen3.5-4B 复现服务的 smoke 曾发现高置信误命中,以及共享 state 带来的重复输入开销;这些是旧提示与旧窗口设置的诊断,不是当前默认布局的性能或精度结论。

类型约束不保证判断正确。结果可能受上下文不足、提示注入、漏判或误判影响;不要以分数授予访问权、批准外部动作或替代原文核验。工具只处理 UTF-8 文本和 JSONL,没有 PDF/Office 解析、持久索引或缓存。大量重复检索可先建索引召回候选,再交给同一查询核心判断。

About

Grep-shaped semantic search for files and records, with a shared programmable query core

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages