mcpField
C
Codigest

Codigest

ローカル
github.com/NaNIsaac開発ツール1今日更新

Codigest について

Codigest は、選択したコード、変更内容、取得したターミナル出力を、AI チャットやコーディングエージェント向けのコンテキストにまとめるローカルのコマンドラインツールです。共有範囲を指定でき、含まれるファイルを示し、秘密情報をマスクします。

主な機能

  1. 01プロジェクト、選択ファイル、インポート先のパッケージ化
  2. 02テキスト差分と関数単位の変更表示
  3. 03コマンド出力を取得し、失敗と関連コードをまとめる
  4. 04含まれるファイルと除外ファイルの表示
  5. 05環境ファイルの除外とトークンのマスク

活用シーン

  1. 01AI チャットで選んだプロジェクトコードを共有
  2. 02基準点以降の関数単位の変更を確認
  3. 03失敗したテストと関連コードをエージェントに渡す

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、コーディングエージェントにコードについて尋ねるときに使うコマンドラインツールです。 選んだプロジェクトの一部を、どのチャットにも貼り付けられるひとまとまりのテキストに変換します。

モデルは、提示された情報しか知りません。ファイルを手作業でコピーするのは時間がかかり、重要なファイルを見落としやすく、質問に必要な量をはるかに超えて貼り付けてしまうこともあります。Codigest なら、共有する内容を選ぶだけで収集できます。プロジェクト全体、あるファイルとそのファイルがインポートするファイル、指定した時点以降の変更内容、または失敗したテストとエラーが指し示すコードを収集できます。

できること

  • 選んだコードをまとめます。 プロジェクト全体、選択したファイルやフォルダー、またはそれらがインポートするローカルファイル(Python、JS/TS)を、ファイルツリーとともにひとまとまりにします。
  • 変更内容を表示します。 設定したベースライン以降のテキスト差分や関数単位の差分を、Git の履歴に触れることなく表示します。
  • ターミナルの出力を取り込みます。 実行したコマンドを記録し、失敗したコマンドを、エラーが指し示すファイルとともに渡せます。
  • 含めた内容を示します。 すべてのバンドルでサイズを報告し、pack では各ファイルを含めた理由と、除外したファイルを示します。
  • シークレットを除外します。 .env ファイルとキーは決して含まれず、コードや出力に含まれるトークンはマスキングされます。
  • エージェントで使えます。 Claude Code、Cursor、その他の MCP クライアントから、同じ出力を要求できます。

Codigest は AI モデルを呼び出しません。モデルに送る内容を準備するだけです。すべての処理はお使いのマシン上で実行されます。

cdg cap で失敗する pytest を実行し、続いて cdg pack で失敗内容、そこで示されたテストファイル、変更されたファイルをまとめます
以下のワークフローの一例です。テストが失敗したとき、1 つのコマンドでモデルに必要な情報を収集できます。

インストール

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 では、CDG_FORCE=1 を設定しない限り、install.sh は同じフォルダーにある Python パッケージ由来の cdg を置き換えません。

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 を実行するとシェルにフックが追加され、すべてのコマンドの出力が 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、スクリプト、コーディングエージェントのシェルなど)は、結果が表示され、クリップボードにはコピーされません。それでもコピーするには --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>

大規模なプロジェクトでは、コピー前に確認が表示されます(3 万トークンまたは 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 クラスが追加され、古い MATLAB 版が legacy/ に置かれています。

digest は、会話を始めるときの概要です。Python ファイルのすべての関数、クラス、トップレベル変数と、MATLAB ファイルの関数および %% セクションを、登場順に、開始行と docstring の最初の行(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 はそのコピーを保存します。その後、パックを作成するよう依頼します。

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. 過去 1 時間以内にこのプロジェクトで実行した、最後に失敗したコマンドの出力に記載されたファイル: File "x.py", line 7(Python)、x.py:7(pytest、ruff、gcc、rustc、eslint)、x.ts(7,3)(tsc)。 同じコマンドが再び成功すると、その失敗は対象外になります。出力に記載されているだけで、あなたが変更していないファイルは抜粋として含まれます。出力が示す箇所の前後 10 行が、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 で確認できます。トークン数は 4 文字につき 1 トークンとして推定されるため、予算は概算です。

さらにスムーズに使う

cdg term install は、cdg cap と入力しなくてもすべてのコマンドが記録されるよう、シェルにフックを追加します(削除するには cdg term uninstall を実行します)。記録された内容は cdg term で確認できます。Terminal capture を参照してください。

4. エージェントに取得させる

MCP 経由でコーディングエージェントに接続すると、貼り付けを求める代わりに、エージェント自身がコンテキストを要求します。

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

その他のクライアント(Cursor、VS Code、Claude Desktop)では、コマンドを cdg、引数を ["mcp"] として stdio サーバーを追加します。ツールは MCP tools に記載されています。

シェルコマンドを実行できるエージェントには、セットアップは不要です。エージェントのシェルはターミナルではないため、cdg は結果を出力し、クリップボードには一切触れません。エージェントに適した作業方法は次のとおりです。

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エージェント向けの MCP サーバーなし
statusここで pack が使用する情報:直近の失敗、変更、ベースラインなし
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 は、Markdown を表示するチャットやスクリプト向けに --format markdown|json を指定できます(デフォルトは XML)。任意のコマンドで --preset NAME を指定すると、.codigest/config.toml またはユーザー設定の [presets.<command>.NAME] に保存されたオプションが適用されます。その後に入力したオプションが優先されます。すべてのオプションは cdg <command> --help で確認できます。

ターミナルキャプチャ

cdg cap はコマンドの出力をリアルタイムでストリーミングし、コマンドライン、stdout/stderr を結合した出力、終了コード、作業ディレクトリを記録します。cdg term --context では、キャプチャ時のホスト名とシェル名も含めます。PC 名は機密情報である可能性があるため、明示的に有効にする必要があります。以前のキャプチャにはホスト名が含まれていませんが、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 経由で実行されていないコマンドは、出力なしで、ネイティブシェルの履歴(PowerShell、bash、zsh、fish)から読み取られます。

自動キャプチャ

cdg term install は、インストールされている対象シェルの PowerShell プロファイル、~/.bashrc、~/.zshrc を編集します。--shell powershell|bash|zsh|all で選択できます。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、データベースシェル(psql、mysql、sqlite3、…)です。プロンプトが改行せずに終わる場合、次の改行までキャプチャパイプには表示されないため、コマンドが停止したように見えることがあります。

  • 1 つのコマンドをスキップする:行頭にスペースを付けます。
  • スキップするプログラムを追加する:$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 のように、コマンドラインを代わりに実行するプログラム(韓国語配列で入力した直前のコマンドを再実行します)は、通常、プログラム全体がキャプチャされ、実行するコマンドには端末ではなくキャプチャ用のパイプが渡されます。このようなプログラムは、フックと次の2つの手順で連携できます。

  1. 読み込み時に、そのコマンド名を CODIGEST_RUNNERS に追加します。フックは、これらのいずれかで始まる行をキャプチャしません。起動ファイルでの読み込み順と codigest の読み込み順に関係しないよう、末尾に追加してください。
    • PowerShell:$global:CODIGEST_RUNNERS += 'hf'
    • bash/zsh:CODIGEST_RUNNERS="${CODIGEST_RUNNERS-} hf"(シェル変数。スペース区切り)
  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 に登録された各関数にその行を渡し、最初に処理を引き受けた関数が返す行を実行します。この行は入力された場合と同じように処理されます。シェルの履歴(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 のシェル統合、atuin)と連携します。行を取得するためにそれを呼び出すので、入力されたとおりの行が認識され、返された内容だけをラップします。フックの読み込み後に別のものが読み込まれた場合、シェルが入力待ちの間、フックは自分自身を最上位に戻します。別のものが自ら行を読み取る場合(atuin が該当します)も同様です。その場合、最初の行はキャプチャされません。

プロファイルが読み込むのは、パッケージ内のファイルではなく、cdg term install がデータフォルダー(キャプチャと同じ場所にある shell/)に配置したフックのコピーです。codigest を更新した後は、cdg term install を再度実行して更新してください。

制限事項:

  • キャプチャしたプログラムの出力先は TTY ではなくパイプになるため、色や進捗バーが表示されなくなることがあります。
  • bash(4 以降)と zsh では、複数行のコマンド(複数行にわたって入力するループやヒアドキュメント)、バックグラウンドジョブ(cmd &)、履歴展開の ! を使う行はキャプチャされず、通常どおり実行されます。bash では、サブシェル ( ... ) で始まる行もキャプチャされません。
  • bash では、フックは DEBUG トラップを使用し、最初のプロンプトが表示される前に設定されたトラップを維持します(starship、bash-preexec)。後から設定された DEBUG トラップは、これを置き換えます。
  • bash では、フックの読み込み後に VS Code のシェル統合が読み込まれると、キャプチャが停止します(#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シグネチャと docstring のみ
treeディレクトリツリー

各ツールは CLI が出力するものと同じテキストを返します。いずれのツールもベースラインを更新しません。また、サーバーの起動場所となったプロジェクトの外部にあるパスは拒否されます。

設定

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.example などのテンプレートを除く .env*、*.pem、*.key、 *.p12、*.pfx、キーストア、.netrc、.pgpass、SSH 秘密鍵は、どのコマンドでも決して含まれません。 scan は除外したファイルを示し、pack は省略したファイルとして一覧表示し、diff では該当する ハンクを通知に置き換えます。
  • コードや diff 内のトークン。 秘密鍵、JWT、ベンダーのトークン(OpenAI、GitHub、AWS、Google、 Slack、GitLab、npm、Stripe の sk_/rk_、Hugging Face の hf_)、URL 内のパスワードは、Codigest が出力するすべての内容でマスキングされます。token = get_token() のような通常のコードは変更されません。
  • キャプチャ内のシークレット。 さらに、ターミナル出力をディスクに書き込む前に、Authorization ヘッダーと、引用符付きキー("password": "...")、または _ や - の後にシークレット名が続くキー (AWS_SECRET_ACCESS_KEY、DB_PASS、さらに pass と pwd)を使った key=value および key: value のペアを検査します。認証情報を表示するコマンドの出力は保存されません。対象となるのは、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 を参照してください)。
  • これらのルールは一般的な形式を検出しますが、あらゆるシークレットを検出できるわけではありません。
  • プロジェクトについて。 どのコマンドもソースファイルを変更しません。.codigest/ を作成するのは mark と init だけです。このディレクトリには独自の .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 の出力には、ソース順に番号が付けられ、docstring も含まれるようになりました。また、複数のパスを 指定できます。
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 は作業ツリーとベースラインを比較します。
  • キャプチャ。 1 つの改行区切り JSON ファイルに直近 200 件のコマンドが保存されます。各出力の上限は 64 KB で、先頭と末尾が保持されます。
  • 出力。 ファイルの内容は <file> ブロック内にそのまま格納されます。ファイル内に Codigest 独自の ブロックを閉じるタグ(文字列としての </file>)がある場合に限り、早期にブロックが閉じないよう &lt;/file> として書き込まれます。
  • MCP。 サーバーは stdio 上で動作する小規模な JSON-RPC ループです。各ツールは通常の CLI を -s --no-copy 付きで実行するため、エージェントには、あなたが貼り付ける場合とまったく同じ内容が表示されます。
開発
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 を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。