nick-vi/type-inject
요약
nick-vi/type-inject는 AI 코딩 어시스턴트가 TypeScript 및 Svelte 프로젝트의 타입 컨텍스트를 더 정확하게 이해할 수 있도록 돕는 도구입니다. 파일 읽기 시 타입 시그니처를 자동으로 주입하고, 코드 작성 시 실시간으로 타입 에러 피드백을 제공하여 LLM이 스스로 오류를 수정할 수 있게 지원합니다.
핵심 포인트
- 파일 읽기 시 함수, 인터페이스, 클래스 등 타입 시그니처를 자동으로 추출하여 컨텍스트로 주입
- 임포트된 타입에 대해 최대 4단계 깊이까지 추적하여 스마트 필터링 및 토큰 최적화 수행
- LLM이 코드를 작성할 때 TypeScript 에러를 즉각적으로 보고하여 자동 수정 유도
- MCP(Model Context Protocol) 서버 및 훅(hooks)을 통해 Claude 및 Cursor와 연동 가능
- lookup_type, list_types, type_check 등 타입 관련 전용 도구 제공
AI 코딩 어시스턴트(AI coding assistants)를 위한 TypeScript 타입 컨텍스트(type context). 파일 읽기 시 타입 시그니처(type signatures)를 자동으로 주입하고, 쓰기 시 타입 에러 피드백을 제공하며, 타입 조회(type lookup) 도구를 제공합니다.
파일 읽기 시 자동 타입 주입 및 MCP 도구를 포함한 전체 플러그인:
{
"plugin": ["@nick-vi/opencode-type-inject"]
}
또는 MCP 서버 전용 (도구만 제공, 자동 주입 없음):
{
"mcp": {
"type-inject": {
...
한 줄 설치 (MCP 서버 + 훅 추가):
curl -fsSL https://raw.githubusercontent.com/nick-vi/type-inject/main/scripts/claude-install.sh | bash
수동 설치 (Manual installation)
1. MCP 서버 추가 (lookup_type 및 list_types 도구 제공):
# 전역 (모든 프로젝트)
claude mcp add type-inject -s user -- npx -y @nick-vi/type-inject-mcp
# 또는 프로젝트 전용
...
2. 훅(hooks) 추가 (읽기 시 타입 주입, 쓰기 시 타입 체크):
~/.claude/settings.json에 추가:
{
"hooks": {
"PostToolUse": [
...
.cursor/mcp.json에 추가:
{
"mcpServers": {
"type-inject": {
...
LLM이 TypeScript 또는 Svelte 파일을 읽을 때, 이 플러그인은 자동으로 다음을 수행합니다:
- 타입 시그니처(함수, 타입, 인터페이스, 열거형, 클래스, 상수) 추출
- 다른 파일로부터 임포트된 타입 해결 (최대 4단계 깊이까지)
- 스마트 필터링 적용 (코드에서 실제로 사용되는 타입만 추출)
- 우선순위 기반 정렬을 통한 토큰 예산(token budget) 준수
- 시그니처를 추가 컨텍스트로 주입
부분 파일 읽기(offset/limit 사용)의 경우, 해당 섹션과 관련된 타입만 주입됩니다.
LLM이 TypeScript 파일을 작성할 때, 훅이 타입 체크를 실행하고 에러를 보고합니다:
방금 작성한 파일의 TypeScript 에러:
<file_diagnostics>
ERROR [5:2] Type 'string' is not assignable to type 'boolean'.
...
이를 통해 LLM은 수동 개입 없이 타입 에러를 수정할 수 있는 즉각적인 피드백을 받습니다.
작동 방식:
- 에러만 보고합니다 (경고(warnings)나 힌트(hints)는 제외)
- 작성된 파일의 에러를 우선적으로 보여줍니다 (
<file_diagnostics>)
) - 다른 프로젝트 파일의 에러를 보여줍니다 (<project_diagnostics>)
) - 제한 사항: 파일당 에러 최대 20개, 프로젝트 진단(project diagnostics)은 최대 5개 파일까지
- 프로젝트 내에
tsconfig.json이 필요합니다 (해당 파일로부터 상위 디렉토리로 탐색)
이 플러그인은 세 가지 도구를 제공합니다:
- 파일을 읽지 않고 이름으로 모든 타입을 검색합니다:
lookup_type - 프로젝트 내의 모든 타입을 나열합니다:
list_types - 프로젝트 또는 특정 파일에 대해 TypeScript 타입 체크를 실행합니다:
type_check
파일을 읽을 때, LLM은 다음과 같은 추가 컨텍스트를 받습니다:
이 파일에서 참조되었지만 다른 곳에 정의된 타입 정의(Type definitions):
<types count="3" tokens="~85">
function getUser(id: string): User // [offset=2,limit=8]
...
부분 읽기(offset/limit 사용)의 경우, 설명이 "이 범위에서 참조된 타입 정의(Type definitions referenced in this range)..."로 변경됩니다.
타입은 중요도에 따라 우선순위가 지정됩니다:
| 계층 (Tier) | 내용 | 우선순위 |
|---|---|---|
| 1 | 함수 시그니처 (Function signatures) | 항상 포함됨 |
| ... |
타입은 임포트(imported)된 파일로부터 최대 4단계 깊이까지 자동으로 해석(resolved)됩니다.
코드에서 실제로 사용되는 타입만 포함됩니다. 파일의 부분 읽기(offset/limit 사용) 시에는 해당 섹션과 관련된 타입만 주입(injected)됩니다.
export * from 문만 포함된 파일은 건너뜁니다.
Svelte 파일(.svelte)은 완벽하게 지원됩니다:
<script lang="ts">(인스턴스) 및<script module lang="ts">(모듈) 블록 모두에서 타입을 추출합니다.- Svelte와 TypeScript 파일 간의 임포트를 모든 방향(TS → Svelte, Svelte → TS)으로 해석합니다.
- 각 스크립트 블록에 대한 정확한 줄 번호를 계산합니다.
- 선택적 피어 의존성(optional peer dependency)으로
svelte가 필요합니다 (설치된 경우에만 로드됨).
| 항목 | 표시 방식 | 이유 |
|---|---|---|
| 함수 (Functions) | 시그니처만 표시 | 구현부(Implementation)가 길 수 있으므로, 시그니처만으로 호출 방법을 알 수 있음 |
| ... |
함수와 클래스는 시그니처만 표시되므로, 필요할 때 구현부를 읽을 수 있도록 위치 힌트(location hints)를 제공합니다:
function processUser(id: string): User // [offset=15,limit=28]
이 형식은 read 도구의 파라미터와 직접 일치하므로 별도의 변환이 필요하지 않습니다.
// 직접 임포트 (Direct import) - 위에서 임포트 문을 확인할 수 있습니다
type User = { ... }
// 간접 임포트 (Transitive import) (2단계 이상의 깊이) - 출처가 명확하지 않음
...
직접 임포트 (Direct imports)는 파일의 임포트 문에서 확인할 수 있습니다. 반면 간접 임포트 (Transitive imports)는 확인할 수 없으므로, 탐색 및 리팩터링 (refactoring)을 위해 해당 정의가 위치한 곳을 포함합니다.
| 유형 (Type) | 로컬/직접 임포트 (Local/Direct Import) | 간접 임포트 (Transitive Import) (깊이 > 1) |
|---|---|---|
| 함수/클래스 (function/class) | // [offset=X,limit=Y] | // [filePath=...,offset=X,limit=Y] |
| 타입/인터페이스/열거형 (type/interface/enum) | (없음 - 전체 정의 표시) | // [filePath=...] |
두 도구 모두 TypeScript 및 Svelte 파일을 지원합니다.
이름으로 타입 정의를 조회합니다 (.ts, .tsx, .svelte 파일 지원).
인자 (Arguments):
name (필수): 검색할 타입 이름
exact (선택 사항): 정확히 일치하거나 포함 여부. 기본값: true
kind (선택 사항): 종류별 필터링 (function, type, interface, enum, class, const)
includeUsages (선택 사항): 이 타입을 임포트하는 파일 포함. 기본값: false
limit (선택 사항): 최대 결과 수. 기본값: 5
출력 내용:
## TypeName (kind)
File: ./path/to/file.ts [offset=9,limit=50]
## CounterProps (type)
...
offset과 limit은 쉬운 탐색을 위해 read 도구의 파라미터와 일치합니다.
프로젝트 내의 모든 타입 이름을 나열합니다 (TypeScript 및 Svelte 파일 포함).
인자 (Arguments):
kind (선택 사항): 종류별 필터링
limit (선택 사항): 최대 결과 수. 기본값: 100
프로젝트 또는 특정 파일에 대해 TypeScript 타입 체크를 실행합니다.
인자 (Arguments):
file (선택 사항): 체크할 파일 경로. 생략 시 프로젝트 전체를 체크합니다.
출력:
방금 작성한 파일의 TypeScript 에러:
<file_diagnostics>
ERROR [5:2] Type 'string' is not assignable to type 'boolean'.
...
또는 프로젝트 전체 체크 시:
다른 프로젝트 파일의 TypeScript 에러:
<project_diagnostics>
src/utils.ts
...
에러가 발견되지 않으면 성공 메시지를 반환합니다.
이 프로젝트는 4개의 패키지로 구성된 모노레포 (monorepo)입니다:
이 프로젝트는 4개의 패키지로 구성된 모노레포(monorepo)입니다:
| Package | Description |
|---|---|
@nick-vi/type-inject-core | 공유 TypeScript 추출 라이브러리 |
@nick-vi/type-inject-mcp | TypeScript 타입 조회를 위한 MCP 서버 |
@nick-vi/claude-type-inject-hook | Claude 코드 훅 (읽기 + 쓰기) |
@nick-vi/opencode-type-inject | OpenCode 플러그인 |
MIT
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Coding Assistants의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기