Vitrin: ctxman kendi reposunda
Bu sayfadaki her sayı ve çıktı, ctxman'in bu reponun fda35db commit'indeki (2026-10-12) bir klonu üzerinde, tiktoken ile birebir sayılarak çalıştırılmasından gelir. Bunu yapan betik, website/scripts/build-showcase.mjs, CLI'yi, MCP sunucusunu ve REST API'yi çalıştırır. Sayfadaki hiçbir şey elle düzenlenmedi.
- Git'teki her şeyyapılandırma yok1.719.753 token · 506 dosya
- + .contextignorederleme çıktıları ve lock dosyaları hariç967.099 token · 488 dosya
- + .contextincludeyalnız kaynak kod319.165 token · 140 dosya ✓ Claude Sonnet 5.5'in 1M penceresine sığar (%32)
1. Her şeyle başlayın
Hiç yapılandırma yok, yalnızca git'in izlediği dosyalar:
$ ctxman --cli
📊 Total files analyzed: 506
🔢 Total tokens: 1,719,753
💾 Total size: 5.98 MB
📄 Total lines: 192,622
🏆 TOP 5 LARGEST FILES BY TOKEN COUNT:
--------------------------------------------------------------------------------
1. 357,327 tokens (20.8%) - html/assets/index-BUCFJtth.js
💾 1217.9 KB, 📄 40,666 lines
2. 115,914 tokens (6.7%) - package-lock.json
💾 285.0 KB, 📄 8,375 lines
3. 103,364 tokens (6.0%) - desktop-app/package-lock.json
💾 252.7 KB, 📄 7,454 lines
4. 98,301 tokens (5.7%) - docs/coderamp-labs-gitingest-8a5edab282632443.txt
💾 413.1 KB, 📄 12,586 lines
5. 37,380 tokens (2.2%) - html/assets/index-DlhE0rqZ.css
💾 92.1 KB, 📄 3,591 linesTüm token'ların beşte birinden fazlası masaüstü uygulamasının tek bir derlenmiş paketi (html/assets/*.js); sonraki üç kayıt lock dosyaları ve depoya eklenmiş bir metin dökümü. Bunların hiçbiri bir modele kodu anlatmaz.
2. Modele gerekmeyeni çıkarın
.contextignore, .gitignore söz dizimini kullanır. Beş satır derleme çıktılarını ve lock dosyalarını dışarıda bırakır:
# Build output and lockfiles: large, generated, nothing for a model to learn
html/
**/package-lock.json
desktop-app/
docs/*.txt
test-repos/$ ctxman --cli
📊 Total files analyzed: 488
🔢 Total tokens: 967,099
💾 Total size: 3.67 MB
📄 Total lines: 116,685
📈 Average tokens per file: 1,982
🚫 Files ignored by .gitignore: 0
📋 Files ignored by context rules: 181.719.753 → 967.099 token. Bu 1M'lik bir pencereye sığar ama konuşmaya pek yer bırakmaz ve üçte ikisinden fazlası hâlâ dokümantasyon, testler ve web sitesidir.
3. Yalnızca kaynak kodu tutun ve sığıp sığmadığına bakın
.contextinclude mantığı tersine çevirir: yalnızca eşleşenler analiz edilir. --target-model sonucu modelin bağlam penceresiyle karşılaştırır:
lib/**
bin/**
/index.js
/index.d.ts
/package.json
/README.md$ ctxman --cli --target-model claude-sonnet-5-5
📊 Total files analyzed: 140
🔢 Total tokens: 319,165
💾 Total size: 1.22 MB
📄 Total lines: 41,792
📊 Context Window Analysis:
════════════════════════════════════════════════════
Target Model: Claude Sonnet 5.5
Available Context: 1,000,000 tokens
Your Repository: 319,165 tokens (31.9%)
✅ Context usage is within safe limits
💡 Consider excluding these large files:
- bin/cli.js (16,151 tokens, 5.1%)
- README.md (11,821 tokens, 3.7%)
- index.d.ts (9,002 tokens, 2.8%)
Your entire codebase fits comfortably.140 dosya ve 319.165 token: ctxman'in tüm kaynak kodu Claude Sonnet 5.5'in 1M penceresine rahatça sığıyor; başlangıca göre %81 daha az.
Claude kendi tokenizer'ıyla sayar; bu yüzden bir OpenAI kodlamasıyla yapılan sayım yaklaşıktır. ctxman count elinizdeki sayının hangi türden olduğunu ve birebir sayıyı nasıl alacağınızı söyler; OpenAI modelleri için modelin kendi kodlamasını kullanır:
$ ctxman count --model claude-sonnet-5-5 --top 3
Model: Claude Sonnet 5.5 (claude-sonnet-5-5)
Files: 140
Tokens: 319,165 [approximate, tiktoken cl100k_base; Anthropic models use their own tokenizer]
Window: 1,000,000 tokens — 31.9% used, fits
For an exact count: ctxman count --model claude-sonnet-5-5 --api
Largest files:
16,151 bin/cli.js
11,821 README.md
9,002 index.d.ts$ ctxman count --model gpt-5.5 --top 0
Model: GPT-5.5 (gpt-5.5)
Files: 140
Tokens: 321,625 [exact, tiktoken o200k_base]
Window: 1,050,000 tokens — 30.6% used, fitsctxman count --model claude-sonnet-5-5 --api, maskelenmiş metni Anthropic'in ücretsiz count_tokens uç noktasına gönderir ve Claude'un birebir sayısını verir.
4. Aynı bağlam, daha az token
--context-export bağlamı varsayılan olarak JSON yazar; -o toon bunun yerine resmi TOON kodlayıcısını kullanır. İki dışa aktarımın token sayıları:
| Bağlam | JSON | TOON | Tasarruf |
|---|---|---|---|
| Dosya listesi | 1.184 | 838 | %29 |
Metot haritası (-m), 1.444 metot | 39.603 | 14.221 | %64 |
TOON en çok tek tip listelerde kazandırır; her satırında ad, satır ve token sayısı olan bir metot haritası gibi:
$ ctxman --cli --context-export -o toon
project:
root: ctxman
totalFiles: 140
totalTokens: 319165
paths:
"bin/"[14]: cli.js,cm-pack.js,cm-mcp.js,cm-pr.js,cm-map.js,cm-why.js,cm-search.js,cm-count.js,cm-gitingest.js,cm-policy.js,cm-update.js,cm-audit.js,cm-ask.js,mcp-server.js
"/"[4]: README.md,index.d.ts,package.json,index.js
"lib/analyzers/"[9]: token-calculator.js,method-analyzer.js,performance-dashboard.js,dependency-scanner.js,ai-suggester.js,import-tracker.js,unused-exports-detector.js,duplicate-detector.js,go-method-analyzer.js
"lib/pr/"[6]: pr-context.js,pr-renderer.js,related-tests.js,diff-parser.js,pr-git.js,method-mapper.js
"lib/why/"[11]: index.js,render.js,target.js,search.js,references.js,paths.js,git.js,history.js,coupling.js,ownership.js,errors.js
"lib/api/mcp/"[6]: server.js,install.js,resources.js,prompts.js,start.js,sandbox.js
"lib/formatters/"[4]: gitingest-formatter.js,toon-formatter-v1.3.js,format-registry.js,toon-formatter.js
"lib/utils/"[21]: snapshot-manager.js,llm-detector.js,updater.js,context-versioning.js,tokenizer-adapter.js,git-utils.js,format-converter.js,template-manager.js,profile-manager.js,messages.js,multi-repo-manager.js,llm-cost-estimator.js,logger.js,token-utils.js,claude-token-counter.js,file-utils.js,error-handler.js,config-utils.js,secret-redactor.js,clipboard-utils.js,cli-output.js
"lib/map/"[6]: resolver.js,render.js,rank.js,graph.js,imports.js,index.js
"lib/pack/"[7]: compress.js,code-lexer.js,index.js,split.js,select.js,budget.js,tree.js
"lib/policy/"[5]: policy.js,audit.js,ignore-files.js,enforce.js,index.js
"lib/search/"[3]: bm25.js,code-units.js,symbols.js
"lib/ui/"[7]: init-wizard-ui.js,wizard.js,dashboard.js,progress-bar.js,template-selector.js,select-input.js,index.js
…5. Bir modülün metot haritası
-m ile her metot satır numarası ve kendi token sayısıyla gelir. Burada yalnızca dört çekirdek modül:
lib/core/**$ ctxman --cli -m --context-export -o toon
project:
root: ctxman
totalFiles: 4
totalTokens: 6501
methods:
"lib/core/Analyzer.js"[10]{name,line,tokens}:
constructor,15,54
initStats,27,64
analyze,40,87
analyzeSequential,57,61
analyzeFile,71,253
updateStats,110,218
detectLanguage,142,162
getStats,167,14
reset,171,14
getLanguageDistribution,175,67
"lib/core/ContextBuilder.js"[12]{name,line,tokens}:
constructor,19,66
build,36,161
buildMetadata,68,97
buildFileList,89,125
buildMethodList,118,92
applySmartFiltering,141,201
prioritizeFiles,173,235
calculateCoreScore,211,171
calculateBalancedScore,237,50
optimizeForLLM,248,192
generateCompactPaths,282,58
getSummary,298,150
"lib/core/Reporter.js"[9]{name,line,tokens}:
constructor,21,50
report,38,91
…Modülün haritasının tamamı 435 token.
6. Yalnızca değişenler
--changed-since, herhangi bir çalıştırmayı bir daldan, etiketten veya commit'ten bu yana değişen dosyalarla sınırlar; örneğin bir pull request'in tabanından:
$ ctxman --cli --changed-since HEAD~10
📝 Found 32 changed files
Since: HEAD~10
Impact: CRITICAL (score: 188)
📊 Total files analyzed: 32
🔢 Total tokens: 125,809
💾 Total size: 0.48 MB
📄 Total lines: 13,7757. 700 token'da repo haritası
ctxman map, dosyaları import grafiği üzerinde PageRank, son git hareketleri ve sembol referanslarına göre sıralar; bütçe dolana kadar her dosyanın fonksiyonlarını satır ve token sayısıyla listeler:
$ ctxman map --tokens 700
lib/utils/logger.js (score 0.875, 1714 tokens)
11: constructor(options = {}) [293 tok]
52: initializeLogDirectory() [131 tok]
72: getDateString() [51 tok]
80: getTimestamp() [14 tok]
87: shouldLog(level) [20 tok]
94: formatMessage(level, message, meta = {}) [128 tok]
111: writeToFile(message) [109 tok]
129: log(level, message, meta = {}) [76 tok]
146: error(message, meta = {}) [20 tok]
150: warn(message, meta = {}) [20 tok]
154: info(message, meta = {}) [20 tok]
158: debug(message, meta = {}) [20 tok]
162: trace(message, meta = {}) [20 tok]
169: custom(icon, level, message, meta = {}) [49 tok]
179: group(title) [35 tok]
186: groupEnd() [34 tok]
196: time(label) [24 tok]
201: timeEnd(label) [26 tok]
209: clearOldLogs(daysToKeep = 7) [194 tok]
238: getLogFilePath() [44 tok]
247: getRecentLogs(lines = 100) [104 tok]
270: function getLogger(options = {}) [29 tok]
280: function createLogger(options = {}) [14 tok]
lib/parsers/gitignore-parser.js (score 0.590, 1052 tokens)
9: constructor(gitignorePath, contextIgnorePath, contextIncludePath) [64 tok]
18: loadPatterns(gitignorePath, contextIgnorePath, contextIncludePath) [169 tok]
35: parsePatternFile(filePath) [145 tok]
56: convertToRegex(pattern) [253 tok]
80: isIgnored(filePath, relativePath) [182 tok]
105: isDirectory(filePath) [59 tok]
114: testPatterns(patterns, relativePath, reason) [69 tok]
125: testPatternsWithNegation(patterns, relativePath) [70 tok]
lib/utils/file-utils.js (score 0.418, 949 tokens)
26: static isText(filePath) [243 tok]
82: static isCode(filePath) [149 tok]
113: static getType(filePath) [209 tok]
158: static isSkippedDirectory(name) [21 tok]
167: static getExtension(filePath) [34 tok]
lib/analyzers/go-method-analyzer.js (score 0.381, 1056 tokens)
9: extractMethods(content, filePath) [385 tok]
60: getLineNumber(content, index) [25 tok]
64: isInComment(content, index) [175 tok]
87: isKeyword(name) [230 tok]
140: extractMethodContent(content, methodName) [205 tok]
index.js (score 0.248, 574 tokens)
test/format-converter.test.js (score 0.170, 1286 tokens)
24: FormatRegistry.mockImplementation(function () [16 tok]8. Bir commit için inceleme bağlamı
ctxman pr, bir dal veya commit aralığı hakkında inceleyicinin ihtiyaç duyduğunu yazar: özet, commit mesajları, değişen dosyalar, değişen her metodun kaynağı, diff ve ilgili testler; --budget altında kalmak için en az önemli kısımları çıkarır. Burada ctxman count'u ekleyen commit için (sayfa kısa kalsın diye diff hariç):
$ ctxman pr --base 805d404~1 --head 805d404 --no-diff --budget 2500
# Pull request context: `805d404` into `805d404~1`
## Summary
- Base: 805d404~1 (cf6d566)
- Head: 805d404 (805d404)
- Merge base: cf6d566
- Commits: 1
- Files changed: 12 (7 modified, 5 added), +744 -28 lines
- Changed methods: 39 (23 added, 16 modified); deleted methods: 0
- Related tests: 27
- Impact (heuristic): critical
- Tokens: ~2,412 total; summary 229, commits 416, files 234, methods 1,533
- Diff: not included (--no-diff)
- Budget: 2,500 tokens; dropped: 27 related test path(s); source of 22 changed method(s) (bin/cli.js:printHelp, bin/cli.js:main, lib/count/index.js:countForModel, bin/cm-count.js:printResult, lib/analyzers/token-calculator.js:printHeader, +17 more)
## Commits (1)
### `805d404` feat(count): count tokens with each model's encoding, exact via api
Claude, 2026-10-09
> Every count used cl100k_base, which is GPT-4's encoding: OpenAI models
> since GPT-4o use o200k_base, and Claude, Gemini and the other vendors
> use their own tokenizers, so the "Exact" label was only true for GPT-4.
>
> - --target-model picks the tiktoken encoding: o200k_base for GPT-4o,
> GPT-4.1, GPT-5, GPT-6 and o-series models, cl100k_base otherwise.
> - Labels say when a count only approximates the model's tokenizer
> (Claude, Gemini and other vendors, GPT-6 whose encoding is
> unpublished, and the estimation fallback, which was labelled "Exact").
> The @anthropic-ai/tokenizer package is the Claude 2 tokenizer and is
> now labelled as an approximation.
> - New `ctxman count [path|-] --model ID [--api] [--json]`: counts a
> project or piped text for a model and checks it against the window.
> With --api it counts Claude models exactly through Anthropic's
> count_tokens endpoint (free, nothing generated; needs the
> @anthropic-ai/sdk package and ANTHROPIC_API_KEY), batching files into
> as few requests as possible and redacting secrets before sending.
> - tiktoken moves to dependencies so a plain `npm install ctxman` counts
> exactly instead of estimating.
>
> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
> Claude-Session: https://claude.ai/code/session_014PDhYwtj4A1a2USJPtyAYG
## Changed files (12)
| Status | File | + | - |
| --- | --- | ---: | ---: |
| modified | `bin/cli.js` | 7 | 0 |
| added | `bin/cm-count.js` | 147 | 0 |
| modified | `lib/analyzers/token-calculator.js` | 18 | 3 |
| added | `lib/count/index.js` | 100 | 0 |
| added | `lib/utils/claude-token-counter.js` | 151 | 0 |
| modified | `lib/utils/token-utils.js` | 37 | 8 |
| modified | `lib/utils/tokenizer-adapter.js` | 60 | 14 |
| modified | `package-lock.json` | 1 | 2 |
| modified | `package.json` | 1 | 1 |
| added | `test/count-command.test.js` | 163 | 0 |
| modified | `test/token-calculator-coverage.test.js` | 1 | 0 |
| added | `test/tokenizer-encoding.test.js` | 58 | 0 |
…9. Bütçe içinde dosya içerikleri
ctxman pack, dosyaların kendisini bir model için tek belge olarak yazar: önce ağaç, sonra her dosya, en sonda talimatlarınız. --compress ile yalnızca imzalar kalır ve fonksiyon gövdeleri tek satırlık bir yer tutucuya dönüşür; --budget, bütçeyi ctxman mapın en üst sıraya koyduğu dosyalarla doldurur. Burada dört çekirdek modül 1.885 token'da:
$ ctxman pack --compress --budget 3000 --style markdown
## Directory structure
```
lib/
core/
Analyzer.js
ContextBuilder.js
Reporter.js
Scanner.js
```
## Files
### lib/core/Analyzer.js
```javascript
/**
* Analyzer - Token & Method Analysis Module
* v3.0.0 - Modular architecture
*/
import fs from 'fs';
import TokenUtils from '../utils/token-utils.js';
import FileUtils from '../utils/file-utils.js';
import MethodAnalyzer from '../analyzers/method-analyzer.js';
import { getLogger } from '../utils/logger.js';
const logger = getLogger('Analyzer');
export class Analyzer {
constructor(options = {}) { /* … 9 lines */ }
initStats() { /* … 10 lines */ }
async analyze(files) { /* … 14 lines */ }
async analyzeSequential(files) { /* … 11 lines */ }
async analyzeFile(fileInfo) { /* … 36 lines */ }
updateStats(analysis) { /* … 29 lines */ }
detectLanguage(extension) { /* … 22 lines */ }
getStats() { /* … 1 line */ }
reset() { /* … 1 line */ }
…10. Kod neden böyle?
ctxman why, git'in ve reponun bir fonksiyon hakkında kaydettiklerini toplar: satırlarını değiştiren commit'ler tam mesajlarıyla, içlerindeki referanslar, sahipler, onunla birlikte değişen dosyalar, notlar ve testler. Hiçbir şey makineden çıkmaz:
$ ctxman why lib/integrations/git/GitClient.js:isValidGitRef --budget 1800 --limit 3
# Why: `isValidGitRef` in `lib/integrations/git/GitClient.js`
Context for explaining why this code looks the way it does, collected by `ctxman why` from the local git history and the repository (no network).
## Target
- File: `lib/integrations/git/GitClient.js`
- Symbol: `isValidGitRef` (function, declared on line 26)
- Lines: 19-28 of 354
- Revision: working tree (HEAD fda35dbdc7dc)
```javascript
/**
* Check that a user-supplied revision (branch, tag, commit, HEAD~2, a..b) is safe to
* hand to git: allowlisted characters only, and no leading '-' that git would parse
* as an option (e.g. --output=<file>)
* @param {string} ref
* @returns {boolean}
*/
export function isValidGitRef(ref) {
return typeof ref === 'string' && !ref.startsWith('-') && /^[a-zA-Z0-9/\-_.@^~]+$/.test(ref);
}
```
## History
1 commit that changed lines 19-28 (`git log -L`), newest first.
### 1. fix(git): run git without a shell and validate user-supplied refs
`6939d13` · 2026-10-06 · Claude
> GitClient.exec() built a command line and ran it through execSync, so
> any git ref was parsed by /bin/sh. Its only guard rejected ';' and '&'.
> Refs reach it from untrusted input:
> - REST GET /api/v1/diff?since=. The server binds to localhost, has no
> auth token by default and sends CORS *, so a web page can issue the
> request.
> - The MCP git_diff tool's `branch` argument, which a model controls.
> - `--changed-since`.
> `ctxman github` also interpolated the URL's owner/repo/branch into a
> `git clone` command line.
>
> - GitClient.exec() now takes an argument array and uses
> execFileSync('git', args): no shell, arguments reach git verbatim.
> File paths go after `--`.
> - New isValidGitRef()/assertGitRef(). They allowlist ref characters
> and reject a leading '-', so a ref cannot become a git option such as
> --output. getChangedFiles, DiffAnalyzer.getFileDiff,
> compareBranches and getRangeStats validate before running git.
> - REST answers 400 for an invalid `since`. MCP git_diff returns
> isError for an invalid ref or a git failure instead of plain text.
> - GitUtils.cloneRepository validates the branch and runs
> `git clone ... -- <url> <dir>` via execFileSync.
>
> The new test/git-ref-injection.test.js uses a real temp repository. It
> feeds hostile refs (shell substitution, pipes, newlines, option
> injection) to GitClient, DiffAnalyzer and the REST endpoint, and
> checks that nothing runs and normal refs still work. Four of its five
> cases fail before this change. Existing unit tests are updated for the
> argv call shape.
>
> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
> Claude-Session: https://claude.ai/code/session_014PDhYwtj4A1a2USJPtyAYG
## References
- URL https://claude.ai/code/session_014PDhYwtj4A1a2USJPtyAYG (6939d13)
- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (6939d13)
…11. Sırlar özete girmez
Bir yapılandırma dosyasında kimlik bilgisi unutulmuş küçük bir proje (iki anahtar da sahte):
// Left here during a late-night debugging session
export const s3 = { region: 'eu-west-1', accessKeyId: 'AKIAABCDEFGHIJKLMNOP' };
export const github = { token: 'ghp_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8' };$ ctxman --cli --gitingest
🔒 Redacted secrets: 1 aws-access-key-id, 1 github-token (disable with --no-redact)
📜 Context version created: ctx-v001
Files: 2
Tokens: 109================================================
FILE: src/config.js
================================================
// Left here during a late-night debugging session
export const s3 = { region: 'eu-west-1', accessKeyId: '[REDACTED:aws-access-key-id]' };
export const github = { token: '[REDACTED:github-token]' };Bilinen biçimler (AWS, GitHub, GitLab, Slack, Stripe, Google, OpenAI ve Anthropic anahtarları, PEM özel anahtarları) varsayılan olarak maskelenir; --no-redact onları korur.
12. MCP ile sorun
ctxman mcp, stdio üzerinden Model Context Protocol konuşur; Claude Desktop, Claude Code, Cursor ve diğer MCP istemcileri ctxman'i doğrudan çağırabilir. ctxman mcp install --client claude-desktop onu istemcinin yapılandırmasına ekler; --npx ile yazdığı kayıt şudur:
{
"mcpServers": {
"ctxman": {
"command": "npx",
"args": [
"-y",
"ctxman",
"mcp"
]
}
}
}Sunucu 11 araç sunar — analyze_codebase, generate_context, git_diff, search_code, list_methods, repo_map, pr_context, get_symbol, count_tokens, explain_history, pack_context — ayrıca dosya kaynakları ve prompt'lar. İstemcinin gönderdiği ve ctxman'in yanıtladığı haliyle bir list_methods çağrısı:
{
"name": "list_methods",
"arguments": {
"path": "~/ctxman",
"file": "lib/core/ContextBuilder.js"
}
}[
{
"file": "lib/core/ContextBuilder.js",
"methods": [
{
"name": "constructor",
"line": 19,
"tokens": 66
},
{
"name": "build",
"line": 36,
"tokens": 161
},
{
"name": "buildMetadata",
"line": 68,
"tokens": 97
},
{
"name": "buildFileList",
"line": 89,
"tokens": 125
},
{
"name": "buildMethodList",
"line": 118,
"tokens": 92
},
{
"name": "applySmartFiltering",
"line": 141,
"tokens": 201
},
{
"name": "prioritizeFiles",
"line": 173,
"tokens": 235
},
{
"name": "calculateCoreScore",
"line": 211,
"tokens": 171
},
{
"name": "calculateBalancedScore",
"line": 237,
"tokens": 50
},
{
"name": "optimizeForLLM",
"line": 248,
"tokens": 192
},
{
"name": "generateCompactPaths",
"line": 282,
"tokens": 58
},
{
"name": "getSummary",
"line": 298,
"tokens": 150
}
]
}
]13. REST üzerinden kesin token bütçesi
ctxman serve yerel bir REST API başlatır. targetTokens ile POST /api/v1/context, bütçeyi en üst sıradaki dosyalarla (önce çekirdek kod) doldurur ve asla aşmaz:
$ curl -s localhost:3000/api/v1/context -H 'Content-Type: application/json' \
-d '{"path": "~/ctxman", "targetTokens": 30000}'
tutulan: 12/140 dosya, 29.989/319.165 token
6.104 lib/why/index.js
2.050 lib/core/ContextBuilder.js
1.996 lib/core/Reporter.js
1.376 lib/core/Scanner.js
1.079 lib/core/Analyzer.js
3.315 lib/pack/index.js
…Bu sayfayı yeniden üretin
npm ci
node website/scripts/build-showcase.mjsBetik repoyu geçici bir klasöre klonlar, yukarıdaki her adımı çalıştırır ve bu sayfanın ve ana sayfanın okuduğu website/.vitepress/data/showcase.json dosyasını yazar.