mcpField
C
Codigest

Codigest

本地服务
github.com/NaNIsaac开发工具1今天更新

关于 Codigest

Codigest 是一款本地命令行工具,可将选定代码、变更或捕获的终端输出整理为 AI 对话和编码 Agent 所需的上下文。开发者可控制分享内容,查看纳入的文件,并对密钥进行遮蔽。

主要功能

  1. 01打包项目、选定文件及其导入项
  2. 02显示文本和函数级变更
  3. 03捕获命令并打包失败输出及相关代码
  4. 04报告已纳入和未纳入的文件
  5. 05排除环境文件并遮蔽令牌

适用场景

  1. 01在 AI 对话中分享选定的项目代码
  2. 02查看基线以来的函数级变更
  3. 03向 Agent 提供失败测试及相关代码

MCP 相关

提供 stdio MCP 服务,供 MCP 客户端请求 Codigest 上下文输出。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"nanisaac-codigest": {
"command": "uvx",
"args": [
"codigest"
]
}
}
}
启动命令uvx codigest

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypicodigest0.13.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Codigest

PyPI Tests License: MIT

与 AI 分享你选择的代码上下文:你的项目、几个文件、变更内容,或运行失败的命令。

文档:nanisaac.github.io/codigest(安装、指南和命令参考)。한국어

Codigest MCP — MCPRush 安全评级
针对特定版本的自动安全扫描(A–F),并非独立安全认证。 了解评级机制。

Codigest 是一款命令行工具,适合你想向 ChatGPT、Claude 或编码 Agent 询问代码问题时使用。 它会将你选择的项目内容转换为一个文本块,方便粘贴到任何聊天中。

模型只知道你展示给它的内容。手动复制文件很慢,容易漏掉关键文件,也很容易粘贴超出问题所需的内容。Codigest 让你决定要分享什么,然后替你收集:整个项目、某个文件及其导入的文件、你指定基准点以来的变更,或失败的测试及其指向的代码。

功能

  • 打包你选择的代码。 将整个项目、选定的文件和文件夹,或它们导入的本地文件(Python、JS/TS)连同文件树打包为一个文本块。
  • 展示变更内容。 显示自你设定的基准以来的文本差异或函数级差异,不会改动你的 Git 历史。
  • 包含终端输出。 记录你运行的命令,并可连同错误指向的文件一起提供失败的命令。
  • 说明包含的内容。 每个打包结果都会报告大小;pack 会说明每个文件的包含原因,并列出未纳入的文件。
  • 保护机密信息。 永不包含 .env 文件和密钥,并会遮蔽代码或输出中的令牌。
  • 支持 Agent。 Claude Code、Cursor 和其他 MCP 客户端可以请求相同的输出。

Codigest 不会调用任何 AI 模型;它只负责准备你要发送给模型的内容。所有操作都在你的设备上运行。

cdg cap 运行一个失败的 pytest,随后 cdg pack 打包该错误、错误中提到的测试文件以及已变更的文件
以下工作流之一:测试失败后,只需运行一个命令,就能收集模型所需的内容。

安装

预编译二进制文件,无需 Python。Windows(PowerShell):

irm https://raw.githubusercontent.com/NaNIsaac/codigest/main/install.ps1 | iex

Linux、macOS 和 Termux:

curl -fsSL https://raw.githubusercontent.com/NaNIsaac/codigest/main/install.sh | sh

在 Windows 上,这会将 cdg 安装到 %LOCALAPPDATA%\Programs\codigest(并将其添加到用户 PATH);在 Linux 和 macOS 上安装到 ~/.local/bin;在 Termux 中安装到 $PREFIX/bin。再次运行同一行即可更新。CDG_VERSION=0.12.1 可指定固定版本,CDG_INSTALL_DIR=... 可选择安装目录(此时不会更改 PATH)。支持平台:Windows x64、Linux x64 和 ARM64、macOS Intel 和 Apple Silicon、Android ARM64(Termux;CI 中的测试也会在 Termux 内运行)。可手动下载的压缩包见发布页面。你的项目无需进行任何设置。两个脚本都会根据 GitHub 为压缩包记录的 SHA-256 校验值进行验证。在 Linux 和 macOS 上,如果同一目录中存在来自 Python 包的 cdg,install.sh 不会替换它,除非设置了 CDG_FORCE=1。

Python 包

同样的命令也发布在 PyPI 上,包名为 codigest。使用 uv 安装,它也会获取所需的 Python 版本(3.15),并将其与项目隔离:

winget install --id astral-sh.uv                  # Windows (skip if you have uv)
curl -LsSf https://astral.sh/uv/install.sh | sh   # macOS/Linux

uv tool install codigest
uv tool update-shell                              # then restart your terminal

命令是 codigest,也可以简写为 cdg。两种安装方式都会提供名为 cdg 的命令,因此请确保 PATH 中只保留其中一种。如果安装时在 lazy import 处出现语法错误,请运行 uv self update,然后重试。

接下来,cdg term install 会为你的 shell 添加钩子,保留每条命令的输出,供 cdg pack 和 cdg term 使用。运行该命令前,此功能处于关闭状态;请参阅终端捕获。

在 Windows 上,PowerShell 的 help codigest 与 codigest --help 是两个独立命令。 如需可选的原生 Get-Help 集成,且不自动捕获命令:

cdg shell-help install       # register comment-based PowerShell help
# open a new PowerShell window
help codigest               # or: Get-Help codigest
cdg shell-help uninstall     # remove it when no longer needed

这会向你的 PowerShell 配置文件添加一个小型转发函数;其他 help 命令不受影响。CLI 自带的完整命令参考仍可通过 cdg --help 查看。

在终端中,以下每条命令都会将结果复制到剪贴板。添加 -s 也会打印结果,添加 -o FILE 也会将结果写入文件,添加 --no-copy 则不会改动剪贴板,添加 -m "..." 可将你的问题或指令放入其中。当输出被重定向到管道或文件(cdg scan > ctx.xml、cdg digest | less、脚本、编码 Agent 的 shell)时,结果会打印出来,但不会复制到剪贴板;添加 --copy 可强制复制。通过 SSH 使用时,内容会复制到你输入命令的那台机器的剪贴板(OSC 52),而不是远程机器;请参阅输出选项。

1. 与 AI 聊天分享你的项目

在项目中运行 scan,然后粘贴:

cdg scan
$ cdg scan
Copied snapshot to clipboard
Snapshot 3 files, ~121 tokens

现在,剪贴板中包含文件树和每个文件的内容,并遵循 .gitignore 规则:

<project_snapshot project="project">
<project_structure>
├── .gitignore
├── prices.py
└── test_prices.py
</project_structure>
<source_code>
<file path=".gitignore">
.venv/
__pycache__/
.pytest_cache/
</file>

<file path="prices.py">
def apply_discount(price, percent):
    return price * (1 - percent)
</file>

<file path="test_prices.py">
from prices import apply_discount


def test_ten_percent():
    assert apply_discount(200, 10) == 180
</file>
</source_code>
</project_snapshot>

大型项目在复制前会先询问(超过 30k 个 token 或 100 个文件)。这类项目可以像下一节所示那样,分享较少的内容。

2. 只分享部分内容或变更内容

cdg scan src/app.py -r       # one file and the local files it imports, recursively
cdg scan src/billing/ docs/  # folders, files, or both
cdg scan src/app.py -l       # with line numbers, so answers can say "line 42"
cdg scan src/app.py:40-80    # only lines 40 to 80, numbered (src/app.py:42 for one line)
cdg digest                   # signatures and docstrings only, much smaller
cdg digest src/billing/      # the same for one folder
cdg tree -L 2                # the file tree, two levels deep

从这里开始的示例仍是同一个项目,只是时间稍晚一些:prices.py 新增了一个 Cart 类,legacy/ 中则有一个旧版 MATLAB 文件。

digest 是开始对话时使用的概览。它会按出现顺序列出 Python 文件中的每个函数、类和顶层变量,以及 MATLAB 文件中的函数和 %% 分节,并标出它们的起始行和文档字符串的第一行(MATLAB 文件则显示帮助注释的第一行)。类属性和 dataclass 字段也会连同其值一起列出;较长的值会被缩短:

$ cdg digest -s
<code_digest project="project" contents="signatures and docstrings, no bodies">
<project_structure>
├── .gitignore
├── legacy
│   └── discount.m
├── prices.py
└── test_prices.py
</project_structure>
<file path="legacy/discount.m">
1: function p = discount(price, percent)
       Price after taking off percent percent.
3: %% Apply
</file>
<file path="prices.py">
 1: TAX_RATE = 0.1
 4: def apply_discount(price: float, percent: float) -> float
        Price after taking off `percent` percent.
 9: class Cart
        Items and the discount that applies to all of them.
12:   def __init__(self, percent: float=0)
16:   def total(self) -> float
          Sum after discount and tax.
</file>
<file path="test_prices.py">
4: def test_ten_percent()
</file>
</code_digest>
Digest 3 files, ~192 tokens

看过这些内容的模型可以准确询问所需内容(“显示 Cart.total”),而 cdg scan prices.py:16-19 会仅提供该方法,行号与原文件一致:

$ cdg scan prices.py:16-19 -s
<project_snapshot project="project">
<project_structure>
└── prices.py
</project_structure>
<source_code>
<file path="prices.py" lines="16-19">
16:     def total(self) -> float:
17:         """Sum after discount and tax."""
18:         subtotal = sum(apply_discount(p, self.percent) for p in self.items)
19:         return subtotal * (1 + TAX_RATE)
</file>
</source_code>
</project_snapshot>

tree -L 可避免大型目录或供应商目录导致输出过多:

$ cdg tree -L 1
├── .gitignore
├── legacy/ (1 file)
├── prices.py
└── test_prices.py

如需在工作过程中分享变更内容,请先设置基线:

cdg mark                     # e.g. before a refactor
# ... work ...
cdg diff                     # text diff since the mark
cdg semdiff                  # Python: which functions and classes changed

基线是保存在 .codigest/ 中的一份私有副本;不会改动你的 Git 历史记录。

3. 提供运行失败的命令

通过 cdg cap 运行命令。输出与直接运行时完全相同;Codigest 会保留一份副本。然后请求生成一个 pack:

cdg cap -- pytest -q        # or npm test, cargo test, go test ./..., make
cdg pack
$ cdg pack
Packed ~370 / 30,000 tokens
  failed   pytest -q (exit 1, just now)
  changes  uncommitted changes (git)
  + test_prices.py  line 5 in failing output
  + prices.py       changed
Copied pack to clipboard

内容包括:运行失败的命令、尚未提交的 Git 变更、报错指向第 5 行的 test_prices.py,以及你编辑过的 prices.py。

具体复制了哪些内容
<context_pack project="project">
<terminal_history>
<command index="1" command="pytest -q" exit_code="1" cwd="~/project" duration="1.5s" at="2026-10-17T01:58:14+09:00">
<output>
F                                                                      [100%]
================================= FAILURES ==================================
_____________________________ test_ten_percent ______________________________

    def test_ten_percent():
>       assert apply_discount(200, 10) == 180
E       assert -1800 == 180
E        +  where -1800 = apply_discount(200, 10)

test_prices.py:5: AssertionError
========================== short test summary info ==========================
FAILED test_prices.py::test_ten_percent - assert -1800 == 180
1 failed in 0.11s
</output>
</command>
</terminal_history>
<changes source="uncommitted changes (git)">
diff --git a/prices.py b/prices.py
index 3d691df..428752a 100644
--- a/prices.py
+++ b/prices.py
@@ -1,2 +1,2 @@
 def apply_discount(price, percent):
-    return price * (1 - percent / 100)
+    return price * (1 - percent)
</changes>
<file path="test_prices.py" reason="line 5 in failing output">
1: from prices import apply_discount
2: 
3: 
4: def test_ten_percent():
5:     assert apply_discount(200, 10) == 180
</file>
<file path="prices.py" reason="changed">
1: def apply_discount(price, percent):
2:     return price * (1 - percent)
</file>
</context_pack>

未纳入预算的文件会列在 <omitted> 块中,让模型知道它看不到哪些内容。

### `pack` 如何决定内容

普通的 cdg pack 会按以下顺序填满令牌预算(默认 30,000):

  1. 过去一小时内,本项目最近一次失败的命令输出中提到的文件: File "x.py", line 7(Python)、x.py:7(pytest、ruff、gcc、rustc、eslint)、x.ts(7,3)(tsc)。 同一命令再次通过后,就不再使用那次失败记录。若文件只在输出中被提及,并非由你修改,则会以摘录形式加入:输出指向的每个位置前后各十行,并标注 lines="40-60" 属性。较短的文件会完整加入。
  2. 失败的 Python 测试所调用的项目函数和类,完整加入,原因标记为 called from failing test ...。如果回溯以断言结束,只会指出测试;即使错误已经提交、差异中没有任何内容,这也会加入被测试的代码。
  3. 你修改过的文件:Git 中未提交和未跟踪的文件,或自 cdg mark 以来的更改。较长的更改文件会按其差异块涉及的部分加入(差异本身已经包含在打包内容中)。
  4. 导入这些文件的测试(test_*.py、*_test.py、*.test.ts、*.spec.js 等)。
  5. 这些文件导入的项目文件:Python 导入,以及 JS/TS 中的相对导入(./x、x.ts 对应的 ./x.js、dir/index.ts 对应的 ./dir)。

指定文件名时,只会获取这些文件。--with 会重新加入自动选择的来源:

cdg pack src/prices.py                         # just this file
cdg pack src/prices.py --with tests            # this file and its tests
cdg pack --with changes                        # only your changes, no failure
cdg pack --with failure,changes,tests,imports  # the same as plain `cdg pack`

只要来源处于启用状态,失败的命令和差异就始终会包含在内。较长的命令输出会保留前 80 行和后 40 行(包括最初的失败信息和摘要);cdg term -f 可显示全部内容。令牌数按每四个字符估算,因此预算只是近似值。

让流程更顺畅

cdg term install 会为你的 shell 安装钩子,让每条命令都自动捕获,无需输入 cdg cap (cdg term uninstall 会移除钩子)。cdg term 会显示已捕获的内容;参见 终端捕获。

4. 让 Agent 获取内容

通过 MCP 连接你的编码 Agent,让它自行请求上下文,而不是让你粘贴:

claude mcp add --scope user codigest -- cdg mcp      # Claude Code

其他客户端(Cursor、VS Code、Claude Desktop):添加一个 stdio 服务,命令为 cdg,参数为 ["mcp"]。工具列表见 MCP 工具。

能够运行 shell 命令的 Agent 无需任何设置。它的 shell 不是终端,因此 cdg 会直接向它输出结果,不会接触你的剪贴板。适合 Agent 的工作方式:

cdg tree -L 2                      # where things are
cdg digest src/                    # what is defined where, with line numbers
cdg scan src/prices.py:16-19      # read the parts that matter, numbered the same way
cdg mark                           # before editing
cdg semdiff                        # afterwards: which functions it changed
cdg cap -- pytest -q && cdg pack   # run the tests; on failure, the pack has what to fix

每个代码块中的代码都与文件中的写法完全一致(->、<、& 不会转义),因此从中复制的代码可以直接粘贴回去。大型 scan 如果无人回答大小确认问题,会显示提示后停止,而不会一直等待;-y 会将所有内容一并获取。

参考

所有命令

cdg --help 会按相同的分组列出这些命令。

命令功能写入项目的内容
scan将整个项目或选定路径作为一个代码块输出无
digest输出带编号的签名和文档字符串,不含函数体(Python、MATLAB)无
tree项目目录树(-L N 用于限制深度)无
mark设置基线.codigest/
diff自基线以来的文本差异无
semdiff自基线以来的函数和类级别更改(Python)无
cap运行命令并保留其输出无
term最近捕获的命令及其输出无
pack最近一次失败、失败中提及的文件以及你的更改无
mcp为 Agent 提供的 MCP 服务无
statuspack 在此处会使用的内容:最近一次失败、更改、基线无
init用于文件筛选的 .codigest/config.toml.codigest/、.gitignore
clean删除 .codigest/(会先询问,使用 -y 跳过询问)删除 .codigest/

通用选项:-s / --stdout 也会打印结果(状态消息会发送到 stderr;通过管道传输时默认启用),--copy / --no-copy 会覆盖剪贴板默认设置(在终端中复制,通过管道传输时不复制),-o FILE 也会将结果写入文件,-m / --message 会添加一条指令。 scan -l 会添加行号,scan -a 会忽略配置筛选器,scan -y 会跳过确认(CI)。scan、diff、semdiff 和 digest 的 -r / --resolve 也会纳入目标文件导入的本地文件。scan 和 term 支持使用 --format markdown|json,适用于会渲染 Markdown 的聊天工具或脚本(默认格式为 XML)。任何命令上的 --preset NAME 都会填入保存在 .codigest/config.toml 或用户配置的 [presets.<command>.NAME] 下的选项;在它之后输入的选项优先。cdg <command> --help 会列出所有选项。

终端捕获

cdg cap 会实时流式输出命令结果,并记录命令行、合并后的 stdout/stderr、退出代码和工作目录。cdg term --context 还会附带捕获时的主机名和 shell 名称。电脑名称为可选项,因为它可能包含敏感信息;较早的捕获记录没有主机名,而 cdg term 仍会在不包含主机名的情况下复制内容。你机器上所有项目的捕获记录共用一个存储区,因此可以在任何目录中使用 cap 和 term。

cdg cap "npm run build | tail -20"  # quote pipelines
cdg term              # last command and its output
cdg term -n 3         # last 3
cdg term -f           # last failed one
cdg term --context   # add the PC hostname and shell to the copied context (opt-in)
cdg term --here -n 3  # last 3 run in this project
cdg term -i 2         # only the command from 2 runs ago
cdg term -n 3 --format json  # the last 3 as JSON (markdown also works)
cdg term path         # where captures are stored (override with CODIGEST_HOME)
cdg term clear        # delete all captures

未通过 cap 运行的命令会从原生 shell 历史记录(PowerShell、bash、zsh、fish)中读取,但不包含其输出。

自动捕获

cdg term install 会修改已安装 shell 对应的 PowerShell 配置文件、~/.bashrc 和 ~/.zshrc;使用 --shell powershell|bash|zsh|all 选择 shell。在 Windows 上,Git Bash 计作 bash。命令仍会在当前会话中运行(cd、变量和函数都可以正常使用),并按输入内容出现在历史记录中。需要真实终端的程序会被跳过:编辑器、分页器、ssh、全屏工具(tmux、zellij、herdr、k9s、yazi 等)、带有 -it 的 docker/podman/kubectl、npm/pnpm/yarn/bun 的 init 或 create、npx create-*、pip uninstall、gh auth login、az login、gcloud auth login 和 gcloud init、aws configure、ssh-keygen、sudo,以及数据库 shell(psql、mysql、sqlite3 等)。如果提示符所在行没有以换行符结尾,它会一直留在捕获管道中,直到出现下一个换行符,因此命令看起来会像是卡住了。

  • 跳过单条命令:在命令行开头加一个空格。
  • 跳过更多程序:$env:CODIGEST_CAP_SKIP = '^\s*(myrepl|mytui)\b'(bash/zsh: export CODIGEST_CAP_SKIP='^(myrepl|mytui)( |$)',这是一个扩展正则表达式)。
  • 在当前会话中禁用:$env:CODIGEST_NOCAP = 1(bash/zsh:export CODIGEST_NOCAP=1)。
  • 移除钩子:cdg term uninstall。每个启动文件都会恢复为安装前的确切字节内容(包括换行符、BOM 和末尾换行符);安装时创建的文件会连同为其创建的文件夹一起删除,数据文件夹中的钩子副本也会删除。捕获的命令会保留,直到运行 cdg term clear。
运行其他命令的程序

有些程序会替你运行命令行,例如 hanfix 中的 hf(它会用韩文键盘布局重新运行上一条输入的命令)。这类程序会被整体捕获,它运行的命令也会接收到捕获管道,而不是终端。此类程序可以通过以下两个步骤与钩子配合使用:

  1. 加载时将其命令名称添加到 CODIGEST_RUNNERS;钩子不会捕获以其中任何名称开头的行。请使用追加方式,这样启动文件加载它和 codigest 的顺序就无关紧要:
    • PowerShell:$global:CODIGEST_RUNNERS += 'hf'
    • bash/zsh:CODIGEST_RUNNERS="${CODIGEST_RUNNERS-} hf"(空格分隔的 shell 变量)
  2. 在每行命令运行时,通过当时查找到的 __cdg_run(如果已定义)运行它。它会对该行应用钩子自身的规则:需要终端的程序会保留终端,其他程序会在该行下被捕获。
    • PowerShell:if (Get-Command __cdg_run -CommandType Function -ErrorAction Ignore) { . __cdg_run $line } else { Invoke-Expression $line }
    • bash/zsh:if typeset -f __cdg_run >/dev/null; then __cdg_run "$line"; else eval "$line"; fi

不执行步骤 2 的程序仍可列入 CODIGEST_RUNNERS:这样它运行的命令会保留终端,且不会被捕获。thefuck 就是一个例子: $global:CODIGEST_RUNNERS += 'fuck'(bash/zsh:CODIGEST_RUNNERS="${CODIGEST_RUNNERS-} fuck")。

程序也可以在运行前替换输入的行:按下 Enter 时,钩子会将该行传给 CODIGEST_REWRITERS 中列出的每个函数,第一个声明处理该行的函数会提供要运行的行。随后该行会像输入的内容一样继续处理:它会进入 shell 历史记录(在 PowerShell 中包括 PSReadLine 和引擎的历史记录),钩子的规则会决定是否捕获它,且 $? 反映的是该行自身的状态码。单独输入 hf 时可以采用这种方式;在较长的行中输入 hf 时,仍需使用上述步骤。

  • PowerShell:$global:CODIGEST_REWRITERS += 'name'。函数接收该行,并返回 $null(而不是该行)、新行,或 @{ Line = <new>; Confirm = $true } 以请求确认。
  • bash/zsh:CODIGEST_REWRITERS="${CODIGEST_REWRITERS-} name"。函数接收该行,将 REPLY 设为新行并返回 0;返回 2 表示请求确认;若该行不由它处理,则返回 1。
  • 收到确认请求时,钩子会显示新行并附上 [Enter / Ctrl+C]:按 Enter 运行该行,按任意其他键则放弃该行(不会运行任何内容,也不会将其添加到历史记录)。
  • 如果函数失败、返回其他值,或提供的行无法解析,则会保留原样输入的行,且不显示消息。若函数耗时超过 200 ms,其结果也会被丢弃。这不是超时机制:钩子会等待函数返回,因此函数若卡住,按下 Enter 后也会被阻塞。
  • 函数不应自行添加历史记录。
  • 以空格开头输入的行会保留该空格,因此不会被捕获。
  • 在 PowerShell 远程会话、嵌套提示符或调试器中不可用。

在 PowerShell 中,钩子可以与其他 PSConsoleHostReadLine 实现(VS Code 的 shell integration、atuin)配合使用:它会调用该实现获取命令行,因此能看到用户输入的内容,并且只包装该实现返回的内容。如果钩子加载后又加载了其他实现,那么在 shell 等待输入时,钩子也会重新置于最前面;即使该实现自行读取命令行(atuin 就是如此),也同样如此。加载其他实现后的第一行不会被捕获。

profile 加载的是 cdg term install 放入数据文件夹(与捕获文件同级的 shell/)中的钩子副本,而不是软件包内的文件。更新 codigest 后,请再次运行 cdg term install 以刷新该副本。

限制:

  • 捕获到的程序会向管道而非 TTY 写入,因此有些程序会失去颜色或进度条。
  • 在 bash(4+)和 zsh 中,多行命令(跨多行输入的循环、heredoc)、后台任务(cmd &)以及使用 ! 历史扩展的行不会被捕获;它们会正常运行。在 bash 中,以子 shell ( ... ) 开头的行也不会被捕获。
  • 在 bash 中,钩子使用 DEBUG 陷阱,并保留首个提示符出现前设置的一组陷阱(starship、bash-preexec);之后设置的 DEBUG 陷阱会替换它。
  • 在 bash 中,VS Code 的 shell 集成如果在钩子加载后加载,会停止捕获(#52)。
  • 长输出有长度限制:PowerShell 钩子会保留前后各 2,000 行;bash 或 zsh 的捕获文件超过 4 MB 时,会各读取开头和末尾的 1 MB。存储随后会将内容保留至 64 KB。
  • 在 PowerShell 中,命令的退出代码非零或错误显示在屏幕上时,该命令会被视为失败;使用 -ErrorAction 隐藏的错误不算失败。
  • PowerShell 钩子不会包装远程会话、嵌套提示符或调试器中的行。
MCP 工具
工具返回内容
pack最近一次失败、该失败提及的文件、这些文件的更改及其导入内容,并按预算截取(targets、with、budget、message)
terminal_history最近的命令及其输出和退出代码(count、failed、here:仅限当前项目,默认开启)
scan项目快照(targets、resolve、message)
diff / semdiff自基线以来的文本 / 结构更改
digest仅包含签名和文档字符串
tree目录树

这些工具返回的文本与 CLI 打印的内容相同。它们都不会移动基线,并且会拒绝访问 MCP 服务启动所在项目之外的路径。

配置

cdg init 会写入 .codigest/config.toml。[filter]` 部分控制每条命令会处理哪些文件:

[filter]
# Only these extensions (omit to include every non-ignored file)
extensions = [".py", ".ts", ".rs", ".md", ".json"]

# Extra exclusions, in .gitignore syntax (.gitignore itself is always honored)
exclude_patterns = [
    "*.lock",
    "tests/data/",
    "legacy_code/"
]

.git/、.codigest/、虚拟环境、node_modules/ 和 __pycache__/ 始终会被跳过。

隐私与安全
  • 凭据文件。 任何命令都不会包含 .env*(.env.example 等模板除外)、*.pem、*.key、 *.p12、*.pfx、密钥库、.netrc、.pgpass 和 SSH 私钥。scan 会说明哪些文件被排除,pack 会将它们列为已省略文件,而差异中的相关代码块会替换为提示。
  • 代码和差异中的令牌。 Codigest 输出的所有内容中,私钥、JWT、厂商令牌(OpenAI、GitHub、AWS、Google、 Slack、GitLab、npm、Stripe sk_/rk_、Hugging Face hf_)以及 URL 中的密码都会被屏蔽。token = get_token() 这类普通代码则会保留原样。
  • 捕获内容中的机密。 此外,写入磁盘前还会检查终端输出中的 Authorization 标头,以及 key=value 和 key: value 格式的键值对;键名可能带引号("password": "..."),也可能以下划线或连字符加机密名称结尾 (AWS_SECRET_ACCESS_KEY、DB_PASS;也包括 pass 和 pwd)。打印凭据的命令输出绝不会被存储:env、printenv、gh auth token、aws configure 和 aws sts get-session-token/assume-role、az account get-access-token、 gcloud auth print-access-token、kubectl get secret、kubectl config view --raw、 op read、bw get、pass show、vault read、对 .env、.npmrc、.pypirc、.netrc、密钥文件或 credentials.json 执行 cat,以及其他少数命令(完整列表见 src/codigest/core/redact.py 中的 DENY_COMMANDS)。
  • 这些规则能识别常见格式,但无法涵盖所有可能的机密。
  • 你的项目。 没有命令会更改源文件。只有 mark 和 init 会创建 .codigest/,其中包含自己的 .gitignore(*),因此它永远不会出现在 git status 中;init 还会将其添加到项目的 .gitignore 中。
  • 捕获文件的位置。 cdg term path 会显示文件路径。在 macOS 和 Linux 上,只有你自己可以读取该文件。cdg term clear 会将其删除。
  • 没有任何内容会离开你的设备。 Codigest 不会发起网络请求。上下文只会发送到你粘贴的位置,或你连接的 MCP 客户端。
从 0.9 升级
  • 管道或重定向输出现在无需 -s 即可打印,也不再复制;如果脚本依赖剪贴板,请添加 --copy。
  • <file> 块会原样保存代码,而不再进行 XML 转义。.codigest/prompts.toml 中的自定义模板现在也会收到未经转义的代码块;只有 {instruction} 会转义。
  • digest 输出现在会按源文件顺序编号、包含文档字符串,并接受多个路径。
从 0.8 升级
  • scan、diff、semdiff 和 digest 不再保存到 .codigest/*.txt;请使用 -o FILE。 diff --no-save 等选项已移除。
  • cdg init 不再设置基线;请运行 cdg mark。
  • cdg pack FILES 只会打包指定文件;如需使用之前的行为,请添加 --with failure,changes,tests,imports。
  • 输出不再以模型的内置指令(“You are an expert...”)开头。请用 -m 提供自己的指令,或在 .codigest/prompts.toml 中设置模板。
工作原理
  • 基线。 .codigest/anchor/.shadow_git 中的 Git 仓库,与项目自身的仓库分开。mark 会将当前状态提交到该仓库;diff、semdiff、status 和 pack 会将工作树与其进行比较。
  • 捕获内容。 单个以换行符分隔的 JSON 文件会保存最近 200 条命令;每条输出上限为 64 KB,并保留开头和结尾部分。
  • 输出。 文件内容会原样放入 <file> 块。只有文件中出现 Codigest 自带块的结束标记(字面形式的 </file>)时,才会写成 &lt;/file>,以防提前结束代码块。
  • MCP。 服务是一个通过 stdio 运行的小型 JSON-RPC 循环。每个工具都会使用 -s --no-copy 调用常规 CLI,因此 Agent 看到的内容与你会粘贴的内容完全一致。
开发
git clone https://github.com/NaNIsaac/codigest
cd codigest
uv run cdg --help              # run from the checkout
uv run --with pytest pytest -q # tests

许可证

MIT。请参阅 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。