์ข ๋ชฉ์ฝ๋ ํ๋. ๊ธฐ์ ์ ์ ์ฒด ์ด์ผ๊ธฐ.
Korean DART + US SEC EDGAR ๊ณต์๋ฅผ ํ ์ค์ Python ์ผ๋ก ์ฝ๊ณ ๋น๊ตํ๋ค.
๋ฌธ์ ยท Skill OS ยท Skill Market ยท ๋ธ๋ก๊ทธ ยท Colab์์ ์ด๊ธฐ ยท Molab์์ ์ด๊ธฐ ยท English ยท ํ์
์ข ๋ชฉ ํ๋๋ก ์ฌ๋ฌดยท์ฃผ๊ฐยท๊ณต์ยท์ ์ฉยท์ฐ์ ยท๋งคํฌ๋ก๋ฅผ ํ ํ๋ฉด์์ ์ฝ๋ ๋ธ๋ฃธ๋ฒ๊ทธ์ ํฐ๋ฏธ๋์ ๋์ ํ๋ DartLab ํฐ๋ฏธ๋. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง๋ ๋น๊ต ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ํ๋ฉด ์์ ์ฌ๋ ธ๋ค.
์ด ํฐ๋ฏธ๋์ @youngchangjo ๋์ ์ค๋ ๋์์ ๋ฐ์ ์๊ฐ์ผ๋ก ์์๋์ต๋๋ค.
DartLab์ DART์ EDGAR ๊ณต์๋ฅผ ์ข
๋ชฉ์ฝ๋ ํ๋๋ก ๋น๊ต ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ก ๋ฐ๊พธ๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ฌ๋ฌด์ ํ, ์ฌ์
๋ณด๊ณ ์ ๋ณธ๋ฌธ, ๊ณต์ ๋ชฉ๋ก, ๋น์จ, ์ ์ฉ์ํ, ์ฐ์
๋งต, ๋งคํฌ๋ก ๋งฅ๋ฝ์ ๊ฐ์ Company ์ธํฐํ์ด์ค๋ก ์ฝ๋๋ค.
ํต์ฌ์ ๋จ์ ์์ง์ด ์๋๋ค. ํ์ฌ๋ง๋ค ๋ค๋ฅธ ๊ณ์ ๋ช
๊ณผ ๊ณต์ ๋ชฉ์ฐจ๋ฅผ topic ร period, account ร period ํํ๋ก ์ํํํด์ ์๋
๊ณผ ์ฌํด, ์ผ์ฑ์ ์์ ์ ํ, ํ ์ข
๋ชฉ๊ณผ ์ ์ฒด ์์ฅ์ ๊ฐ์ ์ง๋ฌธ์ผ๋ก ๋น๊ตํ๊ฒ ๋ง๋ ๋ค.
| Before | After |
|---|---|
| ์ฌ์ ๋ณด๊ณ ์ ์ฌ๋ฌ ํด๋ฅผ ์ด๊ณ ๋ชฉ์ฐจ๋ฅผ ๋ง์ถ๋ค | c.panel() |
| XBRL ๊ณ์ ๋ช ๊ณผ ํ๊ธ ํญ๋ชฉ๋ช ์ ์ง์ ๋งคํํ๋ค | c.panel("IS") |
| ์ ์ข ๋ชฉ ์ฌ๋ฌด๋น์จ์ ์ง์ ์์งยท์ ๊ทํํ๋ค | dartlab.scan("profitability") |
| AI ๋ต๋ณ์ ์ซ์๋ฅผ ๋ค์ ๊ฒ์ฐํ๋ค | dartlab.ask(...) + ์คํ ๊ทผ๊ฑฐ ref |
DartLab์ AI / Python / CLI ์ธ ๊ธธ์ ๊ฐ์ ๋ฐ์ดํฐยท๊ฐ์ ์์ง ์์ ์ฌ๋ ค๋๋๋ค. ์๊ธฐ ๋งฅ๋ฝ์ ๋ง๋ ๊ธธ๋ก ์ง์ ํ๋ฉด ๋๋ค.
| ์ฌ์ฉ ๋ฐฉ์ | ์ฝ๋ ๊ธธ์ด | ์ฒซ ๊ฒฐ๊ณผ | ์ด๋ฐ ์ฌ๋์๊ฒ ๋ง๋ค |
|---|---|---|---|
| AI๋ก ๋ฐ๋ก ์ฌ์ฉ | 1 ์ค | ~1 ๋ถ | ์ง๋ฌธ์ ๋์ง๊ณ ๊ทผ๊ฑฐ ์๋ ๋ต๋ณ์ ๋ฐ๊ณ ์ถ์ ๋ถ์๊ฐ |
| Python ์ฝ๋๋ก ์ฌ์ฉ | 3-5 ์ค | ~3 ๋ถ | ์ฌ๋ฌด์ ํยท๊ณต์ยท์ค์บ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์ |
| CLI ๋ก ์ฌ์ฉ | 1 ๋ช ๋ น | ~2 ๋ถ | ๋จ๋ฐ ์กฐํยท์๋ํ ์คํฌ๋ฆฝํธยท์ ธ ํ์ดํ๋ผ์ธ ์ฌ์ฉ์ |
๊ฐ ๊ฒฝ๋ก๋ ๋ชจ๋ dartlab.Company ์ ๊ฐ์ ๋ถ์ ์์ง์ ํธ์ถํ๋ค. ์ถ๋ฐ์ ๋ง ๋ค๋ฅผ ๋ฟ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
๊ธฐ์
์ด๋ฆ์ด๋ ์ข
๋ชฉ์ฝ๋๋ฅผ ๋ฃ๊ณ ์์ฐ์ด๋ก ๋ฌผ์ด๋ณด๋ฉด, DartLab AI๋ ๋ด๋ถ์์ Company, analysis, credit, scan, macro ๊ฐ์ ๋๊ตฌ๋ฅผ ์ง์ ์คํํ๋ค. ๋ต๋ณ๋ง ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ์ด๋ค ๋ฐ์ดํฐ์ ๊ณ์ฐ์ ์ผ๋์ง ์ถ์ ๊ฐ๋ฅํ ref๋ฅผ ํจ๊ป ๋จ๊ธด๋ค.
import dartlab
dartlab.ask("์ผ์ฑ์ ์ ์ฌ๋ฌด๊ฑด์ ์ฑ ๋ถ์ํด์ค")
# AI๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์กฐํํ๊ณ , ๊ณ์ฐ ๊ฒฐ๊ณผ์ ๊ทผ๊ฑฐ ref๋ฅผ ํจ๊ป ๋ฐํAI ๊ฒฝ๋ก์ ์ฅ์ :
- ๋ถ์ ํ๋ฆ์ ์ง์ ์ค๊ณ โ ์ง๋ฌธ์ ๋ง์ถฐ ๊ณต์, ์ฌ๋ฌด์ ํ, ์ ์ฉ, ๋งคํฌ๋ก, peer ๋น๊ต ๋๊ตฌ๋ฅผ ์กฐํฉํ๋ค.
- ์ซ์ ๊ฒ์ฐ ๊ฐ๋ฅ โ ๋ต๋ณ ์ ์ซ์์ ํ๋ ์คํ ๊ฒฐ๊ณผ ref์ ์ฐ๊ฒฐ๋๋ค.
- ๊ณต์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ก๋ง ์ฒ๋ฆฌ โ DART/EDGAR/์น ๋ณธ๋ฌธ ์์ ์ง์๋ ๋ฐ๋ฅด์ง ์๊ณ ๋ถ์ ๊ทผ๊ฑฐ๋ก๋ง ์ด๋ค.
- ์ธ๋ถ LLM ์ฐ๋ ๊ฐ๋ฅ โ MCP๋ก Claude Code, Codex CLI, Cursor ๊ฐ์ ๋๊ตฌ์์ ๊ฐ์ ํ๋ฉด์ ํธ์ถํ๋ค.
claude mcp add dartlab -- dartlab mcp
codex mcp add dartlab -- dartlab mcpClaude Desktop ยท ์๊ฒฉ SSE ยท ์ ๋ ๊ฒฝ๋ก ์ต์ ์ MCP ์น์ ์ฐธ์กฐ.
์ฝ๋ ๊ฒฝ๋ก๋ Company๊ฐ ์ค์ฌ์ด๋ค. ์ข
๋ชฉ์ฝ๋ ํ๋๋ก ์ฌ๋ฌด์ ํ, ๊ณต์ ๋ณธ๋ฌธ, ์ ํ ๋ณด๊ณ ์, ๋น์จ์ c.panel ๋จ์ผ ํ๋ฉด์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํธ์ถํ๋ค. c.panel ์ ์ก๋ ์๊ฐ ํญ๋ชฉร๊ธฐ๊ฐ ๊ฒฉ์๊ฐ ๋๋ค.
uv add dartlabimport dartlab
c = dartlab.Company("005930") # ์ผ์ฑ์ ์
c.panel() # ์ ์ฒด ๊ณต์ ์ํํ ๊ฒฉ์ (ํญ๋ชฉ ร ๊ธฐ๊ฐ)
c.panel("IS") # ์์ต๊ณ์ฐ์ (finance ์ ๊ทํ ์ซ์)
c.panel("is") # native ์์ต โ ์ฌ์
๋ณด๊ณ ์ ํญ๋ชฉ ๊ทธ๋๋ก (XBRL+์ ํตํฉ 2013~)
c.panel("ratios") # native ์ฌ๋ฌด๋น์จ (5ํ ํญ๋ชฉ์ผ๋ก ๊ณ์ฐ)
c.panel("์ฌ์
") # ์ฌ์
๊ฐ์ ๋ฑ ๊ณต์ ๋ณธ๋ฌธ ํ ๊ฒ์
c.filings() # ์๋ฌธ ๊ณต์ ๋งํฌ# ๊ฐ์ ์ธํฐํ์ด์ค, ๋ค๋ฅธ ์์ฅ
kr = dartlab.Company("005930")
us = dartlab.Company("AAPL")
kr.panel("IS")
us.panel("IS")Python ๊ฒฝ๋ก์ ์ฅ์ :
- API ํค ์์ด ์์ โ ์ฌ์ ๊ตฌ์ถ ๋ฐ์ดํฐ๋ HuggingFace์์ ์๋ ๋ค์ด๋ก๋ํ๊ณ ๋ก์ปฌ์ ์บ์ํ๋ค.
- ๊ธฐ๊ฐ ๋น๊ต๊ฐ ๊ธฐ๋ณธ โ ๊ณต์ ๋ณธ๋ฌธ๊ณผ ์ฌ๋ฌด์ ํ๋ฅผ ๊ธฐ๊ฐ ์ถ์ผ๋ก ๋ง์ถ๋ค.
- ํ๊ตญ๊ณผ ๋ฏธ๊ตญ์ ๊ฐ์ ์ธํฐํ์ด์ค๋ก ์กฐํ โ DART์ EDGAR์ ์ฐจ์ด๋ provider๊ฐ ํก์ํ๋ค.
- ์์ง ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ โ analysis, credit, macro, quant, industry, story ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋์์ ์ง์ ๋ค๋ฃฌ๋ค.
์ค์น ํ ์
ธ์์ dartlab ๋ช
๋ น์ผ๋ก ๊ฐ์ ์์ง์ ํธ์ถํ๋ค. ๋จ๋ฐ ์กฐํยท์
ธ ์๋ํยทํ์ดํ๋ผ์ธ ์นํ์ .
uv add dartlab
dartlab help "์ธ์ธ ๋งค์" # ๋์๋ง + ๋งค์นญ capability ํ์
dartlab list scan # scan ์นดํ
๊ณ ๋ฆฌ recipe ์ธ๋ฑ์ค
dartlab show 005930 IS # ์์ต๊ณ์ฐ์ ์ถ๋ ฅ (Python c.panel("IS") ๋ฑ๊ฐ)
dartlab analyze 005930 --aspect credit
dartlab mcp # MCP ์๋ฒ ์ง์
(์ธ๋ถ LLM ๋๊ตฌ ๋ฑ๋ก์ฉ)CLI ๊ฒฝ๋ก์ ์ฅ์ :
- API ํค ์์ด ๋จ๋ฐ ํธ์ถ โ HuggingFace ์บ์ ์๋ ์ฌ์ฉ
- ์
ธ ํ์ดํ๋ผ์ธ ์นํ โ
dartlab show ... --json | jq ...์์ผ๋ก ํฉ์ฑ - MCP ์๋ฒ ์ง์
์ ๋์ผ โ
dartlab mcpํ ๋ช ๋ น์ผ๋ก ์ธ๋ถ ์ด์์คํดํธ ๋๊ตฌ ๋ ธ์ถ
CLI ๋ช ๋ น ์ ์ฒด ๋ชฉ๋ก + ์ต์ ์
dartlab --help๋๋ Skill OS (src/dartlab/skills/specs/operation/code.md) ์ฐธ์กฐ.
์๋๋ Python ๊ฒฝ๋ก์์ ๋ฐ๋ก ์ป๋ ๋ํ ๊ฒฐ๊ณผ๋ค. ๊ณต์ ๋ณธ๋ฌธ, ์ฌ๋ฌด์ ํ, ์๋ฌธ ๋งํฌ๊ฐ ๊ฐ์ Company ๊ฐ์ฒด์์ ๋์จ๋ค.
import dartlab
c = dartlab.Company("005930") # ์ผ์ฑ์ ์
c.panel() # ๋ชจ๋ ํญ๋ชฉ, ๋ชจ๋ ๊ธฐ๊ฐ, ๋๋ํ โ ์ก๋ ์๊ฐ ๊ฒฉ์
# shape: (223, 14) โ ๊ณต์ ํญ๋ชฉ ร ๊ธฐ๊ฐ
# 2026Q1 2025Q4 2025Q3 2024Q4 ...
# (ํ์ง) v v v v
# ์ฌ์
์ ๋ด์ฉ v v v v
# ์ฌ๋ฌด์ํํ v v v vํ ์คํธ์ ์ซ์์ ์๊ณ์ด ์ํํ โ ์ ๊ธฐ๊ฐ ๋น๊ต ๊ฐ๋ฅ์ฑ์ ํต์ฌ
![]()
c.panel("IS") # ์์ต๊ณ์ฐ์ โ finance ์ ๊ทํ (๋ถ๊ธฐ ๊ธฐ๋ณธ)
c.panel("IS", freq="year") # freq๋ก ์ฐ๊ฐ ํฉ์ฐfinance ์ ๊ทํ โ XBRL ํ์ค๊ณ์ (snakeId) + ํ๊ธ ํญ๋ชฉ๋ช , ์ ๋จ์ ์ ๋ฐ ์ซ์
![]()
c.panel("is", freq="year") # native ์์ต โ ์ฌ์
๋ณด๊ณ ์ ํญ๋ชฉ ๊ทธ๋๋ก (2013~)
c.panel("ratios") # native ์ฌ๋ฌด๋น์จ, 5ํ ํญ๋ชฉ์ผ๋ก ๊ณ์ฐ์๋ฌธ์=native โ ์ฌ์ ๋ณด๊ณ ์ ํญ๋ชฉ ๊ทธ๋๋ก, XBRL ์ด์ ๊น์ง ๋ฟ๋ ๊น์ history (2013~)
![]()
c.panel("์ฌ์
") # ์ฌ์
๊ฐ์ ๋ฑ ๊ณต์ ๋ณธ๋ฌธ ํ ๊ฒ์
c.panel.search("์ฌ๊ณ ") # ๋ณธ๋ฌธ ์ ์ฒด ๊ฒ์
c.filings() # ๋ชจ๋ ๋ณด๊ณ ์ โ DART ๋ทฐ์ด๋ก ๋ฐ๋ก ์ฐ๊ฒฐ์ฌ์ ๋ณด๊ณ ์๋ถํฐ ๋ถ๊ธฐ๋ณด๊ณ ์๊น์ง, dartUrl๋ก ์๋ฌธ ์ฆ์ ํ์ธ
![]()
# ๊ฐ์ ์ธํฐํ์ด์ค, ๋ค๋ฅธ ๋๋ผ
us = dartlab.Company("AAPL")
us.panel("business")
us.panel("ratios")
# ์์ฐ์ด๋ก ์ง๋ฌธ
dartlab.ask("์ผ์ฑ์ ์ ์ฌ๋ฌด๊ฑด์ ์ฑ ๋ถ์ํด์ค")
# โ AI๊ฐ ์ฝ๋๋ฅผ ์คํํ๋ฉฐ ๋ถ์: "์์
์ด์ต๋ฅ ์ด 8.6%โ21.4%๋ก ๋ฐ๋ฑ..."API ํค ๋ถํ์. HuggingFace์์ ์๋ ๋ค์ด๋ก๋, ๋ก์ปฌ ์บ์๋ก ์ฆ์ ๋ก๋.
Company๊ฐ ์ข ๋ชฉ์ฝ๋ ํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ฉด, ์ธ ๊ฒน์ด ๋ถ์ํ๋ค.
- ๋ถ์ ์์ง โ ์ซ์๋ฅผ ๋ง๋ ๋ค. ๋ง์ง ์ถ์ด, ํ๊ธํ๋ฆ ํจํด, ๋ถ๋ ํ๋ฅ , ์ ์ข ๋น๊ต, ๋งคํฌ๋ก ์ฌ์ดํด. ํด์ํ์ง ์๋๋ค. ์ซ์์ ๊ทผ๊ฑฐ๋ง ์ ๊ณตํ๋ค.
- story (L3 ์กฐํฉ๊ธฐ) โ ๋ถ์์์ง X. L2 5 ๋ถ์์์ง ๋ผ๋ฆฌ์ import ์ํ์ ๋ง๊ธฐ ์ํด, story ๊ฐ ๋จ๋ ์ผ๋ก ๋ค์ค ๊ฒฐํฉ ์ฑ ์์ ์ง์ด์ง๋ค. ์์ง ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก ๋จ์๋ก ์กฐํฉํ์ฌ 11๊ฐ์ง ๋ณด๊ณ ์ ํ์ ร 7๊ฐ์ง ๊ธฐ์ ์ ํ ํ ํ๋ฆฟ. ํด์์ ์ ๊ณตํ์ง ์๋๋ค โ ๋ค์ํ ๊ด์ ์ ๊ทผ๊ฑฐ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ฐฐ์นํ๋ค.
- AI โ ์์ง์ ์ง์ ์ฐ๊ณ ํ๋จํ๋ค. ๊ฒฐ๊ณผ๋ฅผ ์์ฌํ๊ณ , ์๋ณธ์ผ๋ก ๊ฒ์ฆํ๊ณ , ์ด์ํ๋ฉด ๊ฐ์ ์ ๋ฐ๊ฟ์ ์ฌ๊ณ์ฐํ๋ค. dartlab์ ๋ํํ๋ ์ ๊ทน์ ๋ถ์๊ฐ.
ํ๋์ ํธ์ถ ๊ณ์ฝ. dartlab.์์ง() ์ผ๋ก ๊ฐ์ด๋ ๋ณด๊ณ dartlab.์์ง("์ถ") ์ผ๋ก ์คํ.
์ฒ์์ด๋ผ๋ฉด?
CompanyโStoryโAsk์์๋ก. ์ข ๋ชฉ์ฝ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ , ๋ณด๊ณ ์๋ฅผ ๋ง๋ค๊ณ , AI์๊ฒ ๋ฌผ์ด๋ณธ๋ค.
์์ง ์ด๋ฆ์ ํด๋ฆญํ๋ฉด ์ฌ์ฉ๋ฒ 4 ์น์ (
๊ณต๊ฐ ํธ์ถ ๋ฐฉ์ยทํธ์ถ ๋์ยท๋ํ ๋ฐํ ํํยท๊ธฐ๋ณธ ๊ฒ์ฆ) ์ผ๋ก ์ง์ ํ๋ค. ๋ชจ๋ ์์ง์ด ๊ฐ์ 4 ์น์ ์ ๊ฐ๋๋ค.
| ๋ ์ด์ด | ์์ง | ํ๋ ์ผ | ์ง์ ์ | ๋ ธํธ๋ถ |
|---|---|---|---|---|
| Data | Data | HuggingFace ์ฌ์ ๊ตฌ์ถ, ์๋ ๋ค์ด๋ก๋ | Company("005930") |
โ |
| L1 | Company | provider facade โ ๊ณต์ + ์ฌ๋ฌด์ ํ + ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ข ๋ชฉ์ฝ๋ ํ๋๋ก ํตํฉ | c.panel() |
Colab ยท marimo |
| L1 | Gather | ์ธ๋ถ ์์ฅ ๋ฐ์ดํฐ (์ฃผ๊ฐ/์๊ธ/๋งคํฌ๋ก/๋ด์ค) | dartlab.gather() |
Colab ยท marimo |
| L1.5 | Scan | ์ ์ข ๋ชฉ ์ฌ์ ๋น๋ (๊ฑฐ๋ฒ๋์ค/๋น์จ/ํ๊ธํ๋ฆ ๋ฑ parquet) | dartlab.scan() |
Colab ยท marimo |
| L2 | Analysis | ์ฌ๋ฌด ์ฌ์ธต ๋ถ์ (์์ต์ฑ/์์ ์ฑ/ํ๊ธํ๋ฆ) + ๊ฐ์นํ๊ฐ + ์ ๋ง | c.analysis("financial", "์์ต์ฑ") |
Colab ยท marimo |
| L2 | Quant | ๊ฐ๊ฒฉ ๊ธฐ๋ฐ ์ ๋ ์ ํธ (๊ธฐ์ /๋ฆฌ์คํฌ/ํฉํฐ/๋ฐฑํ ์คํธ) | c.quant() |
Colab ยท marimo |
| L2 | Credit | ๋ ๋ฆฝ ์ ์ฉํ๊ฐ (dCR ๋ฑ๊ธ, ๋ถ๋ํ๋ฅ , ๊ฑด์ ๋) | c.credit("๋ฑ๊ธ") |
Colab ยท marimo |
| L2 | Macro | ์์ฅ ๋ ๋ฒจ ๋งคํฌ๋ก (์ฌ์ดํด/๊ธ๋ฆฌ/์ ๋์ฑ/์ฌ๋ฆฌ/์์ฐ + ์๋๋ฆฌ์ค 110) | dartlab.macro("์ฌ์ดํด") |
Colab ยท marimo |
| L2 | Industry | ์ฐ์
๋งคํผ โ ์ ์์ฅ์ฌ ร ๊ณต์ ยท์ญํ ยท์คํธ๋ฆผ + ๊ณต๊ธ๋ง ์ฃ์ง (์ฐ์
์ง๋ /map) |
c.industry(), dartlab.industry("semiconductor") |
โ |
| L3 | Story | ์กฐํฉ๊ธฐ (๋ถ์์์ง X) โ L2 5์์ง (analysis ยท credit ยท macro ยท quant ยท industry) + L1.5 scan ๋ธ๋ก ์กฐํฉ. ์ํ์ฐธ์กฐ ๋ฐฉ์ง ์ฑ ์์. 11 ํ์ ร 7 ํ ํ๋ฆฟ (ํด์ ์ ํจ) | c.story("์์ต์ฑ") |
Colab ยท marimo |
| L4 | AI/Skills | skills ๊ฒ์ + DartLab ์คํ + ref ๊ฒ์ฐ์ ์ฐ๋ ๋ถ์ ์์ ๋ (์ฌ๋๋ L4) | dartlab.ask() |
Colab ยท marimo |
| L4 | Channel | ์ธ๋ถ ๊ณต์ โ dartlab channel ํ ์ค๋ก ํฐ์์ PC dartlab ์ฌ์ฉ |
dartlab channel |
โ |
| core | Search | ๊ณต์ ์๋งจํฑ ๊ฒ์ (beta โ ์ธ๋ฑ์ค ์ ์ ๋ ๋ถ์กฑ) | dartlab.search() |
Colab ยท marimo |
| facade | Listing | ์ข ๋ชฉ/๊ณต์/topic ์นดํ๋ก๊ทธ API | dartlab.listing() |
Colab ยท marimo |
| viz | Viz | ์ฐจํธ/๋ค์ด์ด๊ทธ๋จ (emit_chart) |
emit_chart({...}) |
โ |
์ค๊ณ: engines.company
์ธ ๊ฐ์ง ๋ฐ์ดํฐ ์์ค โ docs(์ ๋ฌธ ๊ณต์), finance(XBRL ์ฌ๋ฌด์ ํ), report(DART API ์ ํ ๋ฐ์ดํฐ) โ ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ํตํฉ. HuggingFace์์ ์๋ ๋ค์ด๋ก๋, ์ค์ ๋ถํ์.
c = dartlab.Company("005930")
c.panel() # ์ก๋ ์๊ฐ ๊ฒฉ์ -- ๊ณต์ ํญ๋ชฉ ร ๊ธฐ๊ฐ ์ ์ฒด
c.panel("BS") # ์ฌ๋ฌด์ํํ -- finance ์ ๊ทํ ์ซ์
c.panel("bs") # native ์ฌ๋ฌด์ํํ -- ์ฌ์
๋ณด๊ณ ์ ํญ๋ชฉ ๊ทธ๋๋ก (2013~)
c.panel("ratios") # native ์ฌ๋ฌด๋น์จ -- 5ํ ํญ๋ชฉ์ผ๋ก ๊ณ์ฐ
c.panel("๋งค์ถ") # ํญ๋ชฉ๋ช
ํ ๊ฒ์ (raw ๊ณต์)์ฃผ์(Notes) โ BS/IS ์ด์ก ์ด๋ฉด์ ํญ๋ชฉ๋ณ ๋ถํด. c.panel("topic")์ผ๋ก ์ฌ๋ฌด์ ํ์ ๊ฐ์ ํจํด์ผ๋ก ์ ๊ทผ. DART(K-IFRS HTML ํ์ฑ)์ EDGAR(US-GAAP XBRL ํ๊ทธ) ๋์ผ ์ธํฐํ์ด์ค.
c.panel(...) |
๋ด์ฉ | DART | EDGAR |
|---|---|---|---|
"inventory" |
์์ฌ๋ฃ/์ฌ๊ณตํ/์ ํ ๋ถํด | โ | โ |
"borrowings" |
๋จ๊ธฐ/์ฅ๊ธฐ ์ฐจ์ ๊ธ ๋ถํด | โ | โ |
"tangibleAsset" |
์ ํ์์ฐ ์ทจ๋์๊ฐ/๊ฐ๊ฐ์๊ฐ/์ฅ๋ถ๊ฐ | โ | โ |
"intangibleAsset" |
์์ ๊ถ/๊ฐ๋ฐ๋น ๋ฑ | โ | โ |
"receivables" |
๋งค์ถ์ฑ๊ถ + ๋์์ถฉ๋น๊ธ | โ | โ |
"provisions" |
๋ณด์ฆ/์์ก/๊ตฌ์กฐ์กฐ์ ์ถฉ๋น๋ถ์ฑ | โ | โ |
"eps" |
๊ธฐ๋ณธ/ํฌ์ ์ฃผ๋น์ด์ต | โ | โ |
"segments" |
๋ถ๋ฌธ๋ณ ๋งค์ถ/์ด์ต | โ | โ |
"costByNature" |
์์ฌ๋ฃ/๊ธ์ฌ/๊ฐ๊ฐ์๊ฐ ์ฑ๊ฒฉ๋ณ ๋น์ฉ | โ | โ |
"lease" |
์ฌ์ฉ๊ถ์์ฐ/๋ฆฌ์ค๋ถ์ฑ | โ | โ |
"affiliates" |
๊ด๊ณ๊ธฐ์ ์ง๋ถ๋ฒ ํฌ์ | โ | โ |
"investmentProperty" |
ํฌ์๋ถ๋์ฐ ๊ณต์ ๊ฐ์น/์ฅ๋ถ๊ฐ | โ | โ |
์ค๊ณ: engines.scan
์ ์ข ๋ชฉ ๋์ ํก๋จ ๋ถ์. ๊ฑฐ๋ฒ๋์ค, ์ธ๋ ฅ, ์ฃผ์ฃผํ์, ๋ถ์ฑ, ํ๊ธํ๋ฆ, ๊ฐ์ฌ, ๋ด๋ถ์, ์ด์ต์ ์ง, ์ ๋์ฑ, ๋คํธ์ํฌ, ๊ณ์ /๋น์จ ๋น๊ต ๋ฑ.
dartlab.scan("governance") # ์ ์ข
๋ชฉ ์ง๋ฐฐ๊ตฌ์กฐ
dartlab.scan("ratio", "roe") # ์ ์ข
๋ชฉ ROE
dartlab.scan("account", "๋งค์ถ์ก") # ์ ์ข
๋ชฉ ๋งค์ถ์ก ์๊ณ์ด2,500+ ์ข ๋ชฉ์ ๋งค์ถ์ก์ ํ ๋ฒ์ โ ๋ถ๊ธฐ๋ณ ์๊ณ์ด๋ก ์ฆ์ ๋น๊ต
![]()
์ค๊ณ: engines.panel
Company.panel์ด ํ ํ์ฌ๋ฅผ ํญ๋ชฉร๊ธฐ๊ฐ์ผ๋ก ์ํํํ๋ค๋ฉด, dartlab.compare๋ 2~6๊ฐ ํ์ฌ๋ฅผ ๊ฐ์ ํ ํฝยท์์ ๊ฒฉ์๋ก ์ ๋ ฌํ๋ค. scan์ฒ๋ผ ๋จ์ด ํ๋๋ก ๋ถ๋ฅด๋ ํฑ๋ ๋ฒจ verb โ ํ์ฌ ๊ฐ ๋น๊ต์ ๊ณต์ ํ๋ฉด์ด๋ค.
import dartlab
# ์ฃผ์ยท์์ ๋น๊ต โ disclosureKeyยทscopeยทleafType ์ ๋ ฌํค๋ก ํ์ฌ ๊ฐ ํ ํ ์ ๋ ฌ
dartlab.compare(["005930", "000660"], topic="์ฌ๊ณ ")
# ์ฌ๋ฌด์ ํ ์
๋น๊ต โ acode ๋จ์, ๊ฐ์ ์ ํ์ฐ (๋จ์ยท๋ผ๋ฒจ ์ฐฉ์ ์ ๊ฑฐ)
dartlab.compare(["005930", "000660"], topic="is", freq="year")
# ๋ค๊ธฐ๊ฐ โ ์
์ปฌ๋ผ์ด {code}โ{period} ๋ก ํ์ฌยท์์ namespace
dartlab.compare(["005930", "000660"], topic="์ ํ์์ฐ", period=["2025Q4", "2024Q4"])- label-drift ์๋ ํด์ โ ๊ฐ์ ํญ๋ชฉ์ด ํ์ฌ๋ง๋ค ๋ค๋ฅธ ์ ๋ฒํธ(์ผ์ฑ "7. ์ ํ์์ฐ" โ SK "11. ์ ํ์์ฐ")์ฌ๋ ํ ํ์ ์ ๋ ฌํ๋ค.
- ํ์ ์ค์ ๋ ฌ ์ฐจ๋จ โ ์ฐ๊ฒฐโ๋ณ๋(scope)ยทํโ์์ (leafType)์ด ๋ค๋ฅด๋ฉด ๊ฐ์ ํ์ ๋ณ์นํ์ง ์๋๋ค.
- ๊ฒฐ์์ NaN ์ ์ง โ 0 ์ฑ์ยทforward-fill ์์ด ๋น ์นธ์ ๊ทธ๋๋ก ๋๋ค(honest-gap, ์ถ์ธ ์๊ณก ๋ฐฉ์ง).
- ์์ฅ ๊ฒฝ๊ณ โ KOโUS ํผํฉ์ ๋ง๋๋ค. US(EDGAR)๋ ํ์ฌ row ๋น๊ต๋ง, ์ฌ๋ฌด ์ ๋น๊ต๋ DART(์ ํ์ฐ)๋ง ์ด๋ ค ์๋ค.
์ค๊ณ: engines.gather
์ฃผ๊ฐ, ์๊ธ, ๊ฑฐ์์งํ, ๋ด์ค โ Polars DataFrame์ผ๋ก.
dartlab.gather("price", "005930") # KR OHLCV
dartlab.gather("price", "AAPL", market="US") # US ์ฃผ๊ฐ
dartlab.gather("macro", "FEDFUNDS") # ์๋ US ๊ฐ์ง
dartlab.gather("news", "์ผ์ฑ์ ์") # Google News RSS๋๋ ๋ฐ์ดํฐ batch ์ํ โ ์ธ์ฌ์ด๋ ๊ฑฐ๋ยท์ง๋ถยท๋ด์ค๋ฅผ generator ๋ก ๋ถํ yield (๋ฉ๋ชจ๋ฆฌ ์์ , ์ ์ข ๋ชฉ ์ค์บ์ฉ):
from dartlab.gather.accessors import DefaultFinanceAccessor
a = DefaultFinanceAccessor()
for batch in a.iterNews("์ผ์ฑ์ ์", days=30, batchSize=100):
process(batch)
# ๋ํ: a.iterInsiderTrades("005930") ยท a.iterOwnership("005930")
# ์ผ๊ด: a.fetchInsiderTrades / fetchOwnership / fetchNewsgetDefaultGather() ์ฑ๊ธํด์ thread-safe (๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ ๋จ์ผ ์ธ์คํด์ค ๋ณด์ฅ). ์บ์ ํต๊ณยทsource fallback ์ ํธ๋ getCacheStatsSnapshot() ยท DARTLAB_TELEMETRY=stdout ์ผ๋ก ์ถ์ .
์ค๊ณ: engines.analysis
์์ต๊ตฌ์กฐ โ ์์ต์ฑ โ ์ฑ์ฅ์ฑ โ ์์ ์ฑ โ ํ๊ธํ๋ฆ โ ์๋ณธ๋ฐฐ๋ถ โ ๊ฐ์นํ๊ฐ โ ์ ๋ง. ์๋ณธ ์ฌ๋ฌด์ ํ๋ฅผ ์ธ๊ณผ ์์ฌ๋ก ๊ฐ๊ณตํ๋ค.
c.analysis("financial", "์์ต์ฑ") # ์์ต์ฑ ๋ถ์
c.analysis("์์ต์ฑ") # ๋จ์ถํ (financial ์๋)
print(c.credit()) # ์ฌ์ฉ ๊ฐ๋ฅํ ์ถ ๊ฐ์ด๋ DataFrame (self-discovery)
c.credit("๋ฑ๊ธ") # dCR-AA, ๊ฑด์ ๋ 93/100
c.credit("๋ฑ๊ธ", detail=True) # ๋ฑ๊ธ + ์์ฌ + ์งํ ์๊ณ์ด์ค๊ณ: engines.credit | ๋ณด๊ณ ์: eddmpython.github.io/dartlab/blog/credit-reports
3-Track ๋ชจ๋ธ(์ผ๋ฐ/๊ธ์ต/์ง์ฃผ) + Notch Adjustment + CHS ์์ฅ ๋ณด์ + ๋ณ๋์ฌ๋ฌด ๋ธ๋ ๋ฉ.
79๊ฐ์ฌ ๊ฒ์ฆ: ๋๊ธฐ์ 87% (26/30), ์ค๋ํ 82% (41/50), ์ ์ฒด 70% (55/79, v5.0 ๊ณผ๋ํ๊ฐ ์์ ํ ์ฌ์ธก์ ์์ ). ์ผ์ฑ์ ์ AA+ ์ ํ ์ผ์น. ๊ฒ์ฆ ๋ฐฉ๋ฒ๋ก ์ methodology ์ฐธ์กฐ.
print(c.credit()) # self-discovery โ ์ฌ์ฉ ๊ฐ๋ฅํ ์ถ + ์ข
ํฉ ๋ฑ๊ธ
cr = c.credit("๋ฑ๊ธ") # ์ข
ํฉ ๋ฑ๊ธ
print(cr["grade"]) # dCR-AA+
print(cr["healthScore"]) # 96 (0-100, ๋์์๋ก ๊ฑด์ )
print(cr["pdEstimate"]) # 0.01% ๋ถ๋ํ๋ฅ
cr = c.credit("๋ฑ๊ธ", detail=True) # ๋ฑ๊ธ + ์์ฌ + ์งํ + ๊ดด๋ฆฌ ์ค๋ช
print(cr["divergenceExplanation"]) # ์ ํ์ฌ์ ์ ๋ค๋ฅธ์ง์ ์ฉ๋ถ์ ๋ณด๊ณ ์ ๋ฐ๊ฐ (credit ์์ฌ + ์ ํ์ฌ ๋์กฐ๊ฐ story 5๋ง์ ์๋ ํตํฉ):
from dartlab.story.publisher import publishReport
publishReport("005930") # 6๋ง ๋ณด๊ณ ์ (credit narrative + audit ํฌํจ)์ค๊ณ: engines.macro
Company ์์ด ๊ฒฝ์ ํ๊ฒฝ์ ๋ถ์ํ๋ค. import dartlab ํ๋๋ก.
dartlab.macro("์ฌ์ดํด") # ๊ฒฝ๊ธฐ 4๊ตญ๋ฉด ํ๋ณ
dartlab.macro("๊ธ๋ฆฌ") # ๊ธ๋ฆฌ + Nelson-Siegel ์์ต๋ฅ ๊ณก์
dartlab.macro("์์ธก") # LEI + ์นจ์ฒดํ๋ฅ + Hamilton RS + GDP Nowcast
dartlab.macro("์ข
ํฉ") # ๋งคํฌ๋ก ์ข
ํฉ + ํฌ์์ ๋ต + ํฌํธํด๋ฆฌ์ค ๋งคํ์์ฅ ์ฌ์ดํดยท๊ธ๋ฆฌยท์ ๋์ฑยท์ฌ๋ฆฌยท์์ฐ ์ ํธ์ ๊ธ๋ก๋ฒ ๊ฑฐ์ ๋ถ์ ๋ฐฉ๋ฒ๋ก (Hamilton EM, Kalman DFM, Nelson-Siegel, Cleveland Fed ํ๋ก๋น, Sahm Rule, BIS Credit-to-GDP)์ numpy๋ง์ผ๋ก ์ง์ ๊ตฌํ.
๋ฐฑํ ์คํธ ์ค์ฆ (2000-2024, FRED): Cleveland Fed ํ๋ก๋น์ด ๋ฏธ๊ตญ 3/3 ์นจ์ฒด๋ฅผ 2-16๊ฐ์ ์ ์ ์ฌ์ ๊ฐ์ง, recall 90%.
์ค๊ณ: engines.story
analysis๋ฅผ ๊ตฌ์กฐํ ๋ณด๊ณ ์๋ก ์กฐ๋ฆฝ. 4๊ฐ ์ถ๋ ฅ ํ์: rich(ํฐ๋ฏธ๋), html, markdown, json.
c.story() # ์ ์ฒด ๋ณด๊ณ ์
dartlab.ask() # ๋ณด๊ณ ์ + AI ์ข
ํฉ์๊ฒฌ์ผ์ฑ์ ์ ๋ณด๊ณ ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: "๋งค์ถ +23.8% ์ฑ์ฅ, ์์ ์ด์ต๋ฅ 8.6%โ21.4% ๋ฐ๋ฑ. FCF ์์ ์ ํ, ROIC > WACC โ ์ฌํฌ์๊ฐ ๊ฐ์น๋ฅผ ์ฐฝ์ถํ๋ ๊ตฌ๊ฐ."
์ค๊ณ: engines.story ยท ์๋ฆฌ์ฆ: ๊ธฐ์ ์ด์ผ๊ธฐ
๊ธฐ์ ๋ถ์์ ๋น์จ ๋์ด์ด ์๋๋ค. DartLab์ 5๊ฐ ์์ง(analysis, credit, scan, quant, macro)์ ๊ฒฐ๊ณผ๋ฅผ 6๋ง ์คํ ๋ฆฌํ ๋ง ๊ตฌ์กฐ๋ก ์กฐํฉํด ๋ธ๋ก๊ทธ์ ๋ฐ๊ฐ ๊ฐ๋ฅํ ๊ธฐ์ ์ด์ผ๊ธฐ๋ฅผ ์๋ ์์ฑํ๋ค.
from dartlab.story.publisher import publishReport
publishReport("068270") # ์
ํธ๋ฆฌ์จ โ 6๋ง ๊ธฐ์
์ด์ผ๊ธฐ ์๋ ๋ฐ๊ฐ๋ฐ๊ฐ๋ ๊ธฐ์ ์ด์ผ๊ธฐ:
| ๊ธฐ์ | ์ด์ผ๊ธฐ |
|---|---|
| SKํ์ด๋์ค | ํ๊ตญ ๋ฐ๋์ฒด 30๋ ์ ๋ฏธ์คํฐ๋ฆฌ, ์์ ์ด์ต๋ฅ 58% |
| ์ผ์์ํ | ๋ผ๋ฉด ๋น 3 ๊ผด๋ฑ์ด ๋งค์ถ 2.3์กฐ ๊ธ๋ก๋ฒ ์ํ ๊ฑฐ์ธ์ด ๋๊ธฐ๊น์ง |
| ๋์ฐ์๋๋น๋ฆฌํฐ | ๋ถ์ฑ๋น์จ 305%์์ 129%๊น์ง, 9๋ ๋ค์ด์ดํธ์ ์ง์ง ๋ชจ์ต |
| ์ํ ์ค์ | 9๋ ์ ์ ๋ฐ์ด์คํ ์ด ํ ๊ฑด์ ๋ผ์ด์ ์ค๋ก ์์ ์ด์ต +1,069์ต |
| HMM | ์์ฅ์ด ์๋๋ผ ์ฌ์ดํด์ด ์ฃผ๊ฐ๋ฅผ ๊ฒฐ์ ํ๋ ํ์ฌ |
| ์ ํธ๋ฆฌ์จ | IMF๋ก ์ง์ฅ ์์ 41์ธ, 5์ฒ๋ง์์ผ๋ก ์์ํด 25๋ ํ ๋ฌดํ์์ฐ 13.78์กฐ |
| ํํ์์ด๋ก์คํ์ด์ค | ์ผ์ฑ์ด 8,400์ต์ ๋ฒ๋ฆฐ ๋ฌด๊ธฐ๊ฐ ์์ฃผ์๊ณ 37์กฐ๊ฐ ๋๋ค |
| HDํ๋์ผ๋ ํธ๋ฆญ | 7๋ ์ ์ ์ 1,006์ต์ด ์ฌํด 1์กฐ๊ฐ ๋๋ค, ๋ณ์๊ธฐ ํ๋๋ก |
| ๊ณ ๋ ค์์ฐ | 50๋ ๋ง์ ์ฒซ ์์์ค 2,457์ต, ๊ทธ๋ฐ๋ฐ ์์ ์ด์ต์ ์ฌ์ ์ต๋ |
| ์์ดํผ์ | ํ์ฅํ ํ์ฌ๊ฐ ๊ฐ์ ์ 4,070์ต ํ์๋ค, ๊ทธ๊ฒ ์์์ด์๋ค |
์ค๊ณ: engines.search
HuggingFace current search artifact ๋ฅผ ์๋ ์ฌ์ฉํ๋ค. Search Index Delta ์ Data Prebuild ๊ฐ source manifest ๊ธฐ์ค์ผ๋ก ์ฆ๋ถ ๋ฐ์ํ๋ฉฐ, source๋ณ ์ต์ ์ฑ์ ๊ฒฐ๊ณผ์ dataAsOf/sourceRef ๋ก ํ์ธํ๋ค. ๋น์ผ ๋ฏธ๋ฌ ์ ๋จ์ผ ์ข
๋ชฉ ๊ณต์ ํ์ธ์ Company.disclosure / Company.liveFilings ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค.
๋ชจ๋ธ ์์, GPU ์์, cold start ์์. 400๋ง ๋ฌธ์ 95% ์ ๋ฐ๋ โ ์๋ฒ ๋ฉ๋ณด๋ค ์ ํ, 1/100 ๋น์ฉ. ๋ฒค์น๋งํฌ ์์ธ๋ methodology ์ฐธ์กฐ.
dartlab.search("์ ์์ฆ์ ๊ฒฐ์ ") # ์ ์์ฆ์ ๊ณต์ ์ฐพ๊ธฐ
dartlab.search("๋ํ์ด์ฌ ๋ณ๊ฒฝ", corp="005930") # ์ข
๋ชฉ ํํฐ
dartlab.search("ํ์ฌ๊ฐ ๋์ ๋น๋ ธ๋ค") # ์์ฐ์ด๋ ๋์์ค๊ณ: operation.opsAsSkills ยท ๋ฃจํ ๊ฐ์: ์๋จ ํตํฉ ์ํคํ ์ฒ
dartlab.ask("์ผ์ฑ์ ์ ์ฌ๋ฌด๊ฑด์ ์ฑ ๋ถ์ํด์ค")
dartlab.ask("์ผ์ฑ์ ์ ๋ถ์", provider="gemini") # ๋ฌด๋ฃ provider ์ฌ์ฉ ๊ฐ๋ฅProvider: gemini(๋ฌด๋ฃ), groq(๋ฌด๋ฃ), cerebras(๋ฌด๋ฃ), oauth-codex(ChatGPT ๊ตฌ๋
), openai, ollama(๋ก์ปฌ) ๋ฑ. Rate limit ์ ์๋ ๋์ฒด.
์ค๊ณ: runtime.channel
PC์์ ํ ์ค์ด๋ฉด ํฐ์์ dartlab UI ๊ทธ๋๋ก ์ฌ์ฉ. Microsoft DevTunnels ์๋ ์ ์ .
dartlab channelํ๋ฆ:
- winget์ผ๋ก devtunnel CLI ์๋ ์ค์น (์ต์ด 1ํ)
- GitHub OAuth 1ํ ์ธ์ฆ (๋ธ๋ผ์ฐ์ ์๋ ์คํ)
- ์๊ตฌ URL + QR ๋ฐ๊ธ (
https://<id>-8400.<region>.devtunnels.ms) - ํฐ Chrome์ URL/QR ์ ๋ ฅ โ dartlab UI ๊ทธ๋๋ก ๋์
๋๋ฉ์ธ 0๊ฐ, ํ ํฐ ํธ๋ฆญ 0๊ฐ. VS Code Remote Tunnels์ ๋์ผ ์ธํ๋ผ๋ผ ๋ชจ๋ฐ์ผ ํธํ์ฑ ๊ฒ์ฆ๋จ. ๋ฉ์์ง ๋ด ์ต์
(--telegram/slack/discord) ๋ ์ง์.
๊ฐ์ ์ธํฐํ์ด์ค, ๋ค๋ฅธ ๋ฐ์ดํฐ ์์ค. SEC API์์ ์๋ ์์ง, ์ฌ์ ๋ค์ด๋ก๋ ๋ถํ์.
# Korea (DART) # US (EDGAR)
c = dartlab.Company("005930") c = dartlab.Company("AAPL")
c.panel() c.panel()
c.panel("์ฌ์
") c.panel("business")
c.panel("BS") c.panel("BS")
c.panel("ratios") c.panel("ratios")
c.panel("๋งค์ถ") c.panel("revenue")๋ฃจํยท๋๊ตฌ ํ๋ฉด ๊ฐ์: ์๋จ ํตํฉ ์ํคํ ์ฒ
MCP ์๋ฒ ๋ด์ฅ. canonical 6 ๋๊ตฌ + ask ๋ฉํ๋ก ์ธ๋ถ LLM ์ด dartlab ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ RunPython ์์์ ์ง์ ํธ์ถํ๋ ํจํด (๋๊ตฌ ํ๋ฉด์ ์ขํ ํ ํฐ ๋น์ฉ โ, ๋๊ตฌ ์ ํ ์ ํ๋ โ).
uvx dartlab mcp ์ cold start ๊ฐ Claude Desktop attach timeout ์์ ๋ค์ด๊ฐ์ง ๋ชปํ๋ฏ๋ก ์ฌ์ ์ค์น + entry point ์ง์ ํธ์ถ ์ด ์ ๋ณธ์
๋๋ค. command: "python" ์ Microsoft Store Python ํ๊ฒฝ์์ spawn ENOENT ๋ก ์คํจํ ์ ์์ด (์ด์ #28), command: "dartlab" ์ผ๋ก entry point ๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒ ๊ฐ์ฅ ๊ฒฌ๊ณ ํฉ๋๋ค.
# 1. ์ฌ์ ์ค์น (ํ ๋ฒ๋ง) โ .local/bin/dartlab(.exe) entry point ์์ฑ
uv tool install dartlab # ๋๋: pipx install dartlab# 2-B. Claude Code ํ ์ค ์ค์
claude mcp add dartlab -- dartlab mcp
# 2-C. Codex CLI
codex mcp add dartlab -- dartlab mcpdartlab ๋ช
๋ น์ด PATH ์ ์กํ์ง ์๋ ํ๊ฒฝ (ํ์ ์ ) ์ด๋ผ๋ฉด ์ ๋ ๊ฒฝ๋ก๋ก ์ ์ด์ฃผ์ธ์:
{
"mcpServers": {
"dartlab": {
"command": "C:\\Users\\<user>\\.local\\bin\\dartlab.exe", // Windows
// "command": "/Users/<user>/.local/bin/dartlab", // macOS / Linux
"args": ["mcp"],
"env": { "PYTHONUNBUFFERED": "1", "PYTHONUTF8": "1" }
}
}
}๊ฐ์ ์ถ๋ ฅ์
dartlab mcp --config claude-desktop/dartlab mcp --config claude-code๋ก๋ ๋ฐ์ ์ ์์ต๋๋ค. ํ๋ก์ ํธ.mcp.json์๋ ์์ฑ:dartlab mcp --install.
{
"mcpServers": {
"dartlab": {
"url": "https://eddmpython-dartlab.hf.space/mcp/sse"
}
}
}HuggingFace Spaces ํธ์คํ . DART API ํค ๋ถํ์. Claude Desktop ๋ฐ์คํฌํฑ ์ฑ์ stdio ๋ง ๋ฐ์ผ๋ฏ๋ก ์ด URL ๋ฐฉ์์ reject ํฉ๋๋ค โ ์ stdio ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ธ์.
์ค์ tools/list ํ๋ฉด์ ์๋ 11 ๊ฐ์
๋๋ค. Skill ๋ณธ๋ฌธ ์ ์ฒด ์กฐํ๋ ๋ณ๋ advertised tool ์ด ์๋๋ผ ReadSkill ๊ฒฐ๊ณผ์ dartlab://skills/{id} resource ๊ฒฝ๋ก๋ก ์ฒ๋ฆฌํฉ๋๋ค.
| ๋๊ตฌ | ์ญํ |
|---|---|
| ask | dartlab chat-native ๋ฃจํ โ LLM ์์จ ๋๊ตฌ ํธ์ถ + Ref ๊ฒ์ฐ ์ผ๊ด |
| ReadSkill | ๊ณต์ Skill OS ๊ฒ์ + frontmatter + ๋ณธ๋ฌธ preview |
| ReadCapability | dartlab ๊ณต๊ฐ API/docstring ๊ฒ์ |
| RunPython | dartlab + Polars ์ฝ๋ ์คํ โ executionRef/valueRef/tableRef |
| WebSearch | ์ธ๋ถ ์ต์ ์ ๋ณด โ webRef (untrusted ๋ง์ปค ์๋ ์ ์ฉ) |
| SaveArtifact | ํฐ ํยท์ฐจํธ ๋ณ๋ ์ ์ฅ โ artifactRef |
| CompileVisual | ์ฐจํธ spec codegen โ visualRef |
| LookAheadGuard | ๋ต๋ณ ์ ๋๋ฝ๋ ๋ค์ ์ง๋ฌธยท๊ฒ์ฐ ํฌ์ธํธ ์ ๊ฒ |
| GroundingCheck | ์ซ์ยท๋ ์งยท์ถ์ฒ grounding ๊ฒ์ฐ |
| RequestUserInput | MCP elicit ์ง์ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉ์ ์ ๋ ฅ ์์ฒญ |
์ 33 generated ๋๊ตฌ (
companyAnalysis/companyStory/marketScan๋ฑ) ๋ 0.10 ๋ถํฐ ํ๊ธฐ โ ๋ชจ๋RunPython์์์dartlab.Company / dartlab.scan / dartlab.macro์ง์ ํธ์ถ. ๋ง์ด๊ทธ๋ ์ด์ ์ CHANGELOG ์ฐธ์กฐ.
DartLab ์๋ ๋ ๊ฐ์ง ์คํฌ ์ธต์ด ์์ต๋๋ค.
| ์ธต | ์์น | ์ญํ |
|---|---|---|
| builtin Skill OS | src/dartlab/skills/specs/** ยท /skills |
๊ณต์ ์ด์ยท์์งยท๋ถ์ ์ ์ฐจ์ ๋๋ค. ํจํค์ง์ ํจ๊ป ๋ฐฐํฌ๋๋ฉฐ AI ๊ฐ ๋จผ์ ๊ฒ์ํฉ๋๋ค. |
| community Skill Market | GitHub Discussions ยท /skills/market ยท ์ ์ marketIndex.json |
์ฌ์ฉ์๊ฐ ๊ณต์ ํ ๋ถ์ ์ง๋ฌธ์ Forge ๊ฐ ๊ตฌ์กฐํํ ์ปค๋ฎค๋ํฐ ์คํฌ์ ๋๋ค. ํจํค์ง builtin ์ ํฌํจ๋์ง ์์ต๋๋ค. |
์ด์ ํ๋ฆ์ ๋จ์ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ GitHub Discussions ์ ๋ถ์ ์ง๋ฌธ์ ์๋๋ค. DartLab Forge ๊ฐ ์๋ฌธ๊ณผ ๋๊ธ์ ์ฝ๊ณ intent, inputs, dataSources, procedure, executionPlan, outputs, outputSchema, criteria, forbidden, completionCriteria ๋ฅผ ๊ตฌ์กฐํํฉ๋๋ค. ์ด์๊ณผ ๋ณด์ ์ค์ธ ํญ๋ชฉ์ marketIndex.json ์๋ง ๋จ๊ณ ์ต์ข
์คํฌ snapshot ์ ๋ง๋ค์ง ์์ต๋๋ค. Maintainer ๊ฐ ์์ฑ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ค๊ณ ๊ฒํ ํด /market runnable, /market curated, /market builtin-candidate ๋ก ํ์ฌ revision ์ ํ์ ํ ๋๋ง GitHub Action ์ด items/{id}.json accepted snapshot ์ ์์ฑํฉ๋๋ค. ๋๋ฉ์ Skill Market ๊ณผ AI ๋๊ตฌ ReadSkillMarket ์ด ์ด ์ ์ artifact ๋ฅผ ๊ฒ์ํฉ๋๋ค.
์ฌ๊ธฐ์ ์คํฌ์ ์นด๋๊ฐ ์๋๋ผ ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ถ์ ํ์์ ๊ณ์ฝ์
๋๋ค. ์ต์ข
๊ณต์ ์คํฌ์ ์ด๋ค DartLab ์์ง์ด๋ recipe ๋ฅผ ์ด๋ค ์์๋ก ํธ์ถํ๋์ง executionPlan ์ ํฌํจํด์ผ ํฉ๋๋ค. mappedBuiltinSkills ๋ ์ฐธ๊ณ ์ฐ๊ฒฐ์ผ ๋ฟ์ด๋ฉฐ, executionPlan ์ด ์์ผ๋ฉด marketCurated ๋๊ธ์ด ์์ด๋ ์ต์ข
snapshot ์ ๋ง๋ค์ง ์์ต๋๋ค.
marketCurated ๋ Skill Market ์์์ ์์ฑ๋ ๊ณต์ ์คํฌ์
๋๋ค. builtin ํธ์
์ ๋ปํ์ง ์์ต๋๋ค. ์์ฑ๋ ๊ณต์ ์คํฌ์ Discussion ๊ณผ accepted item snapshot ์ ๋จ๊ณ , AI ๋ sourceUrl ๊ณผ trustTier ๋ฅผ ํ์ํ ๋ค ๋ณด์กฐ ์ ์ฐจ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. builtinCandidate ๋ ์์ธ์ ์ธ ์ฅ๊ธฐ ๊ฒํ ์ํ์
๋๋ค. ๊ธฐ๋ณธ ์ด์ ๊ฒฝ๋ก๋ ํ ๋ก ์์ ์์ฑํ ๊ณต์ ์คํฌ์ Skill Market ์ ๋จ๊ธฐ๋ ๊ฒ์
๋๋ค.
์ต์ข
์คํฌ์ Discussion ์ ๋ง์ง๋ง ๋๊ธ์ด๋ body ์์ฒด๊ฐ ์๋๋ผ ์น์ธ๋ items/{id}.json snapshot ์
๋๋ค. items/{id}.json ์ด ์์ผ๋ฉด ์์ง ์ต์ข
์คํฌ์ด ์๋๋๋ค. ๋๊ธ์ ํ ๋ก ๊ณผ ๊ธฐ์ฌ ๊ธฐ๋ก์
๋๋ค. ์์ฑ ๋ค ์ ๋๊ธ์ด ๋ฌ๋ฆฌ๋ฉด ๊ธฐ์กด ์ต์ข
์คํฌ์ ์ฆ์ ๋ฐ๋์ง ์๊ณ revisionStatus: pendingReview ๋ก ํ์๋ฉ๋๋ค. Maintainer ๊ฐ revision draft ๋ฅผ ๊ฒํ ํ๊ณ ๋ค์ ์น๊ฒฉํ๋ฉด ๊ทธ๋ item snapshot, marketIndex.json, ๋๋ฉ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐฑ์ ๋ฉ๋๋ค.
Discussion ์ด์์ ์์ด๋์ด โ Caller Audit โ executionPlan ์ด์ โ ์์ ์
๋ ฅ/๊ธฐ๋ ์ถ๋ ฅ โ ์ด์์ ํ์ โ accepted snapshot ์์์
๋๋ค. ๋๊ธ์ด ์ถ๊ฐ๋๋ฉด ๊ธฐ์กด snapshot ์ ์ ์ง๋๊ณ ์ ๋๊ธ์ pending revision ์ผ๋ก๋ง ํ์๋ฉ๋๋ค. ๋ค์ ํ ๋ก ํด์ ์ด์์๊ฐ ํ์ ํ๋ฉด items/{id}.json ์ด vN+1 ๋ก ๊ฐฑ์ ๋ฉ๋๋ค.
์์ธ: ๋ธ๋ก๊ทธ โ ์์ ยท๋ธ๋ผ์ฐ์ ยท๋ ธํธ๋ถ์์ ์ค์น ์์ด dartlab ์ฐ๊ธฐ (Pyodide)
Pyodide๊ฐ CPython์ WebAssembly๋ก ํฌํ ํ ๋์ ํ์ด์ฌ์ด ์ค์น๋์ง ์์ ํ๊ฒฝ์์๋ dartlab์ด ๊ทธ๋๋ก ๋๋ค. ๊ฐ์ API, ๊ฐ์ ๋ฐ์ดํฐ.
์ง์ ํ๊ฒฝ: xlwings Lite (Excel) ยท Anaconda Code (Excel) ยท JupyterLite ยท Google Colab WASM ๋ฐํ์ ยท marimo (pyodide) ยท ์์ HTML ์๋ฒ ๋.
๐ ์น ์์ ์์ ๋ฐ๋ก ์ด์ด๋ณด๊ธฐ โ OneDrive ๊ณต์ ์ํฌ๋ถ โ xlwings Lite + dartlab ์ธํ ์๋ฃ. ๋ฒํผ๋ง ๋๋ฅด๋ฉด ์ํธ์ ์ฌ๋ฌด์ ํ๊ฐ ์ฐํ๋ค.
xlwings Lite๋ ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค. @script๋ ๋ฒํผํ(๋ช
๋ นํ), @func๋ ์์ํ(์ ์ธํ). dartlab์ ๋ ๋ค ์ง์ํ๋ฉฐ, ํจ์ํ์ด dartlab์ ์์
๋ต๊ฒ ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
1. @script โ ์ฌ์ด๋๋ฐ ๋ฒํผ โ ์ํธ์ ์ฑ์ฐ๊ธฐ
import dartlab
import xlwings as xw
from xlwings import arg, func, script
@script(name="isTest")
def finance(book: xw.Book):
c = dartlab.Company('000020')
df = c.panel('IS')
data = [list(df.columns)] + [list(r) for r in df.iter_rows()]
sheet = book.sheets.active
sheet["A3"].value = data2. @func โ ์์
์
์ ์์์ฒ๋ผ =GETFINANCE("005930")
@func
def getFinance(code: str):
c = dartlab.Company(code)
df = c.panel('IS')
data = [list(df.columns)] + [list(r) for r in df.iter_rows()]
return data<img src=".github/assets/xlwings-lite-func.webp" alt="xlwings Lite โ @func ๋ชจ๋, ์ ์ =GETFINANCE("005930")๋ง ์ณ๋ 5๋ถ๊ธฐ IS๊ฐ ์๋ ์คํ" width="720">
VLOOKUP๊ณผ ๋๋ํ =GETFINANCE๊ฐ ์์
๋ค์ดํฐ๋ธ ํจ์๋ก ๋์ํ๋ค. ์ข
๋ชฉ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ฉด ์
์ฌ๊ณ์ฐ์ผ๋ก ์ ๋ถ ๊ฐฑ์ ๋๋ค.
import micropip
await micropip.install(["diff-match-patch", "openpyxl"])
await micropip.install(
"https://huggingface.co/eddmpython/dartlab-data/resolve/main/pyodide/dartlab-latest-py3-none-any.whl",
deps=False,
)
import dartlab
c = dartlab.Company("005930")
c.panel("IS")๋๋ xlwings Lite ์ฌ์ด๋๋ฐ์ requirements.txt์ dartlab ํ ์ค โ ๊ทธ๊ฒ๋ง์ผ๋ก ๋. ๋ก์ปฌ ํ์ด์ฌ 0์ค, uv 0์ค, venv 0์ค.
| ๊ธฐ๋ฅ | Pyodide | ๋น๊ณ |
|---|---|---|
Company() ยท c.panel() ยท analysis ยท story ยท credit |
โ | HF parquet ์๋ ๋ค์ด๋ก๋ |
dartlab.ask() |
โ | API ํค ์ค์ ํ์ (geminiยทopenai CORS OK) |
dartlab.scan() |
โ | ์ฌ์ ๋น๋ parquet 271MB (๋ธ๋ผ์ฐ์ ๋นํ์ค์ ) |
dartlab.gather() |
โ | NaverยทYahooยทGoogle News CORS ์ฐจ๋จ |
์ค๋ ๋ ์์ ยท MEMFS ํ๋ฐ ยท CORS ๋ฏธํ์ฉ API ๋ถ๊ฐ โ ์ด ์ธ ์ ์ฝ์ด ๊ทผ๋ณธ์ด๋ค. ์์ธ์ ๋น๋ ํ์ดํ๋ผ์ธ์ pyodide/README.md, ์ค์น 5๋จ๊ณ ์คํฌ๋ฆฐ์ท์ ๋ธ๋ก๊ทธ ๊ธ์ ๋ณธ๋ค.
from dartlab import OpenDart, OpenEdgar
# ํ๊ตญ (opendart.fss.or.kr ๋ฌด๋ฃ API ํค ํ์)
d = OpenDart()
d.filings("์ผ์ฑ์ ์", "2024")
d.finstate("์ผ์ฑ์ ์", 2024)
# ๋ฏธ๊ตญ (API ํค ๋ถํ์)
e = OpenEdgar()
e.filings("AAPL", forms=["10-K", "10-Q"])๋ชจ๋ ๋ฐ์ดํฐ๋ HuggingFace์ ์ฌ์ ๊ตฌ์ถ โ ์๋ ๋ค์ด๋ก๋. EDGAR๋ SEC API ์ง์ ์์ง. ์ฌ์ฉ์๋ ๋ฐ์ดํฐ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ณด๊ณ ์ Skill Market ์์ด๋์ด์ ์ ๋ ฅ์ผ๋ก ์ผ์ ์ ์๋ค.
| ์นดํ ๊ณ ๋ฆฌ | ํฌํจ ๋ฐ์ดํฐ | ๋ํ ์ฌ์ฉ |
|---|---|---|
| DART docs | ์ฌ์ ๋ณด๊ณ ์ยท๋ถ๊ธฐ๋ณด๊ณ ์ ์๋ฌธ ์น์ , ์ฃผ์, ํ ์คํธ ํ ํฝ | ๊ณต์ ๋ณํ, ๋ฆฌ์คํฌ, ์ฌ์ ์ค๋ช |
| DART finance | K-IFRS XBRL ์ฌ๋ฌด์ ํ, ํ์ค ๊ณ์ , ๊ธฐ๊ฐ ๋น๊ต | Company.show, analysis, credit |
| DART report | OpenDART ์ ํ ํญ๋ชฉ, ์์ยท์ง์ยท๋ฐฐ๋นยท์ง๋ถ ๋ฑ | ์ง๋ฐฐ๊ตฌ์กฐ, ๋ฐฐ๋น, ์ธ๋ ฅ, ์๋ณธ์ ์ฑ |
| DART scan | ์ ์ข ๋ชฉ ํก๋จ ์ค์บ์ฉ ํ๋ฆฌ๋น๋ ์งํ | peer ๋น๊ต, ๋ญํน, ์ด์์น ํ์ |
| EDGAR | SEC filing, US-GAAP XBRL, 10-K/10-Q/8-K | ๋ฏธ๊ตญ ๊ธฐ์ ๋ถ์, ํ๋ฏธ ๋น๊ต |
| Gather | ๊ฐ๊ฒฉ, ์๊ธ, ๋ด์ค, ๊ฑฐ์์งํ(FREDยทECOS), ์ธ๋ถ ๋ณด์กฐ ๋ฐ์ดํฐ | ์์ฅ ๋ฐ์, ์ด๋ฒคํธ, macro recipe |
| Reference | ์ฐ์ ๋งต, capability, ๋ ๋๋งยท๋งคํ ๊ธฐ์ค | Skill OS, ์ฐจํธ, ๋ณด๊ณ ์ ์กฐ๋ฆฝ |
ํ์ดํ๋ผ์ธ: ๋ก์ปฌ ์บ์(์ฆ์) โ HuggingFace(์๋ ๋ค์ด๋ก๋) โ DART API(ํค ํ์). ๋๋ถ๋ถ ์ฒ์ ๋ ๋จ๊ณ๋ก ์ถฉ๋ถ.
๋ ธํธ๋ถ (Colab): Company ยท Gather ยท Scan ยท Quant ยท Analysis ยท Macro ยท Credit ยท Story ยท AI
๋
ธํธ๋ถ (marimo): ์ ์ฒด ๋ชฉ๋ก โ import ๋ฐ๋ณต ์๋ ๋จ์ผ ์ง์
, ์
๋ง๋ค ์ฃผ์ ์ค๋ช
, ๋งํฌ๋ค์ด ์
๋ฏธ์ฌ์ฉ
๋ฌธ์ ยท ๋น ๋ฅธ ์์ ยท Skills
๋ธ๋ก๊ทธ (120+ ๊ธ): ์ ์ฒด ยท ๊ธฐ์ ์ด์ผ๊ธฐ ยท ์ ์ฉํ๊ฐ ๋ณด๊ณ ์
| Tier | ๋ฒ์ |
|---|---|
| Stable | DART Company (panel, show, trace, diff, BS/IS/CF, CIS, index, filings, profile), EDGAR Company core, valuation, forecast, simulation |
| Beta | EDGAR ํ์์ ์ (SCE, notes, freq, coverage), credit, insights, distress, ratios, timeseries, network, governance, workforce, capital, debt, chart/table/text ๋๊ตฌ, ask/chat, OpenDart, OpenEdgar, Server API, MCP |
| Experimental | AI ๋๊ตฌ ํธ์ถ, export, viz (์ฐจํธ) |
์์ธํ ๊ธฐ์ค์ operation.stability ๋ฅผ ๋ณธ๋ค.
๋ค๋ฅธ ์ฌ๋ฌด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ์์์ ๊ฒฐ์ โ ์ฌ์ฉ์๊ฐ ์ค์น ํ ๋ง์ฃผ์น ์ฐจ์ด๋ฅผ ๋ฏธ๋ฆฌ ๋ช ์ํ๋ค.
| ๊ฒฐ์ | ์๋ฏธ | ์ด์ |
|---|---|---|
๋จ์ผ base install โ [extras] ๋ถ๋ฆฌ ์์ |
pip install dartlab ํ ๋ฒ์ ๋ถ์ยท์๋ฒยทMCPยทvizยทAI provider ๊ฐ ํจ๊ป ๋ค์ด์จ๋ค |
๋ถ์ ๋๊ตฌ์ "์ด๊ฒ๋ ์ค์นํ์ธ์" ๊ฐ ๋์ ๋๋ฉด ์ฒซ ์ฌ์ฉ๊น์ง ๋ง์ฐฐ์ด ๋์ด๋๋ค. ๋จ์ผ ์ง์ SSOT ๊ฐ ์ฐ์ . wheel ํฌ๊ธฐยทcold start ๋น์ฉ์ PEP 562 lazy load ์ pyodide ๋ถ๊ธฐ๋ก ํก์ํ๋ค. |
| ์ฌ์ ๊ตฌ์ถ ๋ฐ์ดํฐ, API ํค 0 ์ผ๋ก ์์ | Company("005930") ํธ์ถ ์ HuggingFace ์์ ์๋ ๋ค์ด๋ก๋ โ ๋ก์ปฌ ์บ์. DART API ํค๋ ์ฌ์์ง ๋ง ํ์ |
"ํค ๋ง๋ค๊ณ ํ๊ฒฝ๋ณ์ ์ธํ
" ๋จ๊ณ๋ฅผ 1์์ ์ฌ์ฉ ๊ฒฝ๋ก์์ ์ ๊ฑฐ. ํค ๋ฐ๊ธ์ dartlab collect ๊ฐ์ raw ์ฌ์์ง ํ๋ฆ์์๋ง ๋ฑ์ฅ. |
| ๊ณต์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ, ์ง์ ์๋ | ์ธ๋ถ ๋ณธ๋ฌธ์ ์ง๋ ฌํ ์ [EXTERNAL CONTENT START โ untrusted ...] ๋ง์ปค๋ก ์๋ ๊ฐ์ |
DART/EDGAR/๋ด์ค ๋ณธ๋ฌธ ์์ "์ด์ ์ง์ ๋ฌด์" ๊ฐ์ ํจํด์ด AI ๋์์ ๋ฐ๊พธ์ง ๋ชปํ๋๋ก ์ง๋ ฌํ ๋จ์์ ๊ฐ์ . ๋ง์ปค ์ ์ซ์ยท๋ ์งยท๊ณ ์ ๋ช ์ฌ๋ 1์ฐจ ์ถ์ฒ ์ฌ๊ฒ์ฆ ํ ์ธ์ฉ. |
| AI ์์ง = chat-native + LLM ์์จ tool calling | BRIEF/WORK/CRITIQUE/COMPOSE/GATE/HARVEST ์ ๊ณ ์ ๋
ธ๋ ๊ทธ๋ํ ์์. ๋ณธ์ฒด๋ ai/agent.py, ๋ฅ๋ ฅ์ ai/tools/ |
0.7.15 ์์ 15,420 ์ค ์ญ์ ๋ก ํ๊ท ์ฐจ๋จ. graph ์ ๊ฐ๋ฐ์ verify ๊ฐ์ ยทworkbench ๋ณธ์ฒดํ ํ๊ท๋ฅผ ๋ถ๋ฅด๊ณ LLM ์์จ์ฑ์ ์ ๊ทผ๋ค. |
| L0~L4 ๋จ๋ฐฉํฅ import (4 ํ์ cross ๊ธ์ง) | core โ gather/providers โ scan/frame/synth/reference โ analysis 5์ข โ story โ ai/mcp | import-linter + dartlabGuard.py strict --scope l0-l15 ๊ฐ PR ๊ฒ์ดํธ. ์ธ๋ถ ๊ธฐ์ฌ์๊ฐ ์ด๋์ ์ฝ๋๋ฅผ ๋ํ ์ง ํ ๊ทธ๋ฆผ์ผ๋ก ํ๋จ ๊ฐ๋ฅ. |
| ํ ์คํธ ์ง๋ ฌํ ๊ฐ์ (Polars OOM ๊ฐ๋) | pytest -v ์ ์ฒด ํธ์ถ ๊ธ์ง. tests/test-lock.sh tests/ -m "<marker>" ๊ฒฝ์ |
Company 1๊ฐ โ 200~500 MB Rust ํ์ gc.collect() ํ์ ๋ถ๊ฐ. CI ์ ๋ก์ปฌ์ ๊ฐ์ lock wrapper ๋ช
๋ น์ผ๋ก ํต์ผ. |
| ๋ฉ์์ง ํ๊ตญ์ด ์ฐ์ , API ์์ด | Company, pastInsight, analysis ๋ฑ symbol ์ ์์ด. CLI ์๋ฌยท์งํ ๋ฉ์์ง๋ ํ๊ตญ์ด |
classifier ์ Natural Language :: Korean / English ๋ ๋ค ์ ์ธ. PyPI ์์ด ์ฌ์ฉ์ ๋์ ์๋ฌธ ์ง์
์ README_EN.md ์ ์๋ฌธ docstring ์ผ๋ก ๋ณ๋ ํธ๋. |
| ๋จ์ผ SSOT โ Skill OS | ์ธ๋ถ LLMยท์ฌ์ฉ์๊ฐ capabilities() ํ ์ค๋ก 304 specs ์นดํ๋ก๊ทธ ์ง์ |
์ฝ๋ยท๋ฌธ์ยท๊ณ์ฝ์ ๊ฐ์ ํ์ผ (src/dartlab/skills/specs/**) ๋ก ์ด์. README โ docs โ ์ฝ๋ drift ๋ฅผ SSOT ํ ๊ณณ์์ ๋ฐฉ์ง. |
| ๋ถ์ฑ ์๊ณ์ด ๊ณต๊ฐ | uv run python -X utf8 src/dartlab/skills/measureProgress.py ๋ก baseline ยท docstring backlog ยท pytest marker ๋ถํฌ 3 ์ถ ์ถ์ธ ์ธก์ . master push ๋ง๋ค _progress/measureHistory.jsonl ํ ์ค ์ ์ฌ |
"์ ๊ท ํ๊ท 0" ๊ฐ๋ ์ธ์ ์ํ ๋ ์ ๋์ผ๋ก ๋ณธ๋ค. ์ธ๋ถ ๊ธฐ์ฌ์๊ฐ "๋ถ์ฑ๋ฅผ ์ค์ด๊ณ ์๋๊ฐ" ๋ฅผ ์๊ณ์ด ํ ํ์ผ์์ ํ์ธ ๊ฐ๋ฅ. |
pip install dartlabimport dartlab
c = dartlab.Company("005930") # HuggingFace ์๋ ๋ค์ด๋ก๋ (์ต์ด ~์์ญ MB, ๋ก์ปฌ ์บ์)
c.panel("IS") # ์์ต๊ณ์ฐ์, ๋ถ๊ธฐ ๊ธฐ๋ณธ์ธ ์ค โ API ํค 0, ํ๊ฒฝ๋ณ์ 0. ์๋ฌธ ์ฌ์ฉ์๋ README_EN.md, ๋ค๋ฅธ ์ง์ ๊ฒฝ๋ก (CLI ยท AI ยท MCP) ๋ ์ "๋ ๊ฐ์ง ์์์ " ์ฐธ์กฐ.
๊ธฐ์ฌ๋ ๋ฌด์์ด๋ ํ์ํฉ๋๋ค. ๋ฒ๊ทธ ๋ฆฌํฌํธ, ๊ธฐ๋ฅ ์ ์, ๋ฌธ์ ๊ฐ์ , ์์ ์ถ๊ฐ, ๋ฐ์ดํฐ ๋งคํ ์์ ์ฒ๋ผ ์์ ๋ณ๊ฒฝ๋ dartlab์ ๋ ์ข๊ฒ ๋ง๋ญ๋๋ค.
ํ๊ตญ์ด์ ์์ด ์ด์ยทPR ๋ชจ๋ ํธํ๊ฒ ์ด์ด์ฃผ์ธ์. ์ด๋์ ์์ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์ด์๋ก ๋จผ์ ์ด์ผ๊ธฐํด๋ ์ข์ต๋๋ค.
Apache License 2.0 โ ์์ ๋กญ๊ฒ ์ฌ์ฉํ๋, NOTICE ํ์ผ์ ์ถ์ฒ ํ๊ธฐ๋ฅผ ํฌํจํด์ฃผ์ธ์.








