TRENDSHIFT #9 · 2026.05.28 · ZHU1090093659

DeepSeek++ — 공식 앱을 건드리지 않고,
DeepSeek 웹페이지에 "기억과 스킬"을 몰래 심는 Chrome 확장

66 스타 · 한 명의 개발자가 만든 DeepSeek 웹버전 강화 패치. ChatGPT나 Claude 같은 "Memory · Skill · MCP 도구" 기능을 DeepSeek는 아직 정식 제공하지 않는데, 이 확장은 브라우저 단에서 fetch를 가로채 시스템 프롬프트를 끼워넣는 방식으로 그 기능들을 흉내 낸다. 백엔드 서버 한 줄 없이, 순수 클라이언트 사이드만으로 Agentic Memory, Skill 시스템, 시스템 프롬프트 프리셋, MCP 연결까지 다 구현했다.

한 줄로 말하면

"DeepSeek 사이트 옆에 작은 비서를 하나 붙여놓고, 네가 무슨 말을 보내든 그 비서가 먼저 가로채서 살을 덧붙이고, AI 답변이 오면 다시 가로채서 행동을 실행하는" 확장.

네가 DeepSeek에 "내 이름은 인범이야"라고 치면, 확장이 그 메시지가 서버로 가기 전에 잡아서 "[지금까지 너에 대해 기억하는 것들: ...] + 인범이야"로 바꿔치고, AI가 답하면서 <memory_save>{...}</memory_save> 같은 XML 태그를 답변에 섞어 보내면 확장이 그걸 잘라내서 IndexedDB에 저장한다.

즉, DeepSeek 서버는 자기가 기억력이 있다고 착각하고, 사용자는 ChatGPT처럼 매끄러운 경험을 얻는다.

1프로젝트 한 줄 요약

한 문장으로 정확히 무엇을 하는가

DeepSeek++chat.deepseek.com 페이지에서만 작동하는 Chrome MV3 확장이다. 페이지의 네트워크 요청(fetch / XHR)을 main world 스크립트로 후킹해, DeepSeek API로 나가는 prompt에 장기 기억 · 스킬 system prompt · 시스템 프리셋을 자동으로 끼워 넣고, 돌아오는 SSE 스트림에서 <memory_save> 같은 XML 태그를 파싱해 IndexedDB에 저장한다.

기억해 둘 용어
에이전트 기억(Agentic Memory)
AI가 대화 도중 "이건 기억해야겠다"고 판단해서, 도구 호출로 직접 저장 행동을 트리거하는 기억 시스템. 사람이 "기억해줘"라고 명령하지 않아도 AI가 능동적으로 저장 여부를 결정한다는 점이 핵심.
기억해 둘 용어
MV3 (Manifest V3)
크롬 확장의 최신 규격. 백그라운드 페이지가 사라지고 Service Worker로 대체됐다. 보안이 강해진 대신 글로벌 변수로 상태를 들고 있을 수 없다 → 그래서 이 프로젝트는 IndexedDB와 chrome.storage를 적극 활용한다.

2왜 주목받는가

TrendShift 9위까지 올라온 이유

2026년 들어 ChatGPT의 Memory와 Custom Instructions, Claude의 Skills/MCP가 폭발적으로 주목받았다. DeepSeek는 비용 대비 성능이 가장 강력한 대안이지만, "기억력"과 "전문 모드" 같은 사용성 기능은 항상 한 발 늦었다. 이 프로젝트는 그 공백을 정확히 채웠다.

경쟁 제품과의 비교

항목ChatGPT MemoryClaude SkillsDeepSeek++
설치 비용유료 구독유료 구독무료 + 오픈소스
실행 위치서버 측서버 측브라우저(클라이언트)
데이터 저장OpenAI 서버Anthropic 서버로컬 IndexedDB
커스터마이즈제한적중간완전 자유
MCP 지원제한적완전 지원부분 지원(v0.3)
강점
서버를 안 만들고 강력한 기능을 붙인다

전통적인 접근이라면 "프록시 서버 → DeepSeek API"로 중계하면서 메모리를 관리하는 구조다. 그러나 이 프로젝트는 사용자 브라우저가 곧 미들웨어. 서버 운영비도, 사용자 토큰 보안 우려도 없다. DeepSeek의 공식 결제·로그인이 그대로 살아 있다.

강점
"AI가 스스로 저장 결정" 패턴의 모범 구현

이 프로젝트는 ChatGPT처럼 "전체 대화를 요약해서 통째로 저장"하지 않고, AI가 시스템 프롬프트에 명시된 규칙대로 직접 memory_save 도구를 호출하게 한다. 즉 메모리 저장 로직이 코드가 아니라 "프롬프트 + 정규식 파서" 조합으로 짜여 있다 — LLM 시대 새로운 설계 패턴의 좋은 사례.

강점
9개의 즉시 사용 가능한 스킬

"극치 심층 사고", "프론트엔드 디자인", "문서 협업", "브랜드 가이드라인", "알고리즘 아트", "PPT 디자인" 등 — Anthropic의 Skills 카탈로그를 벤치마크한 분야들. /만 치면 자동완성 패널이 뜨고, 선택하면 system prompt가 자동 주입된다.

3기술 스택 전체 지도

왜 이런 조합을 골랐는지

TypeScript 96.8%
언어 구성
WXT
확장 빌드 프레임워크
React 19
사이드 패널 UI
Dexie 4
IndexedDB 래퍼

프레임워크 레이어 — WXT

WXT (wxt.dev)는 Vite 기반 크롬 확장 빌드 도구. "확장 개발계의 Next.js" 같은 위치다. entrypoints/ 폴더에 파일을 두면 자동으로 진입점으로 인식하고, MV3 매니페스트를 자동 생성한다.

비유

그냥 크롬 확장을 만든다면 manifest.json을 손으로 짜고, content script · background script · sidepanel HTML을 각각 webpack으로 묶어야 한다. WXT는 그걸 "파일 이름만으로 자동 결정"하게 해준다. entrypoints/background.ts → 서비스 워커, entrypoints/content.ts → 콘텐츠 스크립트. Next.js의 pages/ 디렉토리 컨벤션과 똑같은 발상.

UI 레이어 — React 19 + Tailwind CSS 4

사이드 패널(chrome://extensions의 옆 패널)을 React로 짠다. React 19는 2026년 기준 안정 버전이고, Tailwind 4는 빌드 시간이 극단적으로 빠른 새 엔진을 쓴다(@tailwindcss/vite 플러그인). 이 정도 가벼운 UI에 정확히 어울리는 조합.

스토리지 레이어 — Dexie + Chrome Storage

두 곳에 나눠 저장한다.

기억해 둘 용어
Dexie
IndexedDB 위에 얹은 가벼운 ORM/래퍼. Promise 기반 API, 인덱스 정의, 마이그레이션을 깔끔하게 처리한다. 크롬 확장에서 "조금 큰 데이터 저장"이 필요할 때 사실상 표준.

매니페스트 권한

permissions: storage, alarms, nativeMessaging, sidePanel host_permissions: *://chat.deepseek.com/* optional_host: http://*/*, https://*/* (MCP 서버 옵셔널 연결용)

nativeMessaging 권한이 있다는 건 로컬에서 돌아가는 MCP 서버와 통신할 의도가 있다는 뜻이고, alarms가 있다는 건 스케줄된 자동화 태스크를 돌릴 수 있다는 의미다.

4아키텍처 심화 분석

전체 데이터 흐름과 핵심 설계 패턴

전체 시스템 구조도

┌─────────────────────────────────────────────────────────────────┐ │ chat.deepseek.com (웹 페이지) │ │ │ │ 사용자 입력창 ─┐ │ │ ▼ │ │ ┌───────────────────────────────┐ │ │ │ main-world.content.ts │ ← 페이지 컨텍스트에서 동작 │ │ │ ・fetch / XHR 후킹 │ │ │ │ ・요청 body 가로채기 │ │ │ │ ・prompt에 메모리/스킬 주입 │ │ │ │ ・SSE 응답 스트림 파싱 │ │ │ │ ・<memory_save> 태그 추출 │ │ │ └───────────┬───────────────────┘ │ │ │ window.postMessage │ │ ▼ │ │ ┌───────────────────────────────┐ │ │ │ content.ts │ ← 격리된 컨텍스트 │ │ │ ・DOM 통합 │ │ │ │ ・스킬 자동완성 팝업 │ │ │ │ ・tool_call 실행 디스패치 │ │ │ └───────────┬───────────────────┘ │ │ │ chrome.runtime.sendMessage │ └───────────────┼─────────────────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Service Worker (background.ts) │ │ ・메시지 라우팅 │ │ ・IndexedDB 읽기/쓰기 │ │ ・MCP 서버 연결 (Native Messaging) │ │ ・스케줄 자동화 (chrome.alarms) │ └─────────────────────────────────────────────────────────────────┘ ▲ │ chrome.runtime.sendMessage ┌───────────────┴─────────────────────────────────────────────────┐ │ Side Panel (React 앱) │ │ ・메모리 CRUD UI │ │ ・스킬 편집기 │ │ ・프리셋 관리 │ └─────────────────────────────────────────────────────────────────┘

핵심 설계 패턴 1 — Main World Injection

일반적인 크롬 확장의 content.ts"격리된 컨텍스트(isolated world)"에서 실행돼서, 페이지의 window.fetch 같은 글로벌 객체를 직접 후킹할 수 없다. 그래서 이 프로젝트는 main-world.content.ts를 따로 만들어 "world: MAIN" 설정으로 실행한다.

기억해 둘 용어
Main World / Isolated World
크롬 확장의 두 가지 실행 컨텍스트. Isolated World는 페이지와 DOM은 공유하되 JS 변수는 분리 — 충돌 방지가 목적. Main World는 페이지의 JS와 완전히 같은 스코프에서 실행 — window.fetch를 갈아치우는 같은 작업이 필요할 때만 쓴다. MV3에서 정식 지원된 지 얼마 안 된 기능.
비유

택배 차량(fetch 요청)을 가로채려면, 도로 위에서 직접 잡아야 한다(Main World). 차고지 옆 카페에 앉아서 보고만 있으면(Isolated World) 차는 그냥 지나가 버린다. 다만 도로 위에서 작업하려면 교통경찰의 허가(world:MAIN 설정)가 별도로 필요하다.

핵심 설계 패턴 2 — XML 태그를 도구 호출 프로토콜로

OpenAI 함수 호출이나 Anthropic의 tool_use는 표준화된 JSON 형식이다. 그런데 DeepSeek 웹 API는 그런 구조화된 입출력을 사용자가 제어할 방법이 없다. 그래서 이 프로젝트는 "AI 답변에 그냥 XML 태그를 박아넣게" 하고, 그걸 정규식으로 잘라낸다.

// constants.ts 의 시스템 프롬프트 발췌 <memory_save> {"type": "user", "name": "용户职业", "content": "前端开发", "tags": ["前端"]} </memory_save> The JSON body MUST be valid JSON on its own. The tag name MUST exactly match one of the available tool names.

이 트릭의 핵심은 두 가지다.

핵심 설계 패턴 3 — 메모리 스코어링과 토큰 예산

메모리가 1000개 쌓이면 매번 전부 주입할 수 없다. MEMORY_TOKEN_BUDGET = 1500 토큰 안에서 가장 관련 있는 것만 골라야 한다.

점수 = (키워드 매칭 점수) + (고정 가중치, pinned이면 +∞) + (접근 빈도 점수, 자주 쓴 메모리 가산) + (최근성 점수, 최근 작성/수정한 메모리 가산) → 점수 내림차순으로 정렬 → MEMORY_TOKEN_BUDGET을 넘기 직전까지 채워서 주입

이건 사실 고전적인 검색 엔진(BM25)에 인간 직관 가중치를 합친 형태다. 벡터 임베딩을 쓰지 않고 단순 키워드 매칭으로 충분히 동작하게 만든 점이 실용적.

핵심 설계 패턴 4 — 프리셋 재주입 간격

PRESET_REINJECTION_INTERVAL = 10

활성화된 시스템 프리셋은 새 대화의 첫 메시지 + 매 10번째 메시지마다 재주입된다. DeepSeek가 컨텍스트가 길어지면서 초기 system prompt를 "잊는" 현상을 막기 위함이다.

왜 매번 주입 안 하는가?
토큰 낭비 + 응답 일관성

매 메시지마다 system prompt를 다시 넣으면 토큰을 그만큼 더 쓰게 되고, 모델이 매번 같은 지시를 다른 톤으로 해석할 수도 있다. 10턴 간격은 토큰 효율과 일관성 사이의 절충점이다.

5디렉토리 구조 해부

어디서 어떤 일이 일어나는가

deepseek-pp/ ├── wxt.config.ts ← WXT 빌드 설정 + 매니페스트 생성 ├── package.json ← React 19, Dexie 4, WXT 0.20 │ ├── entrypoints/ ← 확장 진입점들 │ ├── background.ts ← Service Worker: 메시지 라우터 │ ├── content.ts ← Content Script: DOM 통합 │ ├── main-world.content.ts ← Main World: fetch 후킹 │ └── sidepanel/ ← React 사이드 패널 앱 │ ├── core/ ← 핵심 로직 │ ├── constants.ts ← API URL, 토큰 예산, 시스템 템플릿 │ ├── messaging.ts ← 컨텍스트 간 메시지 프로토콜 │ ├── interceptor/ ← fetch 후킹, SSE 파싱, tool_call 추출 │ ├── memory/ ← 메모리 저장/검색/주입 │ ├── skill/ ← 9개 내장 스킬 + 사용자 스킬 │ ├── preset/ ← 시스템 프롬프트 프리셋 │ ├── prompt/ ← 프롬프트 조립 파이프라인 │ ├── mcp/ ← MCP 도구 통합 (v0.3 신규) │ ├── automation/ ← 스케줄 자동화 (v0.3 신규) │ ├── sync/ ← 동기화 (v0.3 신규) │ ├── browser/ ← 브라우저별 호환 레이어 │ ├── background/ ← Service Worker 헬퍼 │ ├── model/ ← 타입 정의/데이터 모델 │ └── ui/ ← 슬래시 자동완성 팝업 │ └── assets/ ← 아이콘, 스크린샷

가장 중요한 3개의 파일

1순위

core/constants.ts (125줄)

이 한 파일에 이 프로젝트의 모든 비밀이 다 들어 있다. SYSTEM_TEMPLATE_CHAT이 곧 "메모리 시스템의 두뇌"고, MEMORY_SAVE_SCHEMA가 도구 호출 계약이다. 읽으면 프로젝트의 절반을 이해한 셈.

2순위

core/interceptor/ (디렉토리)

fetch / XHR을 어떻게 후킹했는지가 들어 있다. SSE 스트림을 chunk 단위로 받으면서 어떻게 XML 태그 경계를 처리하는지 보면 "스트리밍 파서 만들기"의 좋은 예제.

3순위

core/memory/ (디렉토리)

메모리 스코어링 로직과 토큰 예산 관리. STOP_WORDS 세트가 어떻게 쓰이는지, tags 가중치를 어떻게 계산하는지 보면 "검색 점수 만들기"의 미니 튜토리얼.

6학습 포인트

이 레포에서 무엇을 배울 수 있는가

① 크롬 확장 MV3 + Main World

MV3로 넘어오면서 가장 헷갈리는 게 "background page가 사라졌고, content script로는 window.fetch를 못 가로챈다"는 점이다. 이 프로젝트는 main-world.content.ts 한 파일로 그 한계를 어떻게 우회하는지 정확히 보여준다.

실습 아이디어
유튜브 fetch 후킹해서 추천 알고리즘 데이터 수집

같은 main-world 패턴을 그대로 가져다 유튜브의 /youtubei/v1/browse 응답을 가로채면, 추천 영상 메타데이터를 따로 모아 분석할 수 있다. 동일 패턴, 다른 도메인.

② Prompt Injection을 "기능"으로 쓰는 법

일반적으로 "prompt injection"은 보안 취약점 이름이다. 그런데 이 프로젝트는 의도된 prompt injection이 곧 기능이다. 시스템 프롬프트를 어떻게 설계해야 모델이 "주어진 규칙을 따라 도구를 호출"하게 만드는지가 핵심 학습 포인트.

실습 아이디어
간단한 "취향 기억" 챗봇 만들기

OpenAI API + 시스템 프롬프트에 <preference_save>{json}</preference_save> 규칙을 박고, 응답에서 태그를 잘라내 로컬 JSON에 저장. 딱 50줄로 "기억하는 챗봇"을 흉내낼 수 있다.

③ WXT 프레임워크

크롬 확장 개발이 "configurator의 지옥"이었던 시절을 끝내려는 도구. Hot reload, 자동 매니페스트 생성, 크로스 브라우저 빌드(Chrome/Edge/Firefox 동시) 가 다 된다. 이 프로젝트의 build:all 스크립트가 좋은 사례.

④ Dexie로 IndexedDB 다루기

웹 브라우저의 IndexedDB API는 콜백 지옥의 끝판왕으로 악명 높다. Dexie는 그걸 Promise/Observable 기반으로 깔끔하게 감싸준다. 이 프로젝트의 메모리 모듈이 미니 튜토리얼 격.

⑤ React 19 + Tailwind 4 사이드 패널

Chrome MV3의 sidePanel API를 React로 다루는 살아 있는 예제. 사이드 패널 ↔ Service Worker 메시지 핸드셰이크는 일반 SPA와 다른 패턴(chrome.runtime.sendMessage)이라 직접 보면 배우는 게 많다.

7하드웨어/시스템 요구사항

개발과 사용에 필요한 환경

사용자 입장

개발자 입장

주의
DeepSeek API 응답 포맷이 바뀌면 즉시 깨질 수 있다

이 확장은 DeepSeek의 비공개 내부 API(/api/v0/chat/completion)에 의존한다. DeepSeek가 응답 SSE 포맷을 바꾸거나 인증 방식을 바꾸면, 확장이 동작을 멈출 수 있다. 공식 API가 아니라는 점은 늘 염두에 둬야 한다.

8직접 해볼 수 있는 실습 과제

난이도별 다섯 가지

★ 입문

1. 확장 설치하고 메모리 자동 저장 관찰

git clonenpm installnpm run builddist/chrome-mv3/ 폴더를 크롬에 로드.

DeepSeek 페이지에서 "나는 Next.js를 주로 써. 타입스크립트 좋아하고." 같은 자기 소개를 보내고, 사이드 패널에서 자동으로 user 타입 메모리가 쌓이는지 확인. "AI가 스스로 저장 결정"이라는 패턴을 눈으로 확인하는 게 목표.

★★ 초급

2. 나만의 슬래시 스킬 만들기

사이드 패널 → 스킬 → 새 스킬. 예를 들어 /ko-review 라는 이름으로 "코드를 한국어로 라인 단위 리뷰" system prompt를 작성. 채팅창에 /ko-review를 치고 자동완성이 뜨는지, 선택 후 system prompt가 자동 주입되는지 확인. Markdown 한 장으로 AI 페르소나를 박제하는 경험.

★★★ 중급

3. 메모리 타입 한 개 추가하기

현재는 user / feedback / topic / reference 4종류. 5번째로 project 타입을 추가해 보자. core/constants.ts의 enum 수정 + SYSTEM_TEMPLATE_CHAT 안내 문구 추가 + 사이드 패널 UI에 필터 옵션 추가. "기능 하나를 끝부터 끝까지 따라가는" 첫 풀스택 실습으로 적당.

★★★★ 고급

4. ChatGPT로 포팅하기

host_permissions*://chatgpt.com/*로 바꾸고, DEEPSEEK_API_URL을 ChatGPT의 내부 API 엔드포인트로 바꾼다. SSE 포맷이 다르므로 core/interceptor/의 파서를 ChatGPT 응답 구조에 맞게 수정. "main world fetch 후킹" 패턴이 다른 사이트에서도 통한다는 걸 직접 증명해 보는 챌린지.

★★★★★ 도전

5. 로컬 MCP 서버 붙이기

매니페스트의 nativeMessaging 권한이 이미 있다. Native Messaging Host로 동작하는 작은 Node.js MCP 서버를 짜고, core/mcp/를 통해 DeepSeek 답변에서 <mcp_tool_call> 태그를 추출하면 그 서버로 라우팅한다. "DeepSeek가 내 컴퓨터의 파일 시스템을 조작하게 만드는" 종합 실습.

9관련 기술 심화 학습 로드맵

4주 코스로 정리

1주차 — 크롬 확장 기본기

2주차 — WXT 프레임워크

3주차 — LLM 도구 호출 패턴

4주차 — 에이전트 메모리 시스템

한 달 후 도달 목표

"내 브라우저에서 돌아가는 나만의 AI 비서 확장"을 처음부터 짜기

  1. 주제 선택 — ChatGPT/Claude/Gemini 중 한 곳을 골라, 그 사이트의 fetch를 후킹할 수 있는지 먼저 확인.
  2. 최소 기능 정의 — 메모리만, 또는 슬래시 스킬만, 단일 기능부터 시작.
  3. WXT로 스캐폴드 — sidepanel + content + background 3개 진입점으로 시작.
  4. main world 후킹 검증 — 빈 페이지에서 alert로 "fetch 가로채기 성공"을 먼저 띄워보고 진행.
  5. 스토리지 분리 — 구조화 데이터는 Dexie, 플랫 데이터는 chrome.storage. 처음부터 갈라 두면 뒤에 안 헤맴.

10핵심 키워드 사전

알아두면 다른 LLM 도구 레포 읽을 때도 도움이 되는 단어들

용어
Service Worker (MV3)
크롬 확장 MV3의 "백그라운드" 역할. 항상 떠 있지 않고 이벤트(메시지, 알람)가 올 때만 깨어난다. 전역 변수가 사라질 수 있다는 점 때문에 모든 상태는 chrome.storage나 IndexedDB로 영속화해야 함.
용어
SSE (Server-Sent Events)
서버가 클라이언트에게 단방향으로 텍스트 스트림을 흘려보내는 HTTP 기술. LLM 응답이 한 글자씩 떨어지는 그 효과의 정체. WebSocket보다 가볍고, fetch + ReadableStream으로 받는다.
용어
Tool Call / Function Call
LLM이 답변 도중 "코드를 실행해달라"고 요청하는 패턴. 모델이 JSON이나 XML로 도구 이름과 인자를 출력하면, 호스트 앱이 그걸 파싱해서 실제 함수를 돌린다. OpenAI는 native JSON, 이 프로젝트는 XML 태그로 흉내.
용어
MCP (Model Context Protocol)
Anthropic이 제안한 LLM-도구 연결 표준 프로토콜. AI 에이전트와 외부 서비스/도구 사이의 "USB-C" 같은 역할. 이 프로젝트의 core/mcp/는 그 표준을 클라이언트 측에서 지원하려는 시도.
용어
Token Budget
LLM 컨텍스트 윈도우 안에서 "이 기능에 몇 토큰까지 할당할지" 미리 정해 두는 예산. 메모리에 1500 토큰을 배정한다는 건, 메모리가 아무리 많아도 1500 토큰 안에서 가장 중요한 것만 추려서 넣겠다는 뜻.
용어
Native Messaging
크롬 확장이 사용자 PC에서 돌아가는 네이티브 프로그램과 stdin/stdout으로 통신하는 메커니즘. 보안상 매우 제한적이라 manifest에 명시 + 로컬 매니페스트 파일 등록이 필요하다. 이 프로젝트가 로컬 MCP 서버를 붙일 때 쓸 통로.
용어
IndexedDB
브라우저 안에 들어 있는 비동기 NoSQL 데이터베이스. localStorage가 키-값 5MB 한도라면, IndexedDB는 수백 MB 이상 저장 가능 + 인덱스 + 트랜잭션 지원. API가 복잡해서 Dexie 같은 래퍼를 보통 같이 쓴다.
용어
Stop Words
검색에서 의미 없는 빈도 단어("the", "的", "了"). 키워드 매칭 점수 계산 전에 이 단어들을 제거해야 점수가 의미 있어진다. constants.tsSTOP_WORDS 세트가 좋은 예 — 중국어와 영어를 모두 포함.

11참고 링크

더 깊이 파고들고 싶다면

분류제목설명
레포zhu1090093659/deepseek-pp본 프로젝트 소스
프레임워크wxt.devWXT 공식 문서. 크롬 확장 개발 표준이 될 듯.
스토리지dexie.orgDexie 공식 가이드. IndexedDB 쓰려면 거의 필수.
크롬 APIchrome.sidePanel사이드 패널 API 레퍼런스
크롬 APINative Messaging로컬 프로그램과 통신하는 법
표준modelcontextprotocol.ioMCP 표준 명세
대안Letta (전 MemGPT)서버 측 에이전트 메모리 시스템의 정석
대안OpenAI Function Calling"표준 도구 호출"이 어떻게 생겼는지의 비교 기준
분석 일자: 2026-05-28 · TrendShift 일일 9위 (66 스타, 9 포크, TypeScript 96.8%) · 라이선스 MIT · 분석 대상 버전 v0.3.0