news 2026/10/9 2:18:18

Repowise Lens 完全指南:把代码库索引「画」进 Claude Code 的可见界面

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Repowise Lens 完全指南:把代码库索引「画」进 Claude Code 的可见界面

【免费下载链接】repowise

Codebase intelligence for AI and humans: code health scores, auto-generated docs, git analytics, dead code detection, and architectural decisions via MCP.

项目地址:https://gitcode.com/gh_mirrors/re/repowise
点击查看免费下载

Lens 是 Repowise Claude Code 插件中用户可见的那一层:插件的 hooks 和 MCP 工具负责把代码库索引喂给 Claude,而 Lens 负责把索引「知道」的内容直接绘制到 Claude Code 的界面上——当前正在处理的文件及其依赖规模、文件背后的决策与修复历史、蒸馏输出被截断的程度、一次改动对代码健康度的影响、每一轮对话的仪表盘(改动波及范围、Claude 上下文来源、Repowise 的应答),以及一张标出 Claude 读写痕迹的仓库地图。读完本文你将掌握:Lens 每个可见表面的含义与实现原理、Full/Lite 两种运行模式的判别逻辑、六个配置开关的精确作用、/lens全部命令与地图快捷键,以及 Lens 的安全边界(它从不拦截、改写或批准工具调用)。

Lens 随插件一起以 Claude Code mod 的形式交付,无需单独安装。它在静止时保持安静:每个表面只在有内容可说时才绘制,地图面板只有在主动请求时才打开。

Lens 展示什么

下文中的界面文案全部引自代码(packages/claude-mod/src/views/copy.ts 中定义了每一个可见字符串,注释写明「命令要完整写出以便复制,Lens 自己从不执行它们」)。尖括号中的值由你自己的索引填充。

提示输入框上方的信息带(Band)

提示输入框上方最多显示两行(计入变更评审行与压缩摘要行),无事可报时为空。这两行保持自己的位置,其上的暗淡信息行填充剩余空间。当 Claude Code 显示 survey 时,信息带让位。

  • 设置提示(setup hint),每次会话最多一次,出现在有东西阻止 Lens 完整显示时。它一直保留到以它显示状态结束的第一个回合结束。

    情形提示文案
    仓库已索引,但本地服务器未运行Lens map needs the local server: repowise serve --no-ui
    本地服务器在运行,但未列出该仓库Lens map needs a local server for this repo: repowise serve --no-ui
    本地服务器要求 API 密钥local server needs an API key; Lens does not read keys
    处于 git 仓库但无 Repowise 索引index this repo for Lens: repowise init --no-prose --yes
    未安装repowiseCLILens needs the Repowise CLI: pip install repowise

    Lens 只把命令展示给你运行,自己从不运行它们。

  • 索引新鲜度(Index freshness):当索引落后于当前检出提交时显示index behind HEAD (<N> files changed) · repowise update;当repowise update已在运行时保持安静。这个判断在源码里由git rev-parse HEAD加上git diff --name-only <indexed> <HEAD> --完成(见 插件 README 的 “What Lens runs and reads” 一节),<indexed>取自.repowise/state.json中记录的提交。

  • 节省统计(Savings):本地服务器上报会话开始以来节省的 token 后显示<N> tokens (<M> inferred) · $<X> saved since this session started · all agents on this repo。数字来自服务器的 savings ledger,统计的是该仓库上的所有 agent而不只是当前 Claude Code 会话;美元只统计定价的输入侧。在窄终端中该行缩短为<N> tokens (<M> inferred) · $<X> saved this session · all agents。从 register.ts 的实现看,第一次读取作为基线,之后每分钟最多读取一次,只显示增量。

  • 变更评审行与压缩摘要提议,见下文。它们带有按钮。

信息带的实现约束在 packages/claude-mod/src/views/band.ts 中:MAX_BAND_ROWS = 2,带按钮的行在容量内优先保留位置(评审行永不隐藏,压缩摘要按钮在评审行占 1–3 时使用热键 4)。Lens 把自己的行放在next(e)返回的树上方,而不是丢弃插件树。

Spinner 文本

当 Claude 在已索引仓库内读取或编辑文件时,Lens 会把文件的波及范围追加到 Claude Code 的 spinner 上:<file name> · <N> caller files · <N> contributors(文件名用 base name)。Lens 每个会话用get_context对每个文件只查询一次;文本在查询返回后的下一次重绘时出现,绝不会拖住 spinner。索引不知道的计数会被省略。对应的格式化函数spinnerLine在 views/copy.ts,它把FileContext中的callerFiles(导入或调用该文件的文件数,来自服务器的文件级汇总)与contributors拼成一行,未知或为 0 的计数直接省略。

编辑下方的边注(Margin notes)

在 Edit 或 Write 下方,最多两行暗淡文本,重复 RepowisePostToolUsehook 为那个文件标记的内容。Lens 不加自己的阈值:hook 没说就没有注释。三类边注文案:

  • a standing decision covers this file: <title>(既有决策覆盖此文件)
  • a decision found in this file, not yet reviewed: <title>(文件中的决策尚未评审)
  • fixed <N> times in 6 months, most recently <age>, mostly in <symbol>(6 个月内修复 N 次,最近一次于 ,主要集中在)

边注需要repowise-augmenthook 在你的 PATH 上,安装repowiseCLI 即会提供。在 register.ts 中,onPostToolUse读取 augment hook 写入additionalContext的注释并原样传递;MarginNote的数据结构(decision与fixes两种)定义在 model/session.ts。

蒸馏输出下方的挤压行(Squeeze rows)

当一次 Bash 结果被repowise distill缩短时,Lens 在其下方画一行:一个 12 格条形图表示保留行数占比,然后是<N> lines → <kept> · ~<N> tokens omitted · <N> failed · repowise expand <ref>。失败与错误计数仅在测试运行器报告时出现。当结果带多个省略标记时,行尾追加(+<N> more)。整行全部从蒸馏标记和输出本身读取,例如1,204 lines → 38 · ~9,400 tokens omitted · 4 failed · repowise expand 9c1e4b2a7f01(views/copy.ts#L35-L44)。Lens 在 register.ts#L739-L747 用parseSqueeze解析 Bash 输出,命中则缓存在squeezes映射中,这样滚动重绘不会重复解析。输出如何被缩短、repowise expand如何恢复,详见 Distill 文档。

变更评审卡片与按钮

在一轮 Claude 编辑了文件(Edit、MultiEdit、Write 或 NotebookEdit)的回合结束后,Lens 用get_change_risk评审工作区。评审在第一个编辑落地时就在后台开始;被中断或失败的回合、以及子 agent 的回合不评审——这一判定逻辑在 model/review.ts#L83-L89 的shouldReview中:agentId存在、编辑数为 0、回合被中止或报错都会跳过评审。

评审进行中,信息带只显示Reviewing the change...。评审在 20 秒后放弃(常量REVIEW_TIMEOUT_S = 20定义在 views/copy.ts#L78)。超时或失败会以Change review timed out after 20 s或Change review could not run: <reason>的形式报告在 Claude 回答下方的一行中。从 register.ts 看,评审结果通过turn.completehook 以卡片形式挂在回答文本之下,Claude 本身不会读到这行。

结果以一行形式出现在 Claude 的回答下方,例如:

Change review (working tree, <N> changed files) · Health: <verdict> · <findings> · Diff shape: bigger than <N>% of this repo's recent commits; size, not danger · Tests to run: <N> tests, inferred from the dependency graph, not measured: <tests> · Branches: ◦ 1 other branch also edits <file> (<branch>)
  • Health:说明比较结果,例如no new findings in all <N> changed files、improved, <N> findings resolved, none new,或评审发现新问题时使用评审自己的标题。判定逻辑在 views/review.ts#L88-L95 的health()中:clear_in_analyzed_scope走"干净"分支,review_required/review_recommended走新发现分支并配红/琥珀色。
  • 部分比较会明说:Scope: compared <N> of <M> changed files; <K> not analysed (<reasons>), so this is not a clean bill。
  • 测试会说明依据:measured by stored coverage(有存量覆盖率数据)或inferred from the dependency graph, not measured(依赖图推断)。
  • 分支重叠用中性记号◦(OVERLAP_MARK),绿色、琥珀色、红色只保留给健康度。
  • 干净改动且没有其他分支触及这些文件时用短形式:Change review (<scope>) · health: <verdict>。

随后信息带显示摘要,如review · health: <N> new findings, review required,最多三个按钮,每个用旁边显示的数字按下:

按钮显示条件按下后做什么
1: Run tests评审给出了要运行的测试向 Claude 提交一条可见提示:Run the tests Repowise names for this change, <basis>: <tests>
2: WhyRepowise hook 在本次回合编辑的文件上标记了决策打开/lens面板并聚焦 Ask 输入框,填入why <decision>;在你按 Enter 之前不会发起任何提问
3: Details评审返回了完整结论把评审的状态、标题、理由与后续动作打印到对话记录中供你阅读

按钮的实现与按下的动作见 views/review.ts(buttons():测试按钮1: Run tests、决策按钮2: Why、directive 存在时3: Details)与 register.ts 的pressRunTests/pressWhy/pressDetails。信息带行在评审干净、无测试、无重叠分支且无决策时保持安静;新回合会将其撤下。

/lens 面板

/lens打开一个含四个标签的面板:1: Flow 2: Map 3: Ask 4: Recap。会话从 Flow 开始;之后/lens重新打开上次显示的标签。标签栏常量TAB_BAR定义在 model/ask.ts#L9。

Flow:回合仪表盘

Flow 是从只有 Lens 能看到的信息构建的回合仪表盘:聊天已经显示了每一步,所以 Flow 展示这些步骤加起来意味着什么。每个区块只在有内容可说时绘制。

头部是 Repowise 猫头鹰占一行{◉,◉},旁边是状态。猫头鹰的眼睛表达状态:静止时{─,─},Claude 工作时缓慢眨眼,Repowise 调用进行中眼睛偏向一侧{◐,◐},回合以回答结束后短暂{^,^},回合停止后中性{•,•}。开启prefersReducedMotion时不眨眼。状态为 Claude 工作时的Working · <m:ss>,随后是回合如何结束并保留到下一次输入:Done · <time>(配蓟色)、你中断时的Stopped · <time>、拒绝或错误后的Did not finish · <time>,编辑过文件时追加edited <N> files。回合还在进行时发送新提示会将该回合标记为停止。其下是全强度文本:Repowise <N> calls · Claude opened <N> files, <N> named by Repowise first,以及发生时的edit landed in a file Repowise named(或No Repowise calls)。当会话中更早的 Repowise 回复点名过该仓库相对路径时,该文件才算"由 Repowise 先点名"。然后是用户自己的话(暗淡显示):会话在提示前放置的文本(agent 交回、系统提醒、任务通知、命令包装)被排除,无剩余输入时不画这一行。状态的拼装逻辑见 views/copy.ts#L510-L522 的statusLine与answerLine。

**BEFORE YOU ACCEPT(接受前必读)**按本次回合编辑的每个文件列出,只列改动波及而 Claude 未查看的内容,数据来自索引(事实注明as of the last index):

  • <N> direct importers; Claude opened <N>:直接导入它的文件(地图的深度 1 爆炸半径,同一请求、绝不发第二次)。
  • not opened, usually changes with it (co-change score): <file> 0.80, ...:Claude 未打开的两个最强共变伙伴,带服务器的 0 到 1 评分。行文见cochangeLine(views/copy.ts#L530-L532)。
  • <N> test files reach query.py (inferred); none run:可达该文件的测试(按服务器口径 measured 或 inferred),以及本次会话命名的测试命令覆盖了多少个(按路径、文件名或文件夹整体词匹配)。
  • 回合的健康度来自变更评审自身的结果,绝不再发一次调用:this turn introduced 1 finding: complex method in query.py,或health compared in part only; no new findings in the part compared。无新问题的回合不绘制。

**WORKING SET(工作集)**列出本次回合编辑的文件,然后是读取的文件,最多六个(+<N> more):文件、edited或read、Claude 如何接触到它(最先点名的 Repowise 工具、search表示搜索结果返回、direct表示直接访问),以及索引对它的了解:hotspot、<N> files use it(导入方与调用方合计,不限于直接导入方)、recent owner <name> <share> %。这些来自 Lens 为 spinner 已经拉取的文件卡片。列宽低于 80 时省略索引事实。相关格式化见knowsParts(views/copy.ts#L548-L554)。

**CONTEXT(上下文)**是一条按种类分色的字节条形图,表示本次回合 Claude 收到的工具结果字节数,每种颜色一档、无彩色也能读懂:█ Repowise <size> ▓ file reads <size> ▒ search <size> ░ shell <size> · other <size>,然后first edit after <time>。Lens 只统计每个结果的尺寸,不保留内容。

**REPOWISE CALLS(Repowise 调用)**每次调用一行:距回合开始的时间、工具、询问对象、耗时、回复由什么构建,例如420 ms · 1 target · 1 documentation page · index current。Claude 正在等待的调用标▸并显示asking...。关于本会话中 Claude 已编辑过文件的调用显示暗淡的from the index before this edit。从 Lens 提出的问题落在 Ask 标签而不是这里。按下某次调用打开详情;j: Next call与k: Previous call在调用间移动。详情显示how it was answered(只显示回复关于自身的说明,如indexed at <commit>、index <N> days old、verified against the code、partial: the server capped it、confidence <level>、reply <size> (cap <N> characters)、<N> tokens left out, restorable)、reply begins(开头字符)与Claude then opened(该回复点名后 Claude 打开的文件,或nothing yet)。调用太多放不下时,暗淡行显示<N> earlier calls hidden · j / k step through calls(或<N> later calls below · ...)。

较早的回合各保留一行:Turn <N> · <time> · <N> Repowise calls · <N> files read · <N> edited,未以回答结束时标注stopped或did not finish;超过六个回合后折叠为Earlier: <N> turns · ...。

Flow 的文本保留终端自身的颜色、从不设置背景。只有标记使用强调色:丘陵用李子色,蓟色、Repowise 的工具名及其条形部分用对应强调色;猫头鹰眼睛与进行中的调用用琥珀色;健康色绝不在此出现。在无索引的仓库中 Flow 仍统计 Claude 自己的工作,并显示Repowise is not connected in this repo, so only Claude's own steps show here.。第一个回合前显示Lens is listening. Send a prompt and this tab shows what only Lens sees: what an edit reaches, where Claude's context came from, and what Repowise answered.

Map:仓库地图

Map 把整个仓库画成安静的色块,每文件一块、按代码行数定大小、按文件夹分组,使用接近终端底色两种色调,让当前回合成为图上唯一的颜色。Claude 工作时,其回合涉及的文件亮起:搜索命中微弱发光,Claude 打开的文件转为雾色,编辑(及 Claude 最近一步)转为橙色,Repowise 回复点名的文件呈深李子色,导入该编辑的文件从编辑处向外泛起李子色涟漪。每个标记填满整个色块;小到放不下独立色块的文件也会在它所在处点亮一个整格。打开与编辑过的文件在色块旁保留文件名,大文件夹隐约显示名称。色块间的空白是终端自己的背景。在超大型仓库中(多数文件会小于一个像素),文件夹作为色块绘制而不是文件。地图的绘制与交互实现在 packages/claude-mod/src/map-controller.ts 与 views/map.ts。

地图下方是故事条(story strip),一行说明一个事件,有事才显示:

SEARCHED class QuerySet: 4 files · django/db/models/sql/*.py: 7 files OPENED manager.py · query.py ◆ query.py named by get_context EDITED ◉ query.py +1 line REACHES 12 importers: manager.py (opened), fields.py, prefetch.py, +9

故事条就是地图的图例。发生任何事之前显示Nothing lit yet this turn. Files Claude searches, opens and edits light up here.。导入方来自导入图,即由导入关系推断而非观察到的调用;该查询运行期间该行显示finding the files that import <file>。范围行说明绘制了多少仓库:<N> files, all drawn、<N> of <M> files drawn at this size · rest too small to draw、<M> files, drawn as folders at this size,或服务器达到上限时的4,000 largest of <M> files drawn,随后是indexed <age>,以及有文件在地图外时的<N> touched files not on the map。范围行的拼装逻辑scopeParts见 views/copy.ts#L260-L265。

地图下方的按键对应回合点亮的内容。用字母而非数字(数字用于切换标签),且只显示会生效的按键:

按键作用
j选中下一个点亮文件:先是编辑,然后是 Claude 打开的文件,再是编辑的其他导入方,最后是 Repowise 回复点名的文件;循环
k选中上一个
z放大到选中文件所在文件夹:只显示该文件夹的文件,占满整个面板,带文件名
u缩小一个文件夹层级
x清除选中
h切换健康色

选中色块有明亮圆环,故事条下一行说明它是什么:路径、点亮原因(Claude edited it, +1 line、Claude opened it、imports query.py、named by get_context)、以及 Lens 已经知道的信息(hotspot、131 files use it、recent owner ...、9 tests reach it (inferred))。Lens 不会为填充这一行发起任何新请求。放大后,django / db / models这样的面包屑位于地图上方,范围行统计该文件夹的文件数,j与k只在该文件夹内点亮文件间移动。选中只触发一次重绘、无动画。新提示或/clear从不选中任何文件并以全仓库视图开始,回合停止点亮的文件会失去选中。窄面板上按键保持在一行:最不常用的(先是x,然后u、k、z)先让位给…,h始终保留。

地图下的Health colours按钮(热键h)改为按健康带着色:Excellent、Good、Fair、Needs work、At risk与Not scored,并带图例;lens_map_health设置让地图以该方式启动。发光与涟漪动画短暂播放;开启 Claude Code 的prefersReducedMotion设置后,地图只显示静止帧。颜色遵循 Claude Code 的theme设置:浅色主题用浅色渐变。

地图需要本地服务器(Full 模式)。没有它时 Map 标签显示设置提示。

Ask:向索引提问

Ask 向索引询问本仓库的情况。/lens ask与评审的Why打开它,/lens ask <question>立即提问,回答落在 Ask 标签。首个问题前的占位文本为Ask about this repo. Answers cite the evidence they used.。以 "why" 开头的问题走get_why,读取决策记录、提交与理由注释;其他问题走get_answer。路由逻辑在 model/ask.ts#L75-L79 的askRoute:/^\s*why\b/i匹配即走get_why。每个回复冠以Built from the index,或在get_answer可能使用了仓库配置的模型时冠以Written by this repo's configured model, from the index。回复显示工具的置信度或依据及其引用的证据,或no evidence cited。长回复在 4,000 字符处截断(ASK_CHARS = 4_000,views/copy.ts#L357),并明确说明截断。同时只运行一个问题:期间再问会显示still answering the last question; ask again when it lands。/lens ask与 Ask 字段的 Enter 都通过startAsk发起调用,超时上限 30 秒(ASK_TIMEOUT_MS,register.ts#L79)。

Recap:会话回顾

Recap 从 Lens 已观察到的事实汇总会话,不做任何新查询:

行示例值
Files<N> edited of <M> files touched,触及文件数封顶后<M>显示为200+
Change reviewnone this session,当还没有评审运行时替代下面四行评审行
from the last change review下面四行的暗淡小标题
Code health最近一次评审的健康结论
Findings<N> resolved · <N> new findings,或not compared
Tests to run<N> tests, measured或<N> tests, inferred(评审点名文件时N> test files, ...),或none named
Branches overlapping重叠行、none found或not reported
Saved节省行、nothing yet since this session started,或needs the local server: repowise serve --no-ui
Decisions surfaced<N>: <titles>或none

页脚为Lens made no model calls. Every figure here is read from the local index.;当 Ask 回复可能来自模型后,改为Lens made no model calls. <N> Ask replies from get_answer may have been written by this repo's configured model.(页脚计数逻辑recapFooter见 views/copy.ts#L421-L425)。

压缩摘要(Compaction brief)

Claude Code 压缩对话后,信息带提供context compacted 1: Brief Claude;当变更评审行显示时(占 1–3 号键)改为context compacted 4: Brief Claude。按下它提交一条可见提示,最多 1,200 字符(BRIEF_CHARS,views/copy.ts#L439),由本次会话的编辑、hook 浮出的决策与最近一次变更评审构建,不调用模型。它以下句开头:

The context was compacted. This brief is built from the Repowise index and this session's edits:

然后列出Files edited:、Decisions in play:与Open review items:。Lens 不改变压缩本身或压缩摘要。按下按钮或开始下一回合时提议消失。实现上,register.ts 的onPostCompact只把状态置为compacted,压缩事件本身原样传递。

桌面端地图

在 Claude 桌面应用中,Map 标签把同一张地图绘制为 SVG 图像而非终端单元格,无动画。对桌面绘制来说过于详细的地图显示Lens map has too much detail to draw here; the terminal map shows it。其他打开面板的表面显示Lens map: not drawn on this surface (terminal and desktop app only)。SVG 绘制实现在 packages/claude-mod/src/views/mapSvg.ts。

启用方式

前置条件:

  • Claude Code 2.1.287 或更高版本。更早的版本加载插件其余部分并跳过 Lens。
  • Repowise 插件,按 插件 README 安装:/plugin marketplace add repowise-dev/repowise,然后/plugin install repowise@repowise。
  • 已索引的仓库。在无索引的 git 仓库中,Lens 显示repowise init --no-prose --yes提示;在 git 工作树之外保持沉默。

Lens 在会话开始时选择两种模式之一,并在每个回合后重新检查:

模式何时显示什么
Fullrepowise serve --no-ui在本机为该仓库运行一切:含节省行的信息带、spinner 文本、边注、挤压行、变更评审、含 Flow/地图/Ask/Recap 的/lens面板、压缩摘要
Lite仓库已索引但没有本地服务器服务它除地图与节省行外的一切。Map 标签与 Recap 的Saved行指向repowise serve --no-ui

Lite 模式通过插件自带的 MCP 服务器工作(插件自行启动);Full 模式额外使用本地服务器,Lens 通过.repowise/serve.lock.json找到它。模式判定的完整顺序在 packages/claude-mod/src/data/discovery.ts:先向上最多走 20 层目录寻找带.repowise/state.json的索引根(避免把无 state 文件的用户配置目录~/.repowise误判为仓库),再读serve.lock.json,用tasklist(Windows)或ps(其他平台)探测 pid 是否存活,最后向锁文件中的地址发起/health探测(800ms 超时)并核对仓库列表(3s 超时)。服务器返回 401/403 时进入auth原因(Lens 不读密钥),列表里没有该仓库时进入unlisted原因。模式类型Mode与原因类型LiteReason定义在 model/session.ts#L10-L13。

设置

插件userConfig中的六个开关,修改任何一个都会重载 Lens。开关在 register.ts#L919-L924 读取:

设置默认控制什么
lens_marginonEdit 和 Write 下方的边注
lens_squeezeon蒸馏 Bash 输出下方的挤压行
lens_reviewon编辑文件回合后的变更评审、其卡片与按钮
lens_flowonFlow 标签。关闭后 Lens 不为它记录任何内容,面板打开到 Map
lens_map_healthoff让地图以健康色着色启动。关闭时地图是安静色块、由 Claude 的回合点亮;Health colours按钮两种方式都能切换
lens_pane_autoopenoff在 Claude 首次读取文件时自动打开地图面板——仅当终端宽度足以放置而不打扰时。/lens任何时候都能打开它

命令

命令作用
/lens打开面板到上次显示的标签(首次为 Flow),并聚焦键盘
/lens flow打开面板到 Flow 标签
/lens map打开面板到 Map 标签
/lens ask打开面板到 Ask 标签
/lens ask <question>直接提问;回答落在 Ask 标签
/lens recap打开面板到 Recap 标签

/lens不向对话记录写任何内容——面板本身就是答案(register.ts#L813-L814 注释:「Nothing in the transcript: the pane is the answer」)。参数解析在lensCommand(model/ask.ts#L100-L107):ask后跟内容即为问题,其余单词匹配标签名。

故障排查

完全没有任何 Lens 内容出现。Lens 需要 Claude Code 2.1.287 或更高版本。mod 也可能被 Claude Code 的远程下发设置或管理员关闭。两种情况下都只是 Lens 缺失:插件的 MCP 工具、命令、skills 与 hooks 照常工作。

某些地方不绘制。Claude Code 只在终端界面与桌面应用中绘制 mod 界面。VS Code 聊天面板、claude -p、Agent SDK、云会话或 WSL 中运行的桌面会话都不会出现 Lens 的任何内容。

地图面板不自动打开。Claude Code 只会在终端宽度至少 144 列时放置无人请求的面板。低于该宽度且lens_pane_autoopen开启时,信息带显示Lens map is ready; this pane is too narrow to open on its own. Run /lens。/lens直接请求面板。若 Claude Code 仍无法放置,信息带显示Lens map needs a wider terminal: <reason>。

Map 标签显示提示而非地图。地图需要本地服务器。在仓库中运行repowise serve --no-ui。若服务器配置了 API 密钥,Lens 保持 Lite 模式,因为它从不读取密钥。

停靠面板是灰色而非终端背景。停靠面板的表面属于 Claude Code 自己;mod 无法设置或清除它。Lens 在自己行后不绘制任何背景,地图内部的空间是终端自己的背景。

地图说无法加载。Lens map could not load; it tries again on /lens。服务器起来后再次运行/lens。

某个标签说 Lens 无法绘制。Lens could not draw this tab; details in the debug log。标签栏保留,其他标签照常工作。Claude Code 的调试日志中有以lens:开头的行,标明标签名与错误(Lens 的调试输出统一带lens:前缀,见 register.ts#L183 的debug实现)。

变更评审超时。它有 20 秒。该回合跳过评审,在下一个编辑文件的回合后再次运行。非超时失败(如被拒绝的调用)会重试一次(isRetryable,model/review.ts#L92-L94)。

/clear之后。/clear会重置 Lens 对对话的视图:Flow 的回合、地图的点亮与故事、变更评审、Ask 回答、brief 提议与节省基线全部重置,因为/clear重启了 Claude Code 自己的会话时钟。索引说过的话会保留(健康地图、文件卡片、已经请求过的导入方),所以地图无需再向服务器请求即可重绘。恢复会话不会重置任何东西——这一行为对应 register.ts 的onSessionEnd:仅当e.reason === "clear"时重置对话相关状态,索引相关的mode、freshness、repoRoot、contexts等保留。

行为边界(Footprint)

以下内容是 Lens 做与不做的边界,由代码强制执行(整体约束见 host.ts 的Host接口——fs只读、process.run注释明确「只读命令(git 查询、pid 探测),离开 CLI 即拒绝」):

  • Lens 从不拒绝、持有、改写或批准工具调用。每个工具调用及其结果都原样穿过 Lens。Lens 不注册tool.checkhook,所以每个权限问题(包括它自己的)都得到 Claude Code 自己的回答。Lens 的查询(插件 MCP 服务器上的get_context、get_change_risk、get_why、get_answer)像任何 MCP 调用一样请求权限。想免提示运行,可在/permissions或设置中的permissions.allow一次性放行这四个工具:mcp__plugin_repowise_repowise__get_context、mcp__plugin_repowise_repowise__get_change_risk、mcp__plugin_repowise_repowise__get_why、mcp__plugin_repowise_repowise__get_answer。被拒绝的查询只让 Lens 对应部分为空,其余照常工作。示例配置见 插件 README 的 Permissions 一节。
  • Flow 只统计经过的内容。它记录每个工具调用的名称、少数参数、时机与结果尺寸,绝不记录结果本身(Repowise 回复只保留摘要与其前 2 KB)。Flow 保留的数据(最近六个回合、每回合最多 60 步)只留在内存中,会话结束即消失。其事实来自 Lens 已经发出的请求:文件卡片、地图爆炸半径与变更评审。
  • 任何到达 Claude 的内容都经过你按下的按钮。Run tests与Brief Claude提交的提示在对话记录中可见;Why只填充 Ask 输入框;Details把内容打印到对话记录供你阅读。Lens 不修改你的提示或压缩。
  • Lens 自身不调用模型,也不读取任何环境变量或 API 密钥。它读取的唯一 Claude Code 设置是prefersReducedMotion(register.ts#L305)。
  • Lens 只与本地 Repowise 服务器和插件自己的 MCP 服务器通信。它只通过.repowise/serve.lock.json中命名的纯http回环地址(127.0.0.1、localhost或::1)联系服务器(类型校验见 packages/types/src/serve-lock.ts 的isServeLock/isLoopbackUrl)。
  • Lens 不运行任何写入仓库的命令。它只运行只读 git(git rev-parse与git diff --name-only)来比较索引与 HEAD,以及tasklist或ps来检查服务器进程是否存活。它读取.repowise/state.json、.repowise/serve.lock.json与.repowise/.update.lock,不写任何文件。设置与更新命令只展示给你运行。

Repowise 的其余部分不受上述声明约束,有两件事值得注意:

  • get_answer可能使用仓库配置的模型。不以 "why" 开头的 Ask 问题走get_answer,当仓库配置了模型提供方时,它会用该模型合成答案。Recap 页脚会统计这些回复(modelAsks计数逻辑见 model/session.ts#L190-L201)。
  • Repowise MCP 服务器与本地服务器发送匿名使用遥测,除非你关闭它。MCP 服务器每次工具调用记录一个事件(工具名、状态与粗略度量,从不记录问题、结果或路径),Lens 自己的查询也是普通工具调用。收集内容与退出方式见 遥测文档:repowise telemetry disable或DO_NOT_TRACK=1。

相关文档

  • Repowise 的 Claude Code 插件:安装、命令、skills、MCP 工具总览,以及 Lens 运行与读取内容的完整清单
  • Hooks 文档:插件 hooks 提供给 Claude 的上下文,边注就是在为你看重它
  • Distill 文档:挤压行背后的输出压缩机制
  • MCP 工具文档:Lens 调用的工具

Lens 的源码位于 packages/claude-mod,入口与全部 hook 注册在 src/register.ts,可见文案统一集中在 src/views/copy.ts,模式发现逻辑在 src/data/discovery.ts,配套测试覆盖了地图、Flow、挤压行、边注、评审与 Ask 等全部表面(packages/claude-mod/test 目录下的map.test.ts、flow.test.ts、squeeze.test.ts、margin.test.ts、review.test.ts、turnFacts.test.ts等)。

【免费下载链接】repowise

Codebase intelligence for AI and humans: code health scores, auto-generated docs, git analytics, dead code detection, and architectural decisions via MCP.

项目地址:https://gitcode.com/gh_mirrors/re/repowise
点击查看免费下载
上一篇:网易云音乐NCM格式解密指南:用ncmdumpGUI实现音乐自由播放
下一篇:魔兽争霸3终极优化指南:WarcraftHelper让你的经典游戏在Windows 11上完美运行

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 2:16:29

RS485老电表不换表上云:DTU、采集器、边缘网关三条路径对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 2:15:01

开源工具NotionLinkTuner:解决Notion网络问题

做这个开源项目之前&#xff0c;我大概被 Notion 的访问问题折磨了两周。页面转圈、桌面端白屏、同步一直失败&#xff0c;最崩溃的是每次报错还不一样&#xff0c;搜教程要么让清缓存&#xff0c;要么让重装&#xff0c;试了一圈没有任何改善。后来我耐下性子把整个访问链路拆…

作者头像 李华
网站建设 2026/10/9 2:14:25

HTTP协议零基础拆解:请求头、响应状态码与调试实战

1. 从一次浏览器地址栏输入开始说起如果你正在学 Web 开发&#xff0c;无论你打算写前端、后端、还是做全栈&#xff0c;HTTP 都是那个绕不开的坎。它就像网络世界的普通话&#xff0c;前端和后端沟通、浏览器和服务器沟通、App 和云服务沟通&#xff0c;全都靠它。很多新手被 …

作者头像 李华