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