diff --git a/site/.vitepress/theme/HeroDemo.vue b/site/.vitepress/theme/HeroDemo.vue
index d08832f..5669384 100644
--- a/site/.vitepress/theme/HeroDemo.vue
+++ b/site/.vitepress/theme/HeroDemo.vue
@@ -57,7 +57,7 @@ function stop() {
padding: 0;
border-radius: 12px;
cursor: pointer;
- box-shadow: 0 30px 70px -28px rgb(194 65 12 / 0.55), 0 2px 10px rgb(0 0 0 / 0.25);
+ box-shadow: 0 20px 48px -24px rgb(0 0 0 / 0.45);
}
.screen img {
diff --git a/site/.vitepress/theme/HomeWorkflows.vue b/site/.vitepress/theme/HomeWorkflows.vue
new file mode 100644
index 0000000..2b5a189
--- /dev/null
+++ b/site/.vitepress/theme/HomeWorkflows.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
diff --git a/site/.vitepress/theme/index.ts b/site/.vitepress/theme/index.ts
index 262099b..3f9a933 100644
--- a/site/.vitepress/theme/index.ts
+++ b/site/.vitepress/theme/index.ts
@@ -3,10 +3,14 @@ import type { Theme } from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import HeroDemo from './HeroDemo.vue'
import HeroInstall from './HeroInstall.vue'
+import HomeWorkflows from './HomeWorkflows.vue'
import './style.css'
export default {
extends: DefaultTheme,
+ enhanceApp({ app }) {
+ app.component('HomeWorkflows', HomeWorkflows)
+ },
Layout: () =>
h(DefaultTheme.Layout, null, {
'home-hero-info-after': () => h(HeroInstall),
diff --git a/site/.vitepress/theme/style.css b/site/.vitepress/theme/style.css
index ca9d06f..e395752 100644
--- a/site/.vitepress/theme/style.css
+++ b/site/.vitepress/theme/style.css
@@ -10,10 +10,7 @@
--vp-button-brand-active-bg: #9a3412;
--vp-button-brand-text: #fff;
- --vp-home-hero-name-color: transparent;
- --vp-home-hero-name-background: linear-gradient(110deg, #c2410c 10%, #f59e0b 90%);
- --vp-home-hero-image-background-image: linear-gradient(-45deg, #f59e0b 40%, #ea580c 60%);
- --vp-home-hero-image-filter: blur(56px);
+ --vp-home-hero-name-color: var(--vp-c-brand-1);
--vp-code-block-bg: #fbf7f3;
--vp-code-line-highlight-color: rgb(234 88 12 / 0.1);
@@ -34,9 +31,6 @@
--vp-button-brand-hover-bg: #f97316;
--vp-button-brand-active-bg: #c2410c;
- --vp-home-hero-name-background: linear-gradient(110deg, #fb923c 10%, #fcd34d 90%);
- --vp-home-hero-image-filter: blur(64px);
-
--vp-c-bg: #14110f;
--vp-c-bg-alt: #0f0d0c;
--vp-c-bg-elv: #1c1815;
@@ -44,10 +38,6 @@
--vp-code-block-bg: #0f0d0c;
}
-.dark .VPHome {
- --vp-home-hero-image-background-image: linear-gradient(-45deg, #c2410c 40%, #b45309 60%);
-}
-
/* Code reads better with more room than the default 1.6 line height. */
.vp-doc div[class*='language-'] {
border: 1px solid var(--vp-c-divider);
@@ -76,18 +66,35 @@
}
.VPHome .vp-doc h2 {
- margin-top: 56px;
- text-align: center;
+ margin-top: 64px;
+ padding-top: 0;
letter-spacing: -0.01em;
}
-.VPFeature {
- transition: border-color 0.2s, transform 0.2s;
+/* Terminal tabs: long output scrolls inside the block instead of stretching the page. */
+.VPHome .vp-code-group div[class*='language-'] pre {
+ max-height: 460px;
+ overflow: auto;
+}
+
+.VPHome .vp-code-group span.lang {
+ display: none;
+}
+
+.home-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 340px), 1fr));
+ gap: 8px 32px;
+}
+
+.vp-doc .home-grid h3 {
+ margin-top: 16px;
+ font-size: 17px;
}
-.VPFeature:hover {
- border-color: var(--vp-c-brand-1) !important;
- transform: translateY(-2px);
+.vp-doc .home-grid p {
+ margin: 8px 0;
+ color: var(--vp-c-text-2);
}
.VPHero .text {
@@ -100,21 +107,14 @@
overflow-wrap: break-word;
}
-/* Hero: a tinted band in the accent colour, demo in the right column on wide screens. */
+/* Hero: a plain band set off by a rule, demo in the right column on wide screens. */
.VPHome {
overflow-x: clip;
}
.VPHomeHero {
- background:
- radial-gradient(ellipse 70% 90% at 78% 30%, rgb(234 88 12 / 0.16), transparent 70%),
- linear-gradient(180deg, rgb(234 88 12 / 0.06), transparent 85%);
-}
-
-.dark .VPHomeHero {
- background:
- radial-gradient(ellipse 70% 90% at 78% 30%, rgb(234 88 12 / 0.28), transparent 70%),
- linear-gradient(180deg, #0b0908, transparent 90%);
+ border-bottom: 1px solid var(--vp-c-divider);
+ background: var(--vp-c-bg-alt);
}
.VPHero .image,
diff --git a/site/index.md b/site/index.md
index 3cdaa37..d432718 100644
--- a/site/index.md
+++ b/site/index.md
@@ -11,9 +11,6 @@ hero:
- theme: brand
text: Get Started
link: /getting-started
- - theme: alt
- text: Command Reference
- link: /commands
- theme: alt
text: GitHub
link: https://github.com/NaNIsaac/codigest
@@ -32,27 +29,30 @@ install:
moreLink: /installation
demo:
- alt: cdg cap runs a failing pytest, then cdg pack bundles the failure, the test file it names and the changed file
+ alt: cdg cap runs a failing pytest, then cdg pack bundles the failure, your uncommitted change and the two files involved
caption: A test fails, and one command collects what the model needs.
-features:
- - title: Bundles code you pick
- details: The whole project, chosen files and folders, or the local files they import (Python, JS/TS), as one block with the file tree.
+workflowsMore: How it works
+workflows:
+ - title: Share the whole project
+ details: The file tree and every file, minus what .gitignore and your config leave out, copied as one block.
+ commands: ['cdg scan']
link: /commands#cdg-scan
- - title: Shows what changed
- details: Text or function-level diffs since a baseline you set, without touching your Git history.
- link: /commands#cdg-mark
- - title: Brings in terminal output
- details: It records commands you run and can hand over a failing one together with the files its error points at.
- link: /terminal-capture
- - title: Says what it included
- details: Every bundle reports its size, and pack gives the reason for each file and names the ones it left out.
- link: /commands#cdg-pack
- - title: Keeps secrets out
- details: .env files and keys are never included, and tokens in code or output are masked.
- link: /security
- - title: Works with agents
- details: Claude Code, Cursor and other MCP clients can request the same output.
+ - title: Share a few files and what they import
+ details: Name the files or folders. -r adds the local files they import (Python, JS/TS).
+ commands: ['cdg scan src/billing/invoice.py -r']
+ link: /recipes#share-one-folder-or-one-question-s-worth-of-files
+ - title: Share only what changed
+ details: Set a baseline before you start, then send the text diff or the Python functions that changed. Git history is not touched.
+ commands: ['cdg mark', 'cdg diff']
+ link: /recipes#review-a-refactor-with-mark-and-semdiff
+ - title: Hand over a failing test
+ details: Run the test through cap, then pack the failure with the files its error points at and your changes.
+ commands: ['cdg cap -- pytest -q', 'cdg pack']
+ link: /recipes#a-test-fails-and-you-do-not-know-why
+ - title: Let an agent ask for it
+ details: Claude Code, Cursor and other MCP clients call the same commands and get the same output.
+ commands: ['claude mcp add --scope user codigest -- cdg mcp']
link: /mcp
---
@@ -60,15 +60,13 @@ Codigest does not call any AI model; it only prepares what you send to one. Ever
## See it work
-The examples below are real output from a small project: `prices.py` with a failing test in `test_prices.py`. The project grows between examples: `prices.py` gains a `Cart` class and a `legacy/` folder with a MATLAB file appears.
+Real output from one run on a small project. You just edited `prices.py`, and the test in `test_prices.py` now fails.
-### Share the project
+::: code-group
-```console
+```txt [cdg scan]
$ cdg scan -s
-```
-
-```xml
+Copied snapshot to clipboard
├── .gitignore
@@ -83,8 +81,26 @@ __pycache__/
-def apply_discount(price, percent):
+"""Prices after discount and tax."""
+
+TAX_RATE = 0.1
+
+
+def apply_discount(price: float, percent: float) -> float:
+ """Price after taking off `percent` percent."""
return price * (1 - percent)
+
+
+class Cart:
+ """Items and the discount that applies to all of them."""
+
+ def __init__(self, percent: float = 0):
+ self.items: list[float] = []
+ self.percent = percent
+
+ def total(self) -> float:
+ """Sum after discount and tax."""
+ return sum(apply_discount(p, self.percent) for p in self.items) * (1 + TAX_RATE)
@@ -98,38 +114,25 @@ def test_ten_percent():
```
-In a terminal the result goes to the clipboard. `-s` also prints it.
-
-### Start with an overview
-
-`digest` lists every function, class and top-level variable with the line it starts on and the first line of its docstring, and leaves the bodies out.
-
-```console
+```txt [cdg digest]
$ cdg digest -s
-```
-
-```xml
+Digest 2 files, ~160 tokens
+Copied digest to clipboard
├── .gitignore
-├── legacy
-│ └── discount.m
├── prices.py
└── test_prices.py
-
-1: function p = discount(price, percent)
- Price after taking off percent percent.
-5: %% Apply
-
- 1: TAX_RATE = 0.1
- 4: def apply_discount(price: float, percent: float) -> float
+ 1: """Prices after discount and tax."""
+ 3: TAX_RATE = 0.1
+ 6: def apply_discount(price: float, percent: float) -> float
Price after taking off `percent` percent.
- 9: class Cart
+11: class Cart
Items and the discount that applies to all of them.
-12: def __init__(self, percent: float=0)
-16: def total(self) -> float
+14: def __init__(self, percent: float=0)
+18: def total(self) -> float
Sum after discount and tax.
@@ -138,9 +141,7 @@ $ cdg digest -s
```
-### Hand over a failing command
-
-```console
+```txt [cdg cap]
$ cdg cap -- pytest -q
F [100%]
================================== FAILURES ===================================
@@ -154,15 +155,61 @@ 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.04s
+1 failed in 0.06s
+```
+```txt [cdg pack]
$ cdg pack
-Packed ~689 / 30,000 tokens
+Packed ~545 / 30,000 tokens
failed pytest -q (exit 1, just now)
changes uncommitted changes (git)
- + test_prices.py line 5 in failing output
- + prices.py called from failing test test_prices.py
- + legacy/discount.m changed
+ + test_prices.py line 5 in failing output
+ + prices.py called from failing test test_prices.py
+Copied pack to clipboard
```
-The pack holds the failing command with its output, your uncommitted Git changes, `test_prices.py` because the error points at its line 5, `prices.py` because the test calls it, and `legacy/discount.m` because you edited it. [Output Formats](/output-formats) shows the whole block.
+:::
+
+- **scan** puts the project in one block. In a terminal it goes to the clipboard; `-s` also prints it.
+- **digest** keeps the line number, signature and first docstring line of each definition and leaves the bodies out, so the model can ask for `apply_discount` by name.
+- **cap** runs the test as usual and keeps its output.
+- **pack** sends the failure, your uncommitted change, `test_prices.py` because the error points at its line 5, and `prices.py` because the test calls it. [Output Formats](/output-formats) shows a whole pack.
+
+The output above is from the native `cdg` 0.12.2 on Windows. The Python package prints the same blocks; [Rust Port](/rust-port#differences-from-the-python-build) lists where the two differ.
+
+## Common workflows
+
+
+
+## What it shares, and what it keeps out
+
+
+
+
+### Stays on your machine
+
+Codigest makes no network requests. Context leaves only when you paste it, or when an MCP client you connected asks for it.
+
+
+
+
+### Never included
+
+`.env` files, keys and certificates (`*.pem`, `*.key`, ...), SSH private keys, `.netrc` and `.pgpass`. Commands name the files they held back.
+
+
+
+
+### Masked
+
+Tokens with a known shape, such as GitHub, AWS, OpenAI or Slack keys, are replaced with `[REDACTED]`. Terminal captures are masked before they are stored.
+
+
+
+
+### Not a guarantee
+
+A secret in a format the rules do not know is not caught. Read what you paste. [Security](/security) lists every rule and its limits.
+
+
+
diff --git a/site/ko/index.md b/site/ko/index.md
index cb49977..f967d00 100644
--- a/site/ko/index.md
+++ b/site/ko/index.md
@@ -11,9 +11,6 @@ hero:
- theme: brand
text: 빠른 시작
link: /ko/getting-started
- - theme: alt
- text: 명령어 레퍼런스
- link: /ko/commands
- theme: alt
text: GitHub
link: https://github.com/NaNIsaac/codigest
@@ -32,27 +29,30 @@ install:
moreLink: /ko/installation
demo:
- alt: cdg cap으로 실패하는 pytest를 실행한 뒤, cdg pack이 실패 출력과 오류가 가리키는 테스트 파일, 바뀐 파일을 묶는 화면
+ alt: cdg cap으로 실패하는 pytest를 실행한 뒤, cdg pack이 실패 출력과 커밋하지 않은 변경, 관련 파일 두 개를 묶는 화면
caption: 테스트가 실패한 뒤, 명령 하나로 모델에게 보낼 자료를 모으는 모습
-features:
- - title: 고른 코드를 묶습니다
- details: 프로젝트 전체, 지정한 파일과 폴더, 또는 그 파일이 import하는 프로젝트 파일(Python, JS/TS)을 파일 트리와 함께 하나로 묶습니다.
+workflowsMore: 자세히 보기
+workflows:
+ - title: 프로젝트 전체 보여 주기
+ details: 파일 트리와 모든 파일을 하나로 묶습니다. .gitignore와 설정에서 뺀 파일은 들어가지 않습니다.
+ commands: ['cdg scan']
link: /ko/commands#cdg-scan
- - title: 바뀐 부분을 보여 줍니다
- details: 내가 잡아 둔 기준점 이후의 diff를 텍스트로, 또는 함수 단위로 보여 줍니다. Git 기록은 건드리지 않습니다.
- link: /ko/commands#cdg-mark
- - title: 터미널 출력을 가져옵니다
- details: 실행한 명령을 기록해 두고, 실패한 명령을 오류가 가리키는 파일과 함께 넘겨줍니다.
- link: /ko/terminal-capture
- - title: 무엇을 담았는지 알려 줍니다
- details: 묶을 때마다 크기를 보여 주고, pack은 파일마다 넣은 이유와 뺀 파일 이름까지 알려 줍니다.
- link: /ko/commands#cdg-pack
- - title: 비밀정보를 막습니다
- details: .env와 키 파일은 절대 넣지 않고, 코드와 출력 속 토큰은 가립니다.
- link: /ko/security
- - title: 에이전트와 연결됩니다
- details: Claude Code, Cursor 같은 MCP 클라이언트가 같은 결과를 직접 받아 갑니다.
+ - title: 파일 몇 개와 그 파일이 import하는 코드
+ details: 파일이나 폴더를 지정합니다. -r을 붙이면 그 파일이 import하는 프로젝트 파일(Python, JS/TS)까지 따라갑니다.
+ commands: ['cdg scan src/billing/invoice.py -r']
+ link: /ko/recipes#share-one-folder-or-one-question-s-worth-of-files
+ - title: 바뀐 부분만 보여 주기
+ details: 작업 전에 기준점을 잡아 두면, 그 뒤의 텍스트 diff나 바뀐 Python 함수 목록을 보낼 수 있습니다. Git 기록은 건드리지 않습니다.
+ commands: ['cdg mark', 'cdg diff']
+ link: /ko/recipes#review-a-refactor-with-mark-and-semdiff
+ - title: 실패한 테스트 넘기기
+ details: 테스트를 cap으로 실행한 뒤 pack을 만들면, 실패 출력과 오류가 가리키는 파일, 내 변경이 함께 묶입니다.
+ commands: ['cdg cap -- pytest -q', 'cdg pack']
+ link: /ko/recipes#a-test-fails-and-you-do-not-know-why
+ - title: 에이전트가 직접 가져가게 하기
+ details: Claude Code, Cursor 같은 MCP 클라이언트가 같은 명령을 호출해 같은 결과를 받습니다.
+ commands: ['claude mcp add --scope user codigest -- cdg mcp']
link: /ko/mcp
---
@@ -60,15 +60,13 @@ Codigest는 AI 모델을 호출하지 않습니다. 모델에게 보낼 자료
## 직접 보기
-아래는 작은 프로젝트에서 실제로 실행한 결과입니다. `prices.py`와, 실패하는 테스트 `test_prices.py`로 이루어진 프로젝트입니다. 예시 사이에 프로젝트가 조금씩 자랍니다. `prices.py`에 `Cart` 클래스가 생기고, MATLAB 파일이 든 `legacy/` 폴더가 생깁니다.
+작은 프로젝트에서 한 번에 실행한 실제 출력입니다. 방금 `prices.py`를 고쳤고, 그 바람에 `test_prices.py`의 테스트가 실패하는 상황입니다.
-### 프로젝트 보여 주기
+::: code-group
-```console
+```txt [cdg scan]
$ cdg scan -s
-```
-
-```xml
+Copied snapshot to clipboard
├── .gitignore
@@ -83,8 +81,26 @@ __pycache__/
-def apply_discount(price, percent):
+"""Prices after discount and tax."""
+
+TAX_RATE = 0.1
+
+
+def apply_discount(price: float, percent: float) -> float:
+ """Price after taking off `percent` percent."""
return price * (1 - percent)
+
+
+class Cart:
+ """Items and the discount that applies to all of them."""
+
+ def __init__(self, percent: float = 0):
+ self.items: list[float] = []
+ self.percent = percent
+
+ def total(self) -> float:
+ """Sum after discount and tax."""
+ return sum(apply_discount(p, self.percent) for p in self.items) * (1 + TAX_RATE)
@@ -98,38 +114,25 @@ def test_ten_percent():
```
-터미널에서 실행하면 결과가 클립보드에 복사됩니다. `-s`를 붙이면 화면에도 출력합니다.
-
-### 개요부터 시작하기
-
-`digest`는 함수, 클래스, 최상위 변수를 시작 줄 번호와 docstring 첫 줄과 함께 나열하고, 본문은 뺍니다.
-
-```console
+```txt [cdg digest]
$ cdg digest -s
-```
-
-```xml
+Digest 2 files, ~160 tokens
+Copied digest to clipboard
├── .gitignore
-├── legacy
-│ └── discount.m
├── prices.py
└── test_prices.py
-
-1: function p = discount(price, percent)
- Price after taking off percent percent.
-5: %% Apply
-
- 1: TAX_RATE = 0.1
- 4: def apply_discount(price: float, percent: float) -> float
+ 1: """Prices after discount and tax."""
+ 3: TAX_RATE = 0.1
+ 6: def apply_discount(price: float, percent: float) -> float
Price after taking off `percent` percent.
- 9: class Cart
+11: class Cart
Items and the discount that applies to all of them.
-12: def __init__(self, percent: float=0)
-16: def total(self) -> float
+14: def __init__(self, percent: float=0)
+18: def total(self) -> float
Sum after discount and tax.
@@ -138,9 +141,7 @@ $ cdg digest -s
```
-### 실패한 명령 넘기기
-
-```console
+```txt [cdg cap]
$ cdg cap -- pytest -q
F [100%]
================================== FAILURES ===================================
@@ -154,15 +155,61 @@ 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.04s
+1 failed in 0.06s
+```
+```txt [cdg pack]
$ cdg pack
-Packed ~689 / 30,000 tokens
+Packed ~545 / 30,000 tokens
failed pytest -q (exit 1, just now)
changes uncommitted changes (git)
- + test_prices.py line 5 in failing output
- + prices.py called from failing test test_prices.py
- + legacy/discount.m changed
+ + test_prices.py line 5 in failing output
+ + prices.py called from failing test test_prices.py
+Copied pack to clipboard
```
-pack에는 위에서부터 실패한 명령과 그 출력, Git에서 아직 커밋하지 않은 변경, 오류가 5번째 줄을 가리킨 `test_prices.py`, 그 테스트가 호출하는 `prices.py`, 내가 고친 `legacy/discount.m`이 들어갑니다. 전체 내용은 [출력 형식](/ko/output-formats)에서 볼 수 있습니다.
+:::
+
+- **scan**은 프로젝트를 블록 하나로 묶습니다. 터미널에서는 클립보드로 복사되고, `-s`를 붙이면 화면에도 출력합니다.
+- **digest**는 정의마다 줄 번호와 시그니처, docstring 첫 줄만 남기고 본문은 뺍니다. 모델은 이걸 보고 `apply_discount`를 이름으로 요청할 수 있습니다.
+- **cap**은 테스트를 평소처럼 실행하면서 출력을 저장해 둡니다.
+- **pack**에는 실패 출력, 커밋하지 않은 변경, 오류가 5번째 줄을 가리킨 `test_prices.py`, 그 테스트가 호출하는 `prices.py`가 들어갑니다. pack 전체 내용은 [출력 형식](/ko/output-formats)에서 볼 수 있습니다.
+
+위 출력은 Windows에서 네이티브 `cdg` 0.12.2로 실행한 결과입니다. Python 패키지도 같은 블록을 출력하며, 두 구현이 다른 부분은 [Rust 포팅](/ko/rust-port#differences-from-the-python-build)에 정리되어 있습니다.
+
+## 자주 쓰는 방법
+
+
+
+## 무엇을 보내고 무엇을 막는지
+
+
+
+
+### 내 컴퓨터 안에서만 동작
+
+Codigest는 네트워크 요청을 하지 않습니다. 내가 붙여 넣거나, 연결해 둔 MCP 클라이언트가 요청할 때만 내용이 밖으로 나갑니다.
+
+
+
+
+### 절대 넣지 않는 파일
+
+`.env` 파일, 키와 인증서(`*.pem`, `*.key` 등), SSH 개인 키, `.netrc`, `.pgpass`. 뺀 파일은 명령이 이름을 알려 줍니다.
+
+
+
+
+### 가리는 값
+
+GitHub, AWS, OpenAI, Slack 키처럼 형태가 알려진 토큰은 `[REDACTED]`로 바꿉니다. 터미널 기록은 저장하기 전에 가립니다.
+
+
+
+
+### 완벽하지는 않습니다
+
+규칙이 모르는 형식의 비밀정보는 걸러지지 않습니다. 붙여 넣기 전에 내용을 확인하세요. 모든 규칙과 한계는 [보안](/ko/security)에 있습니다.
+
+
+
diff --git a/site/ko/recipes.md b/site/ko/recipes.md
index cbd2190..d17806a 100644
--- a/site/ko/recipes.md
+++ b/site/ko/recipes.md
@@ -2,7 +2,7 @@
상황에서 붙여 넣기까지 이어지는 작업 흐름을 모았습니다. 예시는 [빠른 시작](/ko/getting-started)의 작은 프로젝트(`prices.py`, `test_prices.py`, `legacy/` 폴더)를 씁니다.
-## 테스트가 실패하는데 이유를 모를 때
+## 테스트가 실패하는데 이유를 모를 때 {#a-test-fails-and-you-do-not-know-why}
테스트를 `cap`으로 실행하고 pack을 만듭니다.
@@ -33,7 +33,7 @@ pack이 생각보다 크면 예산을 줄이거나(`-b 8000`) 필요한 것만
기록된 것 전부를 보려면 `cdg term -f`를 쓰세요.
-## mark와 semdiff로 리팩터링 검토하기
+## mark와 semdiff로 리팩터링 검토하기 {#review-a-refactor-with-mark-and-semdiff}
작업을 시작하기 전에 기준점을 잡습니다. Git을 건드리지 않으므로 변경이 쌓인 상태나 저장소가 없는 폴더에서도 쓸 수 있습니다.
@@ -62,7 +62,7 @@ SemDiff Generated! (~70 Tokens)
`semdiff`는 Python을 읽습니다. 다른 언어는 `cdg diff`를 쓰세요. `cdg mark`를 다시 실행하면 기준점이 지금 시점으로 옮겨 갑니다.
-## 폴더 하나, 또는 질문에 필요한 파일만 보여 주기
+## 폴더 하나, 또는 질문에 필요한 파일만 보여 주기 {#share-one-folder-or-one-question-s-worth-of-files}
작게 시작하고, 요청이 있을 때만 넓혀 갑니다.
diff --git a/site/ko/rust-port.md b/site/ko/rust-port.md
index 3720761..7ec08e4 100644
--- a/site/ko/rust-port.md
+++ b/site/ko/rust-port.md
@@ -105,7 +105,7 @@ Python, MATLAB 말고도 Rust, JavaScript(`.js`, `.jsx`, `.mjs`, `.cjs`), TypeSc
| `scan -y`, 파일 10,000개 | 3,705 ± 38 | 889.4 ± 9.6 | 4.2x |
| `digest`, 파일 10,000개 | 7,811 ± 36 | 838.1 ± 17.3 | 9.3x |
-## Python 빌드와 다른 점
+## Python 빌드와 다른 점 {#differences-from-the-python-build}
- `term --raw`는 새로 생긴 옵션입니다. 둘 이상의 기록을 고르면 출력 사이의 경계가 사라지므로, 이어 붙이지 않고 종료 코드 2로 멈춥니다.
- 구문이 다른 곳에서 깨진 Python 파일도, 파싱되는 부분의 개요는 보여 줍니다. Python 빌드는 이런 파일에 아무것도 보여 주지 않습니다. (코드에 해석할 수 없는 바이트가 있으면 두 빌드 모두 개요가 없습니다.)
diff --git a/site/public/demo-poster.png b/site/public/demo-poster.png
index 5fc2b2a..2fb49f8 100644
Binary files a/site/public/demo-poster.png and b/site/public/demo-poster.png differ
diff --git a/site/public/demo.gif b/site/public/demo.gif
index 5f602a3..f01f3b6 100644
Binary files a/site/public/demo.gif and b/site/public/demo.gif differ