@lapland/vouch
v0.1.1
Published
An AI teammate for your team chat (Feishu/DingTalk/WeCom): it picks up tasks, gets them done, and drafts replies in your voice — with a deterministic code-reference verifier as the trust layer. BYO-key, read-only, human-in-the-loop, self-hosted.
Maintainers
Readme
Vouch
你的 AI 工作分身,活在你的团队 IM 里。 Vouch 盯着你的群(飞书 · 钉钉 · 企微),接住派给你的活, 替你办成、或起草成待发的稿,并用你的语气代你说话——每一步外发都要你点头。碰到代码类的活,它给你的 每个文件、符号、行号都对着你真实仓库验过,绝不给一个不存在的引用。自带你的 key、只读、人在环内。
English · 简体中文
它替你干什么
它待在你的团队群里,把杂活从你手上接过去——你只管拍板,跑腿的事它来。
- 认出派给你的活。 群里谁丢一句「帮我看下…」,它捞出来、扔进确认队列。绝不自作主张先动手。
- 真把活办出来。 一句话变成能用的东西:代码工单(引用对着你仓库验过),或者需求、方案、接口、测试文档。
- 用你的语气回。 从正经到含蓄阴阳都能起草,学的是你平时怎么说话、拍过什么板。你改一改、点确认,它以你的身份发出去。
- 越用越懂你。 你的偏好、立场、语气,用得多了它慢慢就摸清了。
- 定时给你发小结。 这阵子干完了啥、还欠着啥,按点推给你。
- 想的话,还能盯你本机。 一个本地 daemon 看你和你的 coding agent 实际提交了什么,工单自己就闭环了。
花你的 key、发消息、推分支——任何对外的动作,你不点头就不发生。
两种用法:要完整体验就跑自托管助手(面板 + 你的 IM);只要「一句话出工单」那半,用
vouchCLI 就够了。
多端「代你发」说句实话:只有飞书能真·以你本人身份发。钉钉/企微就算拿到用户 OAuth token,平台也不让 应用冒充员工发言——所以这两家 Vouch 是**「代你发」(明确标注)**,绝不伪装成你本人。加个平台 = 写一个 adapter,引擎不动。
问任何一个 AI 助手「限流该加在上传器的哪里?」,它会信誓旦旦地给你文件路径、函数名、行号—— 其中一部分根本不存在。Vouch 让模型给出引用,然后逐条对着真实代码核验:这个文件在不在、 这个符号是不是定义在这(而不是只被调用)、标注的行号是否落在定义处(±3)。查出来的幻觉引用会用 一次定点修补纠正,或直接标红提醒。任何外发都要你先点头。
信代码,不信文档。 校验器是确定性的——不调模型、不花 key。无论引用来自 Vouch 自己的分析, 还是你指过来的任何别的 agent,都是同一套核验。
快速上手 —— 30 秒零密钥演示
# 把一份工单(或任意 {path,symbol,line} 列表)里的代码引用对着真实仓库核验。
npx @lapland/vouch verify ./work-order.md --repo .
# → ✓ src/upload.ts#handleUpload:42 ✗ src/upload.ts#throttle —— 此处查无该符号定义(是调用点或名字写错)
# 3/5 references verified (60%) ← 有引用不过就退出非 0,可直接卡在 CI 里让幻觉工单挂掉verify 和 scope 不需要 key——它们是确定性的。plan 用你自己的 LLM 端点:
npx @lapland/vouch scope "给上传器加并发上限" --repo .
export VOUCH_BASE_URL=https://你的端点/v1 VOUCH_API_KEY=sk-... VOUCH_MODEL=你的模型
npx @lapland/vouch plan "给上传器加并发上限" --repo .需要 Node ≥24 和 git。装了 ripgrep 会用它;没装就退回 git grep,再退回纯 Node 扫描——哪都能跑。
引擎怎么工作(又快又扎实)
- 确定性检索(
scope,不调模型):中英概念扩展 → 搜仓库 → 拉完整函数体 + 跨文件调用点 + 反证("全仓搜过,这机制还不存在 → 得新建")。 - 单次合成:一次调用你的模型产出工单(SPEC/BRIEF/STEPS),带上机器可读的引用清单。
- 确定性校验 → 修补:每条
{path, symbol, line}对着真实代码核;只把没过的重新取片段做一次定点纠正。 最坏 ≤2 次模型调用。 - 要么引用、要么弃权:仍然核不过的引用,会明写在文档里提醒,绝不悄悄发出去。
完整 agent(可选、自托管)
除了 CLI,Vouch 还是一个完整的、自托管、单人使用的 agent,带 Web 面板:工单 / 确认队列 / 语气回复 / 记忆 / 汇总 / 执行器(可选、进阶:先在断网沙箱里验过 diff,人点头才推送)。
聊天平台是可插拔的 provider:默认的 local 不需要任何外部服务(你手动喂任务、回复只生成不发),
另附飞书 · 钉钉 · 企微三个适配(只有飞书能真·以你身份发,钉钉/企微是「代你发」标注)。每一次外发——花 key、发消息、推分支——都要显式点头。
git clone https://github.com/plwslpld-arch/vouch && cd vouch
npm install && npm run build
cd web && npm install && npm run build && cd ..
cp .env.example .env # 改 PORT / VOUCH_PANEL_URL / VOUCH_IM_PROVIDER
npm run serve要上生产(HTTPS 反代、接钉钉/企微 OAuth),看 DEPLOY.md。
原则(硬约束)
- 自带 key —— 每次调用都用你的 key,零内置 key,落库加密。
- 只读 —— 从隔离的、锁定提交的检出里读,绝不写回。
- 信代码不信文档 —— 每条引用都过确定性校验。
- 人在环内 —— 不点头,不花 key、不发消息。
- 通用 —— 不强依赖 ripgrep、不强依赖飞书、无需原生编译(用 Node 内置 SQLite)。
架构
packages/core 代码感知引擎:检索 → 合成 → 校验。零运行时依赖。
packages/cli vouch —— verify / scope / plan
packages/providers 可插拔聊天层:local(默认) + 飞书 · 钉钉 · 企微
packages/agent 完整自托管应用(node:sqlite + Express API)
packages/executor 可选沙箱(bwrap → docker → 拒跑)+ Ed25519 任务信封
packages/daemon 可选的本地观察/执行 daemon
web/ React + Vite + Tailwind 面板许可
Apache-2.0。干净重写声明见 PROVENANCE.md。
