Skip to content

Latest commit

ย 

History

History
566 lines (403 loc) ยท 33 KB

File metadata and controls

566 lines (403 loc) ยท 33 KB

CodeScan

English ยท ํ•œ๊ตญ์–ด

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํด๋ž˜์Šค:๋ฉ”์„œ๋“œ ๋‹จ์œ„๋กœ ๋ถ„์„ํ•˜๊ณ  git blame์„ ํ•จ๊ป˜ ๋ฌถ์–ด ๋กœ์ปฌ SQLite์— ํ’€ํ…์ŠคํŠธ + ๊ทธ๋ž˜ํ”„ ์ธ๋ฑ์Šค๋กœ ์ €์žฅํ•œ ๋’ค, CLI / TUI / ๋กœ์ปฌ ์›น GUI ์„ธ ๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๋น ๋ฅธ ์ฝ”๋“œ ์Šค์บ๋„ˆ & ์ธ๋ฑ์„œ์ž…๋‹ˆ๋‹ค.

.NET 10.0 ๊ธฐ๋ฐ˜ Native AOT ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

CodeScan ํžˆ์–ด๋กœ ์นด๋“œ

๊ธฐ๋Šฅ

  • ๋‹ค๊ตญ์–ด ๋ถ„์„ โ€” ์ผ๋ฐ˜์ ์ธ ์†Œ์Šค ์–ธ์–ด์—์„œ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ์ฃผ์„, ์˜์กด์„ฑ ํžŒํŠธ๋ฅผ ์ถ”์ถœ
  • Git blame ํ†ตํ•ฉ โ€” ๊ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ตœ์ข… ์ž‘์„ฑ์ž, ์ž‘์„ฑ์ผ, ์ปค๋ฐ‹๊ณผ ์—ฐ๊ฒฐ
  • ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ โ€” Trigram ํ† ํฌ๋‚˜์ด์ € ๊ธฐ๋ฐ˜ FTS5๋กœ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๋ฐ CJK(ํ•œยท์ค‘ยท์ผ) ์–ธ์–ด ์ง€์›
  • ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰ โ€” ์ธ๋ฑ์‹ฑ๋œ DB ๊ฒ€์ƒ‰๊ณผ ๋ผ์ด๋ธŒ git log --grep ๊ฒฐ๊ณผ๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œ
  • ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰ โ€” Neo4j ์Šคํƒ€์ผ์˜ ์†Œ์Šค ์ง€์‹ ๊ทธ๋ž˜ํ”„๋ฅผ ์ž„๋ฒ ๋””๋“œ SQLite์— ์ €์žฅ
  • Cypher-like ๊ทธ๋ž˜ํ”„ ์งˆ์˜ โ€” ๊ตฌ์กฐํ™”๋œ ๊ทธ๋ž˜ํ”„ ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์•ˆ์ „ํ•œ MATCH ... WHERE ... LIMIT ... ์„œ๋ธŒ์…‹
  • ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ โ€” ์ •๊ทœ์‹ ๊ธฐ๋ฐ˜ ์˜์กด์„ฑ ์—ฃ์ง€๋ฅผ 1์ฐจ๋กœ ์ƒ์„ฑํ•˜๊ณ , ํ–ฅํ›„ ์˜๋ฏธ ๋ถ„์„์„ ์œ„ํ•œ ์–ธ์–ด/ํ”„๋กœ์ ํŠธ ๋ฉ”ํƒ€ ํ”„๋กœ๋ธŒ ํฌํ•จ
  • ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ TUI โ€” Terminal.Gui v2 ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ƒ‰, ์Šค์บ”, ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰, ๊ทธ๋ž˜ํ”„ ์งˆ์˜ ๊ฐ€๋Šฅ
  • ๋กœ์ปฌ ์›น GUI โ€” ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰/์งˆ์˜, 2D ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ์นด๋ฉ”๋ผ ์ œ์–ด ๊ฐ€๋Šฅํ•œ 3D ๋ทฐ. ๊ธฐ๋ณธ ํฌํŠธ 8085
  • ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ โ€” ์ธ๋ฑ์‹ฑ๋œ ํ”„๋กœ์ ํŠธ์˜ ๋“ฑ๋ก, ์„ค๋ช…, ๊ฐฑ์‹ , ์‚ญ์ œ
  • ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ โ€” Native AOT ์ปดํŒŒ์ผ, ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ ๋ถˆํ•„์š”

์Šคํฌ๋ฆฐ์ƒท

์›น GUI ๊ทธ๋ž˜ํ”„ ๋ทฐ์–ด

๋กœ์ปฌ GUI๋Š” ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰, ๋…ธ๋“œ/์—ฃ์ง€ ๋””ํ…Œ์ผ ์กฐํšŒ, 2D ๊ทธ๋ž˜ํ”„ ์ปจํŠธ๋กค, ์นด๋ฉ”๋ผ ์ œ์–ดํ˜• 3D ๊ทธ๋ž˜ํ”„ ๋ทฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

CodeScan GUI ๊ทธ๋ž˜ํ”„ ๋ทฐ์–ด

ํ„ฐ๋ฏธ๋„ UI

TUI์—์„œ ํ”„๋กœ์ ํŠธ ํƒ์ƒ‰, ์Šค์บ”, ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ, ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰์„ ํ„ฐ๋ฏธ๋„๋งŒ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CodeScan TUI ํ™ˆ

TUI ์Šค์บ” ํ”Œ๋กœ์šฐ

ํ„ฐ๋ฏธ๋„ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฉ”์„œ๋“œ/์ฃผ์„ ์ถ”์ถœ, git blame ๋ณด๊ฐ•, DB ๊ทธ๋ž˜ํ”„ ์ธ๋ฑ์‹ฑ์„ ํฌํ•จํ•œ ์Šค์บ”์„ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CodeScan TUI ์Šค์บ”

TUI ChatMode (์‹คํ—˜ ๊ฐœ๋ฐœ ์ค‘)

Claude๋‚˜ Codex๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์“ฐ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ถ„๋ช…ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค โ€” ํ์‡„๋ง, ๋ณด์•ˆ์ด ๊ฐ•ํ•œ ๊ฒฉ๋ฆฌ๋œ ๊ณต๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ํ•ต์‹ฌ AI ๋ฒค๋”์˜ ์žฅ์• . ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋„ CodeScan์˜ ์ฝ”๋“œ ๋ถ„์„ ํ™œ๋™์€ ๋ฉˆ์ถ”์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TUI ChatMode๋Š” Gemma 4 ๋ชจ๋ธ์„ ์™„์ „ํžˆ ์˜จ๋””๋ฐ”์ด์Šค + CPU ์ „์šฉ์œผ๋กœ ๊ตฌ๋™ํ•˜๋ฉด์„œ CodeScan์˜ SQLite ์ธ๋ฑ์Šค์— JSON ํˆด์ฝœ ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฝ๋‹ˆ๋‹ค. CPU๊ฐ€ ์ž‘๋™ํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๊ณ„์† ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CodeScan TUI ChatMode

  • ์˜คํ”„๋ผ์ธ ์„ค๊ณ„ โ€” ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ ์—†์Œ. ๋ชจ๋ธ GGUF๋Š” ~/.codescan/models/์— ๋‘๊ณ , ์—์ด์ „ํŠธ ๋ฃจํ”„๋Š” ๋กœ์ปฌ ์ธ๋ฑ์Šค์™€ ๋กœ์ปฌ ํŒŒ์ผ์‹œ์Šคํ…œ์—๋งŒ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
  • CPU ์ „์šฉ, ๋ฉ€ํ‹ฐ OS โ€” Native AOT ๊ทธ๋Œ€๋กœ ์œ ์ง€. GPU / ๋“œ๋ผ์ด๋ฒ„ / ๋ฒค๋” SDK ๋ชจ๋‘ ๋ถˆํ•„์š”.
  • ํˆด ์‚ฌ์šฉ ์—์ด์ „ํŠธ โ€” Gemma๋Š” ๋งค ํ„ด GBNF ์ œ์•ฝ JSON์„ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค (db_search / read_file / grep_file / list_projects / project_info / graph_query / done). ๋ชจ๋ธ์ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ถ”์ธกํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ๋“ค์—ฌ๋‹ค๋ด…๋‹ˆ๋‹ค.
  • ํฌ๋ Œ์‹ ์„ธ์…˜ ๋กœ๊ทธ โ€” ๋ชจ๋“  ์ฑ„ํŒ… ์„ธ์…˜์ด ~/.codescan/logs/chat-YYYYMMDD_HHmmss.log์— raw ๋ชจ๋ธ ์ถœ๋ ฅ๊นŒ์ง€ ๊ธฐ๋ก๋ผ ์ถ”ํ›„ ๋ถ„์„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ: ์ด ํ‘œ๋ฉด์€ ์˜จ๋””๋ฐ”์ด์Šค SLM ํ๋ฆ„์— ๋งž์ถฐ ์ ๊ทน์ ์œผ๋กœ ์ง„ํ™” ์ค‘์ž…๋‹ˆ๋‹ค (ํ•˜๋‹จ Why AOT? โ€” Edge AI ํŠธ๋ Œ๋“œ์™€ ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๊ฐ€์น˜ ์ฐธ์กฐ). ์‹ค์ œ ์„ธ์…˜์—์„œ ์–ป๋Š” ํ•™์Šต์— ๋”ฐ๋ผ ๋™์ž‘๊ณผ ํˆด ์นดํƒˆ๋กœ๊ทธ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์› ์–ธ์–ด

์–ธ์–ด ํ™•์žฅ์ž ํด๋ž˜์Šค/ํƒ€์ž… ์ธ์‹ ๋ฉ”์„œ๋“œ ์ธ์‹ ์˜์กด์„ฑ ํžŒํŠธ
C# .cs class / struct / record / interface ์ ‘๊ทผ์ž + ๋ฐ˜ํ™˜ํ˜• + ์ด๋ฆ„ using, ์ƒ์†/์ธํ„ฐํŽ˜์ด์Šค, new, ํƒ€์ž… ์‚ฌ์šฉ
Java .java class / interface / enum ์ ‘๊ทผ์ž + ๋ฐ˜ํ™˜ํ˜• + ์ด๋ฆ„ import, extends/implements, new, ํƒ€์ž… ์‚ฌ์šฉ
Kotlin .kt, .kts class / object / data class / sealed class fun / suspend fun import, ๊ธฐ๋ฐ˜ ํƒ€์ž…, ์ƒ์„ฑ์ž/ํƒ€์ž… ์‚ฌ์šฉ
JavaScript .js, .jsx class function / arrow / const / export import, extends/implements ๋ฅ˜ ํžŒํŠธ, new, ํƒ€์ž… ์œ ์‚ฌ ์‚ฌ์šฉ
TypeScript .ts, .tsx class function / arrow / const / export import, extends/implements, new, ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜
PHP .php class / interface / trait function use, extends/implements, new, ํƒ€์ž… ํžŒํŠธ
Python .py class (๋“ค์—ฌ์“ฐ๊ธฐ ๊ธฐ๋ฐ˜) def / async def (๋“ค์—ฌ์“ฐ๊ธฐ ๊ธฐ๋ฐ˜) import, ๋ฒ ์ด์Šค ํด๋ž˜์Šค, ์ƒ์„ฑ์ž ์œ ์‚ฌ ํ˜ธ์ถœ
Go .go type struct/interface ๊ทธ๋ž˜ํ”„ ์˜์กด์„ฑ ์Šค์บ”๋งŒ import, ์ƒ์„ฑ์ž/ํƒ€์ž… ์‚ฌ์šฉ
Rust .rs struct / enum / trait ๊ทธ๋ž˜ํ”„ ์˜์กด์„ฑ ์Šค์บ”๋งŒ use, ์—ฐ๊ด€ ์ƒ์„ฑ์ž/ํƒ€์ž… ์‚ฌ์šฉ
C/C++ .c, .cc, .cpp, .cxx, .h, .hpp, .hh, .hxx class / struct ๊ทธ๋ž˜ํ”„ ์˜์กด์„ฑ ์Šค์บ”๋งŒ include, ์ƒ์†, new, ํƒ€์ž… ์‚ฌ์šฉ

์„ค์น˜

CodeScan ๋ฉ€ํ‹ฐ OS ๋ฆด๋ฆฌ์ฆˆ ํŒŒ์ดํ”„๋ผ์ธ โ€” win-x64, linux-x64, linux-arm64, osx-arm64 + SBOM + GitHub Release

ํ•˜๋‚˜์˜ ๋ฆด๋ฆฌ์ฆˆ ํŒŒ์ดํ”„๋ผ์ธ โ†’ ๋„ค ๊ฐœ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ โ†’ ์„ธ ๊ฐœ์˜ ํŒจํ‚ค์ง€ ์ฑ„๋„. GitHub Actions release.yml

๊ฐ„ํŽธ ์„ค์น˜ โ€” OS๋ณ„ ํ•œ ์ค„

OS ์•„ํ‚คํ…์ฒ˜ ์ฃผ ๋ช…๋ น ๋Œ€์ฒด
Windows x64 winget install psmon.CodeScan npm install -g @webnori/codescan-cli (Node ์ด๋ฏธ ์žˆ์„ ๋•Œ)
macOS arm64 (Apple Silicon) brew install psmon/codescan/codescan โ€”
Linux x64 / arm64 npm install -g @webnori/codescan-cli โ€”

โš  ์ค‘์š”: ๋ฐ˜๋“œ์‹œ ์Šค์ฝ”ํ”„ ๋ถ™์€ @webnori/codescan-cli๋กœ ์„ค์น˜ํ•˜์„ธ์š”. ์šฐ๋ฆฌ๊ฐ€ publishํ•˜๊ธฐ ์ „์— ๋ฌด๊ด€ํ•œ ์ œ3์ž๊ฐ€ npm์—์„œ ์งง์€ ์ด๋ฆ„ codescan-cli๋ฅผ ์„ ์ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํŒจํ‚ค์ง€๋Š” ESM/CJS ์ถฉ๋Œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด codescan ์‹คํ–‰ ์ฆ‰์‹œ ์ฃฝ์œผ๋ฉฐ CodeScan๊ณผ๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ๋จผ์ € npm uninstall -g codescan-cli๋กœ ์ œ๊ฑฐํ•˜๊ณ  ์œ„์˜ @webnori/codescan-cli๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”.

์„ค์น˜ ํ›„ ํ™•์ธ:

codescan --version   # codescan v0.5.0 (๋˜๋Š” ๊ทธ ์ด์ƒ) ์ถœ๋ ฅ
codescan --help

์ฑ„๋„ ์ƒํƒœ (v1) GitHub Release ํŒŒ์ดํ”„๋ผ์ธ์€ ์ด๋ฏธ ๊ฐ€๋™ ์ค‘์ด๊ณ  ๋ชจ๋“  ์ฑ„๋„์ด ๊ฐ€์ ธ๊ฐˆ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ยท Homebrew tap โ€” psmon/homebrew-codescan์— ๋ผ์ด๋ธŒ. Apple Silicon Mac์—์„œ brew tap psmon/codescan && brew install codescan ๋ฐ”๋กœ ๋™์ž‘. ยท winget โ€” ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” packaging/winget/manifests/p/psmon/CodeScan/์— ์ค€๋น„๋จ. microsoft/winget-pkgs PR ๋จธ์ง€ ๋Œ€๊ธฐ ์ค‘. ๋จธ์ง€ ์ „๊นŒ์ง€๋Š” ์•„๋ž˜ Windows์—์„œ winget ๋กœ์ปฌ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆ. ยท npm (@webnori/codescan-cli) โ€” ํŒจํ‚ค์ง€๋Š” packaging/npm/codescan-cli/์— ์ค€๋น„๋จ. npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ publish ๋Œ€๊ธฐ ์ค‘. ์งง์€ ์ด๋ฆ„ codescan-cli๋Š” ๋ฌด๊ด€ํ•œ ์ œ3์ž๊ฐ€ ์ ์œ  ์ค‘์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์œ„์˜ ์Šค์ฝ”ํ”„ ๋ถ™์€ ์ด๋ฆ„์„ ์‚ฌ์šฉ. ์ฑ„๋„๋“ค์ด ์ •์‹ ๊ณต๊ฐœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•„๋ž˜ ์ง์ ‘ ์ธ์Šคํ†จ๋Ÿฌ๋ฅผ ์˜ค๋Š˜ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Windows์—์„œ winget ๋กœ์ปฌ ํ…Œ์ŠคํŠธ

winget ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ๋ชจ๋“  ๋ฆด๋ฆฌ์ฆˆ๋งˆ๋‹ค ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. microsoft/winget-pkgs์— PR์ด ๋จธ์ง€๋˜๊ธฐ ์ „์ด๋ผ๋„ ๋กœ์ปฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ๋กœ ์„ค์น˜๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, winget์€ ๋ณด์•ˆ์ƒ ์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ง‰์•„๋‘ก๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ๊ถŒํ•œ PowerShell์—์„œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰:

winget settings --enable LocalManifestFiles

์ผ  ๋’ค์—๋Š” ์ผ๋ฐ˜ ๊ถŒํ•œ์œผ๋กœ ์ €์žฅ์†Œ ์•ˆ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ๋ฐ”๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ์ด ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•œ ๊ณณ์—์„œ
winget install --manifest packaging\winget\manifests\p\psmon\CodeScan\0.5.0
codescan --version

์ด๊ฑด ์ž„์˜์˜ yaml๋กœ ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋˜๋Š” ๊ฑธ ๋ง‰๋Š” winget์˜ ์•ˆ์ „ ๊ฐ€๋“œ์ž…๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ์ผœ๋‘๋ฉด ์–ด๋–ค ๋กœ์ปฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋“  ์„ค์น˜/๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋„๋ ค๋ฉด: winget settings --disable LocalManifestFiles (๊ด€๋ฆฌ์ž).

์™œ ์ด ์ฑ„๋„๋“ค์ธ๊ฐ€?

  • winget (Windows) โ€” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์˜ ํ‘œ์ค€ Windows ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €. portable ์„ค์น˜, ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ๋ถˆํ•„์š”, PATH ์ž๋™ ์ฒ˜๋ฆฌ.
  • Homebrew (macOS) โ€” macOS ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์ธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €. v1์€ arm64(Apple Silicon)๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Intel Mac ์‚ฌ์šฉ์ž๋Š” ์†Œ์Šค์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ Rosetta๋กœ arm64 ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”. Intel Mac ์ •์‹ ์ง€์›์€ v2 ๊ฒ€ํ†  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • npm (Linux + Windows ๋Œ€์ฒด) โ€” apt/dnf/snap ๋Œ€์‹  npm์„ ์„ ํƒํ•œ ์ด์œ ๋Š” npm์ด ๋ชจ๋“  Linux ๋ฐฐํฌํŒ์—์„œ ํ†ต์šฉ๋˜๊ณ , CodeScan ๋ฆด๋ฆฌ์ฆˆ ํŒŒ์ดํ”„๋ผ์ธ์ด ํ•˜๋‚˜์˜ ๋ž˜ํผ ํŒจํ‚ค์ง€๋กœ ๋„ค ๊ฐœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ (linux-x64, linux-arm64, osx-arm64, win-x64) ๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. npm ํŒจํ‚ค์ง€๋Š” postinstall์—์„œ GitHub Releases์˜ ์ ์ ˆํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์–‡์€ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. Windows ์—์„œ๋Š” winget ์ด ์—ฌ์ „ํžˆ ๊ถŒ์žฅ ๊ฒฝ๋กœ (Node.js ๋ถˆํ•„์š”) ์ง€๋งŒ, Node ์ด๋ฏธ ์žˆ๊ณ  ๋‹จ์ผ npm install -g @webnori/codescan-cli ๋กœ ํˆด์ฒด์ธ ํ†ต์ผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ํŒจํ‚ค์ง€๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์Šค์ฝ”ํ”„ ๋ถ™์€ @webnori/codescan-cli ์ด๋ฆ„์„ ์‚ฌ์šฉ โ€” ์งง์€ codescan-cli ์ด๋ฆ„์€ ๋ฌด๊ด€ํ•œ ์ œ3์ž(์„ค์น˜ ์ฆ‰์‹œ ๊นจ์ง€๋Š” ํŒจํ‚ค์ง€)๊ฐ€ ์„ ์  ์ค‘์ž…๋‹ˆ๋‹ค. Linux arm64๋Š” ์˜๋„๋œ 1๊ธ‰ ํƒ€๊นƒ โ€” README ํ•˜๋‹จ์˜ Why AOT? โ€” Edge AI ํŠธ๋ Œ๋“œ์™€ ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๊ฐ€์น˜์—์„œ arm64 SBC(Raspberry Pi / Jetson / Latte Panda) ๋ฐฐํฌ๊ฐ€ ์™œ ์ด ๋„๊ตฌ์˜ ํ•ต์‹ฌ์ ์ธ ๋ฏธ๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค์ธ์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Linux: x64 vs arm64

npm ๋ž˜ํผ๋Š” ์‚ฌ์šฉ์ž CPU ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ž๋™ ๊ฐ์ง€ํ•˜์—ฌ ๋งž๋Š” tarball์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค:

process.arch ๋‹ค์šด๋กœ๋“œ ์ž์‚ฐ
x64 codescan-linux-x64.tar.gz
arm64 codescan-linux-arm64.tar.gz

postinstall์ด GitHub์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ(ํšŒ์‚ฌ ํ”„๋ก์‹œ, ์—์–ด๊ฐญ)์ด๋ผ๋ฉด ์„ค์น˜ ์‹œ CODESCAN_SKIP_DOWNLOAD=1์„ ์ง€์ •ํ•˜๊ณ  ์ตœ์‹  ๋ฆด๋ฆฌ์ฆˆ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ง์ ‘ ๋ฐ›์œผ์„ธ์š”.

v1์€ glibc ๊ธฐ๋ฐ˜ Linux๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. musl/Alpine ์ง€์›์€ v2 ๊ฒ€ํ†  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์ง์ ‘ ์ธ์Šคํ†จ๋Ÿฌ (fallback)

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ โ€” ๋˜๋Š” ํŠน์ • ๋ฆด๋ฆฌ์ฆˆ์— ๊ณ ์ • ์„ค์น˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ.

Windows (PowerShell):

iwr https://raw.githubusercontent.com/psmon/CodeScan/main/Script/install-win.ps1 -OutFile install-win.ps1
.\install-win.ps1                       # ์ตœ์‹ 
.\install-win.ps1 -Version 0.5.0        # ๋ฒ„์ „ ๊ณ ์ •

Linux / macOS (bash):

curl -fsSL https://raw.githubusercontent.com/psmon/CodeScan/main/Script/install.sh -o install.sh
sh install.sh                           # ์ตœ์‹ 
sh install.sh --version 0.5.0           # ๋ฒ„์ „ ๊ณ ์ •

๋‘ ์ธ์Šคํ†จ๋Ÿฌ ๋ชจ๋‘ GitHub์—์„œ ํ•ด๋‹น ๋ฆด๋ฆฌ์ฆˆ ์ž์‚ฐ์„ ๋ฐ›์•„ checksums.txt ๊ธฐ์ค€ SHA256์„ ๊ฒ€์ฆํ•˜๊ณ , ์‚ฌ์šฉ์ž ๋กœ์ปฌ ๊ฒฝ๋กœ(Win: ~/.codescan/bin, Unix: ~/.local/bin)์— ์„ค์น˜ํ•˜๋ฉฐ, ~/.codescan/{db,logs,config}์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์œ„์น˜

OS ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ค์น˜ ๊ฒฝ๋กœ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ
Windows %USERPROFILE%\.codescan\bin (๋˜๋Š” winget ๊ด€๋ฆฌ) %USERPROFILE%\.codescan\{db,logs,config}
Linux ~/.local/bin (๋˜๋Š” npm ๊ด€๋ฆฌ) ~/.codescan/{db,logs,config}
macOS $(brew --prefix)/bin ~/.codescan/{db,logs,config}

์„ค์น˜ / ์—…๊ทธ๋ ˆ์ด๋“œ / ์ œ๊ฑฐ ์ „ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.

์†Œ์Šค์—์„œ ๋นŒ๋“œ

git clone https://github.com/psmon/CodeScan.git
cd CodeScan
dotnet build                        # ๋””๋ฒ„๊ทธ ๋นŒ๋“œ
dotnet publish -c Release           # ๋ฆด๋ฆฌ์ฆˆ publish (๋‹จ์ผ ํŒŒ์ผ)

์ „์ œ ์กฐ๊ฑด:

  • .NET 10.0 SDK (๋นŒ๋“œ์šฉ)
  • Git (blame ํ†ตํ•ฉ์šฉ)

์‚ฐ์ถœ๋ฌผ: bin/Release/net10.0/<rid>/codescan (Windows๋Š” codescan.exe).

๊ฐœ๋ฐœ์ž ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ

GitHub Releases๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋กœ์ปฌ ์ฒดํฌ์•„์›ƒ์—์„œ ๋ฐ”๋กœ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์€ ์ €์žฅ์†Œ ๊ฐœ๋ฐœ์ž์šฉ:

  • Windows: Script/deploy-win.ps1
  • Linux: Script/deploy-linux.sh

dotnet publish + ~/.codescan/bin ์„ค์น˜ + PATH ๋“ฑ๋ก๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค โ€” ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒ์žฅํ•˜๋Š” ๊ฒฝ๋กœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐฐํฌ ์ „๋žต ์ƒ์„ธ

์ž์‚ฐ ๋ช…๋ช…, ์ฝ”๋“œ ์„œ๋ช…/๊ณต๊ธ‰๋ง ์ •์ฑ…, SBOM, CI ํ๋ฆ„, ์ฑ„๋„ ์ œ์ถœ ์ ˆ์ฐจ ๋“ฑ v1 ํ™•์ •์•ˆ์€ Docs/install-distribution-strategy.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์‚ฌ์šฉ๋ฒ•

๋น ๋ฅธ ์‹œ์ž‘

# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ์Šค์บ” (๋“ฑ๋ก + ๋ถ„์„ + ํ‘œ์‹œ)
codescan scan

# ํŠน์ • ๊ฒฝ๋กœ ์Šค์บ”
codescan scan /path/to/project

# ์ธ๋ฑ์‹ฑ๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ๊ฒ€์ƒ‰
codescan search "HttpClient"

# ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰
codescan graph "HttpClient"
codescan search "HttpClient" --graph --depth 2

# Cypher-like ๊ทธ๋ž˜ํ”„ ์งˆ์˜
codescan query "MATCH (c:class)-[r:uses_type]->(t:type) WHERE t.label = 'HttpClient'"

# ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ TUI ์‹คํ–‰
codescan tui

# ๋กœ์ปฌ GUI ๋ทฐ์–ด ์‹œ์ž‘
codescan gui start --port 8085

CLI ๋ช…๋ น

๋ช…๋ น ์„ค๋ช…
scan [path] ๋””๋ ‰ํ† ๋ฆฌ ๋“ฑ๋ก + ๋ถ„์„ (๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ list ์‹คํ–‰ํ•˜๋Š” ๋‹จ์ถ•ํ˜•)
list <path> ์‚ฌ์šฉ์ž ์ •์˜ ํ•„ํ„ฐ/์ถœ๋ ฅ ์˜ต์…˜์œผ๋กœ ์Šค์บ”
search <query> ํ’€ํ…์ŠคํŠธ + git log ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰
graph [query] ์†Œ์Šค ์ง€์‹ ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰ ๋ฐ ์กฐํšŒ
query <graph-query> CodeScan Cypher-like ๊ทธ๋ž˜ํ”„ ์งˆ์˜ ์„œ๋ธŒ์…‹ ์‹คํ–‰
cypher <graph-query> query์˜ ๋ณ„์นญ
`gui start stop`
projects ๋“ฑ๋ก๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์™€ ํ†ต๊ณ„ ๋‚˜์—ด
project <id> ํ”„๋กœ์ ํŠธ ์š”์•ฝ ๋˜๋Š” --detail๋กœ ์ „์ฒด ๋ณด๊ธฐ
project-addinfo <id> <text> ํ”„๋กœ์ ํŠธ์— AI ์นœํ™”์  ์„ค๋ช… ์ถ”๊ฐ€
project-update <id> ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ/์„ค๋ช… ๊ฐฑ์‹ 
project-delete <id> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ”„๋กœ์ ํŠธ ์ œ๊ฑฐ
tui ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ„ฐ๋ฏธ๋„ UI ์‹คํ–‰
help [command] ํŠน์ • ๋ช…๋ น์˜ ๋„์›€๋ง ํ‘œ์‹œ

๊ฒ€์ƒ‰ ์˜ต์…˜

# ๋ฉ”์„œ๋“œ ๊ฒ€์ƒ‰
codescan search "async" --type method

# ์ฃผ์„ ๊ฒ€์ƒ‰
codescan search "TODO" --type comment

# ํŠน์ • ํ”„๋กœ์ ํŠธ ๋‚ด ๊ฒ€์ƒ‰
codescan search "config" --project 1

# ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰
codescan search "HttpClient" --graph --depth 2
codescan graph "SearchCommand" --project 1

# ๊ฒ€์ƒ‰ ์ธ์ž๋ฅผ ๊ทธ๋ž˜ํ”„ ์งˆ์˜๋กœ ์ฒ˜๋ฆฌ
codescan search "MATCH (f:file)-[r:imports]->(m:module) LIMIT 20" --query

๊ทธ๋ž˜ํ”„ ์งˆ์˜

CodeScan์€ ์ž์ฒด ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ์— ๋งž์ถฐ Cypher-like ์งˆ์˜ ์„œ๋ธŒ์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. CLI ์‚ฌ์šฉ์ž, AI ์—์ด์ „ํŠธ, ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ SQL์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ ๋„ ๊ตฌ์กฐํ™”๋œ ๊ทธ๋ž˜ํ”„ ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ „์ฒด Cypher๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. CodeScan์˜ SQLite ๊ธฐ๋ฐ˜ ์†Œ์Šค ๊ทธ๋ž˜ํ”„์— ๋งคํ•‘๋˜๋ฉฐ, CLI/TUI/GUI๊ฐ€ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” GraphData ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ง€์› ํŒจํ„ด:

MATCH (n:kind)
MATCH (a:kind)-[r:edge_kind]->(b:kind)

์ง€์› WHERE ํ•„๋“œ:

๋ณ„์นญ ์ข…๋ฅ˜ ํ•„๋“œ
๋…ธ๋“œ ๋ณ„์นญ kind, label, path, detail
์—ฃ์ง€ ๋ณ„์นญ kind, label

์ง€์› ์—ฐ์‚ฐ์ž:

์—ฐ์‚ฐ์ž ์˜ˆ์‹œ
= t.label = 'HttpClient'
CONTAINS c.label CONTAINS 'Command'
STARTS WITH m.label STARTS WITH 'System'
ENDS WITH f.path ENDS WITH '.cs'

์ง€์› ์ ˆ:

์ ˆ ๋™์ž‘
WHERE ... AND ... ๋งค์นญ๋œ ๋…ธ๋“œ/์—ฃ์ง€ ํ•„ํ„ฐ๋ง
RETURN ... ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ํ—ˆ์šฉ, ๋ Œ๋”๋Ÿฌ๋Š” ๋ฌด์‹œ
LIMIT <n> ๋งค์นญ๋œ ์‹œ๋“œ ๋…ธ๋“œ/์—ฃ์ง€ ๊ฐœ์ˆ˜ ์ œํ•œ

์˜ˆ์‹œ:

# ํด๋ž˜์Šค ๋…ธ๋“œ ๊ฒ€์ƒ‰
codescan query "MATCH (c:class) WHERE c.label CONTAINS 'Service' LIMIT 20"

# ํŠน์ • ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ๊ฒ€์ƒ‰
codescan query "MATCH (c:class)-[r:uses_type]->(t:type) WHERE t.label = 'HttpClient'"

# ํŒŒ์ผ ์ž„ํฌํŠธ ๊ฒ€์ƒ‰
codescan query "MATCH (f:file)-[r:imports]->(m:module) WHERE m.label CONTAINS 'System.Net'"

# ์ž‘์„ฑ์ž-๋ฉ”์„œ๋“œ ๊ด€๊ณ„ ๊ฒ€์ƒ‰ ๋ฐ ์ด์›ƒ ํ•œ ๋‹จ๊ณ„ ํ™•์žฅ
codescan query "MATCH (a:author)-[r:authored]->(m:method) WHERE a.label CONTAINS 'kim'" --depth 1

# `graph`๋Š” MATCH ์งˆ์˜๋ฅผ ์ž๋™ ๊ฐ์ง€
codescan graph "MATCH (c:class)-[r:creates]->(t:type) LIMIT 30"

์ฃผ์š” ๋…ธ๋“œ ์ข…๋ฅ˜:

project, directory, file, class, method, comment, doc, author, type, module

์ฃผ์š” ์—ฃ์ง€ ์ข…๋ฅ˜:

contains, defines, authored, has_comment, documents, imports, inherits_or_implements, creates, uses_type

GUI

# ๊ธฐ๋ณธ ํฌํŠธ๋กœ ์‹œ์ž‘
codescan gui start

# ์‚ฌ์šฉ์ž ์ •์˜ ํฌํŠธ๋กœ ์‹œ์ž‘
codescan gui start --port 8090

# GUI ์„œ๋ฒ„ ์ •์ง€
codescan gui stop

GUI ์‹œ์ž‘ ํ›„ http://127.0.0.1:8085/๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ๋ทฐ์–ด๋Š” ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰, Cypher-like ๊ทธ๋ž˜ํ”„ ์งˆ์˜, Neo4jClient ์Šคํƒ€์ผ 2D ๊ทธ๋ž˜ํ”„ ์บ”๋ฒ„์Šค, ์นด๋ฉ”๋ผ ์ œ์–ด ๊ฐ€๋Šฅํ•œ 3D ๊ทธ๋ž˜ํ”„ ๋ทฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

GUI ๊ทธ๋ž˜ํ”„ ์ปจํŠธ๋กค:

์ปจํŠธ๋กค ๋™์ž‘
Keyword ํ’€ํ…์ŠคํŠธ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ ์‹คํ–‰
Graph Search ํ‚ค์›Œ๋“œ๋กœ ๊ทธ๋ž˜ํ”„ ๋…ธ๋“œ ๊ฒ€์ƒ‰ ๋ฐ ์ด์›ƒ ํ™•์žฅ
Query MATCH ... ๊ทธ๋ž˜ํ”„ ์งˆ์˜ ์‹คํ–‰ ๋ฐ ๋ Œ๋”๋ง
2D ๋ฐฐ๊ฒฝ ๋“œ๋ž˜๊ทธ ๊ทธ๋ž˜ํ”„ ํŒจ๋‹
2D ๋งˆ์šฐ์Šค ํœ  ์ปค์„œ ๊ธฐ์ค€ ์คŒ
2D ๋…ธ๋“œ ๋“œ๋ž˜๊ทธ ๋…ธ๋“œ ์œ„์น˜ ์žฌ๋ฐฐ์น˜
๋…ธ๋“œ ํด๋ฆญ ๋…ธ๋“œ ๋””ํ…Œ์ผ + ๊ฐ€์‹œ ๊ด€๊ณ„ ํ‘œ์‹œ
์—ฃ์ง€ ํด๋ฆญ ๊ด€๊ณ„ ๋””ํ…Œ์ผ ํ‘œ์‹œ
๋ฒ”๋ก€ ์นฉ ๋…ธ๋“œ ์ข…๋ฅ˜ ํ† ๊ธ€
Fit ๊ฐ€์‹œ ๋…ธ๋“œ๋ฅผ ์บ”๋ฒ„์Šค์— ๋งž์ถค
Reset Camera 2D ๋ทฐํฌํŠธ ๋˜๋Š” 3D ์นด๋ฉ”๋ผ ๋ฆฌ์…‹
3D ๋“œ๋ž˜๊ทธ ์นด๋ฉ”๋ผ ๊ถค๋„ ํšŒ์ „
3D Shift-๋“œ๋ž˜๊ทธ / ์˜ค๋ฅธ์ชฝ ๋“œ๋ž˜๊ทธ ์นด๋ฉ”๋ผ ํŒจ๋‹
3D ๋งˆ์šฐ์Šค ํœ  ์นด๋ฉ”๋ผ ์คŒ

list ์˜ต์…˜

# ๋ฉ”์„œ๋“œ ๋””ํ…Œ์ผ๊นŒ์ง€ ํŠธ๋ฆฌ ๋ทฐ
codescan list /path/to/project --detail --tree

# ํ™•์žฅ์ž ํ•„ํ„ฐ
codescan list /path --include .ts,.tsx

# ๊นŠ์ด ์ œํ•œ + git blame ํฌํ•จ
codescan list /path --depth 3 --blame

๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ~/.codescan/ ์•„๋ž˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

~/.codescan/
โ”œโ”€โ”€ db/
โ”‚   โ””โ”€โ”€ codescan.db      # FTS5 ์ธ๋ฑ์Šค๊ฐ€ ํฌํ•จ๋œ SQLite DB
โ””โ”€โ”€ logs/
    โ””โ”€โ”€ *.log            # ์Šค์บ” ๋กœ๊ทธ (--devmode ํ•œ์ •)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”

ํ…Œ์ด๋ธ” ๋‚ด์šฉ
projects ์ธ๋ฑ์‹ฑ๋œ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ๋กœ, ์Šค์บ” ์ผ์‹œ, ํ†ต๊ณ„
scans ํ”„๋กœ์ ํŠธ๋ณ„ ์Šค์บ” ์ด๋ ฅ
files ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (๊ฒฝ๋กœ, ํฌ๊ธฐ, ํ™•์žฅ์ž, ๊นŠ์ด)
methods git blame ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค:๋ฉ”์„œ๋“œ ์ •์˜
comments ์ฃผ๋ณ€ ์ฝ”๋“œ ์ปจํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ์ฃผ์„ ๋ธ”๋ก
project_docs ์ž๋™ ๋ฐœ๊ฒฌ๋œ README / AGENT / CLAUDE.md ๋‚ด์šฉ
search_index FTS5 ๊ฐ€์ƒ ํ…Œ์ด๋ธ” (trigram ํ† ํฌ๋‚˜์ด์ €)
graph_nodes ์†Œ์Šค ๊ทธ๋ž˜ํ”„ ๋…ธ๋“œ: ํ”„๋กœ์ ํŠธ, ๋””๋ ‰ํ† ๋ฆฌ, ํŒŒ์ผ, ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ์ฃผ์„, ๋ฌธ์„œ, ์ž‘์„ฑ์ž
graph_edges ์†Œ์Šค ๊ทธ๋ž˜ํ”„ ๊ด€๊ณ„: contains, defines, authored, documents, comments, imports, creates, uses_type, inherits_or_implements

๊ทธ๋ž˜ํ”„ ์—ฃ์ง€ ๊ทœ์น™

๊ตฌ์กฐ ์—ฃ์ง€:

์—ฃ์ง€ ์˜๋ฏธ
project -[contains]-> directory/file ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ํŠธ๋ฆฌ
directory -[contains]-> directory/file ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ ํŠธ๋ฆฌ
file -[contains]-> class ์†Œ์Šค ํŒŒ์ผ์—์„œ ๋ฐœ๊ฒฌ๋œ ํด๋ž˜์Šค/ํƒ€์ž…
class/file -[defines]-> method ๋ฉ”์„œ๋“œ/ํ•จ์ˆ˜ ์ •์˜
file -[has_comment]-> comment ์†Œ์Šค ํŒŒ์ผ์—์„œ ๋ฐœ๊ฒฌ๋œ ์ฃผ์„ ๋ธ”๋ก
author -[authored]-> method git blame ์ตœ์ข… ์ž‘์„ฑ์ž ๊ด€๊ณ„
project -[documents]-> doc ์ž๋™ ๋ฐœ๊ฒฌ๋œ ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ

์˜์กด์„ฑ ํžŒํŠธ ์—ฃ์ง€:

์—ฃ์ง€ ์ถœ์ฒ˜
file/class -[imports]-> module using, import, use, #include
class -[inherits_or_implements]-> type ๋ฒ ์ด์Šค ํด๋ž˜์Šค / ์ธํ„ฐํŽ˜์ด์Šค / trait ์Šคํƒ€์ผ ์„ ์–ธ
class -[creates]-> type ์ƒ์„ฑ์ž ๋˜๋Š” new Type() ๊ฐ™์€ ์ƒ์„ฑ์ž ์œ ์‚ฌ ํ˜ธ์ถœ
class -[uses_type]-> type ์ •๊ทœ์‹ ์ „๋žต์ด ๊ฐ์ง€ํ•œ ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜, ํ•„๋“œ, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜, ์ง€์—ญ ์„ ์–ธ

์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋Š” ์˜๋„์ ์œผ๋กœ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ์ž…๋‹ˆ๋‹ค. CodeScan์€ ๋จผ์ € ์–ธ์–ด ์ค‘๋ฆฝ์  ์ •๊ทœ์‹ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋นŒ๋“œ๋˜์ง€ ์•Š์•„๋„ ๊ทธ๋ž˜ํ”„ ์—ฃ์ง€๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ํ”„๋กœ์ ํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์˜๋ฏธ ๋ถ„์„ ๊ฐ€๋Šฅ์„ฑ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค:

์–ธ์–ด ์˜๋ฏธ ๋ถ„์„ ํ”„๋กœ๋ธŒ
C# ํ–ฅํ›„ Roslyn ๋ถ„์„์„ ์œ„ํ•œ .sln, .csproj
Java ํ–ฅํ›„ JDT/Spoon ๋ถ„์„์„ ์œ„ํ•œ pom.xml, build.gradle, build.gradle.kts
TypeScript/JavaScript ํ–ฅํ›„ TypeScript Compiler API ๋ถ„์„์„ ์œ„ํ•œ tsconfig.json, jsconfig.json
Go ํ–ฅํ›„ go/packages ๋ถ„์„์„ ์œ„ํ•œ go.mod, go.work
Rust ํ–ฅํ›„ rust-analyzer / Cargo ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ Cargo.toml
C/C++ ํ–ฅํ›„ Clang LibTooling ๋ถ„์„์„ ์œ„ํ•œ compile_commands.json

ํ˜„์žฌ ์˜๋ฏธ ๋ถ„์„ ํ”„๋กœ๋ธŒ๋Š” ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ ๋ชจ๋ธ ์กด์žฌ ์—ฌ๋ถ€๋งŒ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด๋ณ„ ์˜๋ฏธ ๋ถ„์„ ์ „๋žต์ด ์ถ”๊ฐ€๋  ๋•Œ๊นŒ์ง€๋Š” ์ •๊ทœ์‹์ด ๊ธฐ๋ณธ ํด๋ฐฑ ์ „๋žต์ž…๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜

CodeScan/
โ”œโ”€โ”€ Program.cs                  # ์ง„์ž…์  ๋ฐ CLI ๋ผ์šฐํŒ…
โ”œโ”€โ”€ Commands/                   # ๋ช…๋ น ๊ตฌํ˜„
โ”œโ”€โ”€ Models/                     # ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ (FileEntry, MethodEntry, CommentBlock, SourceDependency)
โ”œโ”€โ”€ Services/                   # ํ•ต์‹ฌ ๋กœ์ง
โ”‚   โ”œโ”€โ”€ DirectoryScanner.cs     #   ํ•„ํ„ฐ๋ง ํฌํ•จ ์žฌ๊ท€ ์ˆœํšŒ
โ”‚   โ”œโ”€โ”€ SourceAnalyzer.cs       #   ๋‹ค๊ตญ์–ด ํด๋ž˜์Šค/๋ฉ”์„œ๋“œ ์ถ”์ถœ
โ”‚   โ”œโ”€โ”€ SourceGraphAnalyzer.cs  #   ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์˜์กด์„ฑ ์—ฃ์ง€ ์ถ”์ถœ
โ”‚   โ”œโ”€โ”€ CommentExtractor.cs     #   ์ปจํ…์ŠคํŠธ ํฌํ•จ ์ฃผ์„ ์ถ”์ถœ
โ”‚   โ”œโ”€โ”€ GitBlameService.cs      #   ๋ฉ”์„œ๋“œ๋ณ„ git blame
โ”‚   โ”œโ”€โ”€ GitLogSearchService.cs  #   ํ•˜์ด๋ธŒ๋ฆฌ๋“œ git log ๊ฒ€์ƒ‰
โ”‚   โ”œโ”€โ”€ GraphQuery.cs           #   Cypher-like MATCH ์งˆ์˜ ํŒŒ์„œ
โ”‚   โ”œโ”€โ”€ GraphModels.cs          #   ์†Œ์Šค ๊ทธ๋ž˜ํ”„ DTO
โ”‚   โ”œโ”€โ”€ SqliteStore.cs          #   FTS5 ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์„ ๊ฐ–์ถ˜ SQLite DB
โ”‚   โ””โ”€โ”€ TreeFormatter.cs        #   ํŠธ๋ฆฌ/ํ”Œ๋žซ ์ถœ๋ ฅ ํฌ๋งทํŒ…
โ”œโ”€โ”€ Tui/
โ”‚   โ””โ”€โ”€ TuiApp.cs               # Terminal.Gui v2 ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ UI
โ””โ”€โ”€ Script/                     # ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ (Windows/Linux)

์˜์กด์„ฑ

ํŒจํ‚ค์ง€ ์šฉ๋„
Microsoft.Data.Sqlite FTS5 ์ง€์› ์ž„๋ฒ ๋””๋“œ SQLite
Terminal.Gui v2 ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ„ฐ๋ฏธ๋„ UI ํ”„๋ ˆ์ž„์›Œํฌ

์„ค๊ณ„ ํ•˜์ด๋ผ์ดํŠธ

  • ์ค‘์•™์ง‘์ค‘์‹ ์ €์žฅ โ€” ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์œ„์น˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ~/.codescan/ ์•„๋ž˜
  • ์ตœ์‹ ์ˆœ ์ •๋ ฌ โ€” ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์ˆ˜์ • ์‹œ๊ฐ„ ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ
  • ์Šค๋งˆํŠธ ๊ธฐ๋ณธ๊ฐ’ โ€” .git, node_modules, bin, obj, dist, build, __pycache__๋Š” ์ž๋™ ์ œ์™ธ
  • ๋งˆํฌ๋‹ค์šด์€ ํ•ญ์ƒ ํฌํ•จ โ€” --include ํ•„ํ„ฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด๋„ .md ํŒŒ์ผ์€ ํ•ญ์ƒ ์ธ๋ฑ์‹ฑ
  • Git ๋ฃจํŠธ ๊ฐ์ง€ โ€” ์„œ๋ธŒํ”„๋กœ์„ธ์Šค ์—†์ด ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€ .git/์„ ํƒ์ƒ‰
  • Trigram FTS โ€” ํ•œยท์ค‘ยท์ผ CJK ์–ธ์–ด์˜ ํšจ๊ณผ์ ์ธ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
  • ์ •๊ทœ์‹ ์šฐ์„  ๊ทธ๋ž˜ํ”„ โ€” ๋นŒ๋“œ ์„ฑ๊ณต ์—†์ด๋„ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ํžŒํŠธ ์ƒ์„ฑ
  • ์˜๋ฏธ ๋ถ„์„ ์ค€๋น„๋œ ์ „๋žต ๋ ˆ์ด์–ด โ€” ISourceDependencyStrategy ๋’ค์— ์–ธ์–ด๋ณ„ ์ปดํŒŒ์ผ๋Ÿฌ ๋ถ„์„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

Why AOT? โ€” Edge AI ํŠธ๋ Œ๋“œ์™€ ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๊ฐ€์น˜

TL;DR โ€” 2026~2027๋…„ AI ์ธํ”„๋ผ์˜ ๋ฌด๊ฒŒ์ค‘์‹ฌ์ด ํด๋ผ์šฐ๋“œ์˜ ๊ฑฐ๋Œ€ ํ”„๋ก ํ‹ฐ์–ด ๋ชจ๋ธ์—์„œ *์˜จ๋””๋ฐ”์ด์Šค SLM(Small Language Model)*๊ณผ ์—ฃ์ง€ ์—์ด์ „ํŠธ๋กœ ๋น ๋ฅด๊ฒŒ ์˜ฎ๊ฒจ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. CodeScan์€ .NET 10 Native AOT๋กœ ๋นŒ๋“œ๋œ ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ ์—†๋Š” ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ โ€” ์ด ํ๋ฆ„์„ ํ•จ๊ป˜ ํƒ€๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ ๋…ธํŠธ๋ถ, ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด, ๋“œ๋ก ๊ธ‰ SBC์—์„œ ๋ชจ๋‘ ๋™์ผํ•œ ์‚ฐ์ถœ๋ฌผ์ด ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

2026: SLM์ด ์—ฃ์ง€์—์„œ ์ง„์งœ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์‹œ์ž‘ํ•œ ํ•ด

2025๋…„๊นŒ์ง€์˜ "์—ฃ์ง€ LLM"์€ ๋ฐ๋ชจ์™€ ๋ฒค์น˜๋งˆํฌ ๊ธ€ ์ˆ˜์ค€์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 2026๋…„๋ถ€ํ„ฐ ๋ถ„์œ„๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค:

  • Google Gemma 3 / 3n / 3 270M โ€” Gemma 3๋Š” ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ 14.5 tok/s๋ฅผ ๊ธฐ๋กํ–ˆ๊ณ , Jetson์—์„œ 12์‹œ๊ฐ„ ๋ฌด์ค‘๋‹จ ์ถ”๋ก ์„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์—†์ด ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. 270M ๋ณ€์ข…์€ INT4 ์–‘์žํ™” + Per-Layer Embedding(PLE) ์บ์‹œ๋กœ Pixel 9 Pro์—์„œ **25ํšŒ ๋Œ€ํ™”์— ๋ฐฐํ„ฐ๋ฆฌ 0.75%**๋งŒ ์†Œ๋ชจ โ€” ์ผ์ƒ ๊ธฐ๊ธฐ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํƒ‘์žฌ๋˜๋Š” ์ˆ˜์ค€์— ์ง„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. (Gemma 3 270M ๋ฐœํ‘œ, Gemma 3n ๊ฐœ์š”)
  • NVIDIA Nemotron 3 Nano (4B / 30B-A3B) โ€” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ Mixture-of-Experts ๊ตฌ์กฐ๋กœ, 30B ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ forward pass๋‹น 3B๋งŒ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. 4B ๋ณ€์ข…์€ 4bit ์–‘์žํ™” ์‹œ VRAM 3GB ๋ฏธ๋งŒ์œผ๋กœ ์ปจ์Šˆ๋จธ RTX ์นด๋“œ์™€ Jetson๊ธ‰ ์—ฃ์ง€ ๋ณด๋“œ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, NVIDIA๋Š” ๋™๊ธ‰ ์˜คํ”ˆ ๋ชจ๋ธ ๋Œ€๋น„ 9๋ฐฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. (Nemotron 3 Nano Omni ์†Œ๊ฐœ, Nemotron 3 Nano 4B ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜)
  • 3B ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋ธ์ด 2026๋…„ sweet spot โ€” 3~8bit ์–‘์žํ™”๊ฐ€ ์–‘์‚ฐ ์ˆ˜์ค€์œผ๋กœ ์•ˆ์ •ํ™”๋˜๊ณ  ์†Œํ˜• NPU๊ฐ€ ๋‹จ์ผ ๋ณด๋“œ ์ปดํ“จํ„ฐ์— ๋ณธ๊ฒฉ ํƒ‘์žฌ๋˜๋ฉด์„œ, ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์•ฝ 3B ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ SBC ์ถ”๋ก ์˜ ์‹ค์šฉ์  sweet spot์œผ๋กœ ์ˆ˜๋ ด์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. (The Small Model Revolution 2026)

2027 ์˜ˆ์ธก: ์ž‘์€ ์žฅ์น˜๊ฐ€ LLM์„ ๊ธฐ๋ณธ์œผ๋กœ ํƒ‘์žฌํ•œ๋‹ค

์ง€๊ธˆ์˜ ๊ณก์„ ์„ ๊ทธ๋Œ€๋กœ ์™ธ์‚ฝํ•˜๋ฉด, 2027๋…„์—๋Š” ๋‹ค์Œ์ด ํ‘œ์ค€์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค:

  • ๋“œ๋ก  โ€” Whisper๊ธ‰ ์Œ์„ฑ ์ธ์‹ + 3B๊ธ‰ SLM์ด GPS ์—†์ด๋„ ์ž์œจ ์ž„๋ฌด ํ•ด์„/์žฌ๊ณ„ํš์„ ์ˆ˜ํ–‰ (ํ˜„์žฌ์˜ ํ•™์ˆ  ๋ฐ๋ชจ โ†’ ์–‘์‚ฐ ํŽ˜์ด๋กœ๋“œ ๋‹จ๊ณ„๋กœ ์ง„์ž…).
  • Raspberry Pi 5 + AI HAT+ 2 โ€” Hailo-10H ๊ฐ€์†๊ธฐ(40 TOPS INT4) + 8GB LPDDR4X๋กœ SBC๊ฐ€ ๋ณธ๊ฒฉ์ ์ธ LLM ํ˜ธ์ŠคํŠธ๊ฐ€ ๋จ. (Raspberry Pi AI HAT+ 2 ์ถœ์‹œ โ€” The Register, 2026๋…„ 1์›”)
  • x86/ARM SBC (Latte Panda, Khadas Edge, Orange Pi ๋“ฑ) โ€” ๊ณต์žฅ PLC ์˜†์—์„œ ๋กœ์ปฌ SLM์ด ๋กœ๊ทธ ๋ถ„๋ฅ˜, ์ด์ƒ ํƒ์ง€, ์ž์—ฐ์–ด ์šด์šฉ UI๋ฅผ ๋‹ด๋‹น.
  • ๋…ธํŠธ๋ถ/ํƒœ๋ธ”๋ฆฟ โ€” NPU ๋‚ด์žฅ SoC(Apple Silicon, Snapdragon X, AMD Strix Halo)๊ฐ€ ๋ณดํŽธํ™”๋˜๋ฉฐ 4B๊ธ‰ ์˜จ๋””๋ฐ”์ด์Šค ์ถ”๋ก ์ด OS ๋ ˆ๋ฒจ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์œผ๋กœ ์ž๋ฆฌ์žก์Œ. SamsungยทGoogleยทMotorola์˜ 2026 ํ”Œ๋ž˜๊ทธ์‹ญ์€ ์ด๋ฏธ Q4 ์–‘์žํ™” 4B ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. (2026 SLM ๋น„๊ต: Phi-4 vs Gemma 3 vs Qwen)

์ด ๋ชจ๋“  ํ™˜๊ฒฝ์˜ ๊ณตํ†ต ๊ตฌ์กฐ์  ์ œ์•ฝ:

์ œ์•ฝ ์‹œ์‚ฌ์ 
๋Ÿฐํƒ€์ž„ ๋ถ€์žฌ โ€” ๋“œ๋ก  ํŽŒ์›จ์–ด์™€ SBC ๋ฏธ๋‹ˆ๋ฉ€ ์ด๋ฏธ์ง€์—๋Š” .NET / Java / Python ๋Ÿฐํƒ€์ž„์ด ๊ฑฐ์˜ ์—†๊ณ , ์ถ”๊ฐ€ ๋น„์šฉ๋„ ํฝ๋‹ˆ๋‹ค ๋‹จ์ผ self-contained ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์‚ฌ์‹ค์ƒ ์š”๊ตฌ์‚ฌํ•ญ
๋ฉ”๋ชจ๋ฆฌ/์ €์žฅ ์••๋ฐ• โ€” ๋ชจ๋ธ์ด RAM์„ ๊ฑฐ์˜ ์ ์œ ํ•˜๋ฏ€๋กœ ์ฃผ๋ณ€ ๋„๊ตฌ๋Š” ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค AOT ํŠธ๋ฆฌ๋ฐ๊ณผ ๋‹จ์ผ ํŒŒ์ผ ์••์ถ•์ด ์˜๋ฏธ๋ฅผ ๊ฐ€์ง
์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋น„์šฉ โ€” ๋ฐฐํ„ฐ๋ฆฌ ๊ตฌ๋™ ๋ฐ ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ ์›Œํฌ๋กœ๋“œ๋Š” ์ฆ‰์‹œ ์‘๋‹ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค "JIT warmup ์—†์Œ"์ด ๊ฒฐ์ •์  ์ด์ 
๊ณต๊ธ‰๋ง ์‹ ๋ขฐ โ€” ์—ฃ์ง€๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ๋“œ๋ฌผ์–ด ํ•œ ๋ฒˆ ๋ฐ•ํžŒ ์‚ฐ์ถœ๋ฌผ์˜ ๋ฌด๊ฒฐ์„ฑ์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค ๋‹จ์ผ ํŒŒ์ผ + SHA256 + SBOM ์กฐํ•ฉ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ถ€ํ•ฉ

Native AOT ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋ถ€ํ•ฉํ•˜๋Š” ์ง€์ 

CodeScan์˜ ๋นŒ๋“œ ํ˜•ํƒœ๊ฐ€ ์ด ์ œ์•ฝ ๊ฐ๊ฐ์— ์ •ํ™•ํžˆ ๋“ค์–ด๋งž์Šต๋‹ˆ๋‹ค:

  • ์ฆ‰์‹œ ์‹œ์ž‘ (JIT ์—†์Œ) โ€” ์—ฃ์ง€ ์—์ด์ „ํŠธ๊ฐ€ ์Œ์„ฑ ํŠธ๋ฆฌ๊ฑฐ ํ›„ ์•ฝ 50ms ์•ˆ์— ์‘๋‹ตํ•ด์•ผ ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ฒฐ์ •์  ์ฐจ์ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (Native AOT ๋ฐฐํฌ ๊ฐœ์š” โ€” Microsoft Learn)
  • ๋Ÿฐํƒ€์ž„ ๋น„์˜์กด ๋‹จ์ผ ํŒŒ์ผ โ€” ~/.codescan/bin/codescan ํ•˜๋‚˜๋งŒ ๋ณต์‚ฌํ•˜๋ฉด .NET์ด ์„ค์น˜๋˜์ง€ ์•Š์€ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ๋„ ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ํ’‹ํ”„๋ฆฐํŠธ ์ถ•์†Œ โ€” AOT๋Š” JIT, ๊ทธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋Ÿฐํƒ€์ž„ ์„œ๋น„์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ๋ชจ๋ธ์— ๋” ๋งŽ์€ RAM์„ ์–‘๋ณดํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต๊ฒฉ ํ‘œ๋ฉด ๊ฐ์†Œ โ€” ๋™์  ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌํ”Œ๋ ‰์…˜ ๊ฒฝ๋กœ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉฐ, ๋‹จ์ผ ํŒŒ์ผ + SBOM ๋™๋ด‰์€ ๊ณต๊ธ‰๋ง ๊ฐ์‚ฌ์— ์นœํ™”์ ์ž…๋‹ˆ๋‹ค.
  • multi-arch 1๊ธ‰ ์ง€์› โ€” v1๋ถ€ํ„ฐ ๋™์ผ ํŒŒ์ดํ”„๋ผ์ธ์ด linux-x64, linux-arm64, osx-arm64, win-x64๋ฅผ ๋™๋“ฑํ•˜๊ฒŒ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. SBC ๋ฐฐํฌ์— ๋ณ„๋„์˜ ๋นŒ๋“œ ์ ˆ์ฐจ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

CodeScan์ด ์—ฃ์ง€ AI ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๋งก์„ ์ˆ˜ ์žˆ๋Š” ์—ญํ• 

CodeScan์ด ์ง์ ‘ LLM์„ ํ˜ธ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ์ธ๋ฑ์‹ฑยท๊ฒ€์ƒ‰ ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค:

  • SBC์—์„œ ๋„๋Š” ์ฝ”๋“œ ์ธ์ง€ํ˜• ์—์ด์ „ํŠธ(์˜ˆ: Gemma 3 4B + tool-use)๊ฐ€ ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ›‘์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๋Š” FTS5 + ๊ทธ๋ž˜ํ”„ ๋ฐฑ์—”๋“œ
  • ์ž์œจ ๋นŒ๋“œ/๋ฐฐํฌ ๋ด‡์ด ๋ณ€๊ฒฝ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์ถ”๋ก ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Cypher-like ๊ทธ๋ž˜ํ”„ ์งˆ์˜ ํ‘œ๋ฉด
  • ๋“œ๋ก ยท๋กœ๋ด‡ SDK ์ €์žฅ์†Œ๋ฅผ ์˜คํ”„๋ผ์ธ์—์„œ ๋ถ„์„ํ•˜์—ฌ ์ฝ”๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ SLM์— ์ฃผ์ž…ํ•˜๋Š” RAG-lite ์ปดํฌ๋„ŒํŠธ

์ž๋งค ํ”„๋กœ์ ํŠธ: AgentZeroLite

์œ„ ๊ทธ๋ฆผ์—์„œ "์—์ด์ „ํŠธ" ์ชฝ์€ ์ž๋งค ์—ฐ๊ตฌ ํ”„๋กœ์ ํŠธ๋กœ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค โ€” psmon/AgentZeroLite. AgentZeroLite๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ Gemma 3 / Nemotron Nano ๊ธ‰ ์˜จ๋””๋ฐ”์ด์Šค SLM์„ ์‹ค์ œ ์ปจ์Šˆ๋จธ ๋“ฑ๊ธ‰ ํ•˜๋“œ์›จ์–ด ์œ„์—์„œ ๋Œ๋ฆฌ๊ณ  ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ์ง‘์ค‘ํ•˜๊ณ , CodeScan์€ ๊ทธ ์—์ด์ „ํŠธ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ ์ธ์ง€ํ˜• ๊ฒ€์ƒ‰ ๋ ˆ์ด์–ด ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์ ํŠธ๋Š” ์กฐ๋ฆฝ๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • AgentZeroLite โ€” ์˜จ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ์„ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ , ํ”„๋กฌํ”„ํŠธยทtool-useยทํ‰๊ฐ€ ๋ฃจํ”„๋ฅผ ๊ด€๋ฆฌ. ์—ฃ์ง€ ์ถ”๋ก  ์‹œ๋‚˜๋ฆฌ์˜ค ์ „์šฉ.
  • CodeScan โ€” "์ด ์ €์žฅ์†Œ์—” ๋ญ๊ฐ€ ์žˆ์ง€?"์— ๋Œ€ํ•ด FTS5 ํ‚ค์›Œ๋“œ ๋งค์น˜, ์†Œ์Šค ๊ทธ๋ž˜ํ”„, Cypher-like ์งˆ์˜๋กœ ๋‹ตํ•จ. ํ”„๋ก ํ‹ฐ์–ด ๋ชจ๋ธ ์—†์ด๋„ SLM์ด ์ฝ”๋“œ ์ž‘์—…์„ ์˜๋ฏธ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ํ•„์š”ํ•œ ๊ตฌ์กฐํ™”๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณต.

์˜จ๋””๋ฐ”์ด์Šค SLM โ†” ๊ตฌ์กฐํ™”๋œ ์ฝ”๋“œ ๊ฒ€์ƒ‰์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋งž๋ฌผ๋ฆฌ๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด AgentZeroLite๊ฐ€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋‹ค์Œ ์ •๊ฑฐ์žฅ์ž…๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€ โ€” ์†Œํ˜• ๋ชจ๋ธ์ด ์—ฃ์ง€์—์„œ ์ง„์งœ ์ผ์„ ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์‹œ๋Œ€์—, ๊ทธ ๋ชจ๋ธ์„ ๋‘˜๋Ÿฌ์‹ผ ๋„๊ตฌ ์—ญ์‹œ ์ž‘๊ณ , ์ฆ‰์‹œ ์‹คํ–‰๋˜๊ณ , ๋Ÿฐํƒ€์ž„ ๋น„์˜์กด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Native AOT ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๊ทธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ๋‹ต์ด๊ณ , CodeScan์€ ๊ทธ ๋ฐฉํ–ฅ์„ ๋”ฐ๋ผ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ/๋ฐฐํฌ์˜ ์ „์ฒด ์‚ฌ์–‘์€ Docs/install-distribution-strategy.md์— ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Blumn Ai Studio

blumn ai studio

Blumn AI Studio

Blumn AI์˜ ์ฐจ์„ธ๋Œ€ AI ์—์ด์ „ํŠธ์™€ ์‹ค์‹œ๊ฐ„ ์—ฃ์ง€ AI ์ธํ”„๋ผ ๊ธฐ์ˆ ์„ ์—ฐ๊ตฌํ•˜๋Š” R&D Studio์ž…๋‹ˆ๋‹ค.
์ด ์ €์žฅ์†Œ๋Š” ํ•ด๋‹น ์—ฐ๊ตฌ ๋ฐ ๊ฐœ๋ฐœ ํ™œ๋™์˜ ์ผ๋ถ€๋ฅผ ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๐ŸŒ https://blumn.ai/
๐Ÿ“ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ยท https://blumnai-studio.github.io/tech-writing-harness/