@zipbul/gildash 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ko.md +386 -0
- package/README.md +445 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2736 -0
- package/dist/index.js.map +42 -0
- package/dist/migrations/0000_soft_revanche.sql +56 -0
- package/dist/migrations/meta/0000_snapshot.json +408 -0
- package/dist/migrations/meta/_journal.json +13 -0
- package/dist/migrations/migrations/0000_soft_revanche.sql +56 -0
- package/dist/migrations/migrations/meta/0000_snapshot.json +408 -0
- package/dist/migrations/migrations/meta/_journal.json +13 -0
- package/dist/src/codeledger.d.ts +103 -0
- package/dist/src/common/hasher.d.ts +2 -0
- package/dist/src/common/index.d.ts +5 -0
- package/dist/src/common/lru-cache.d.ts +10 -0
- package/dist/src/common/path-utils.d.ts +2 -0
- package/dist/src/common/project-discovery.d.ts +6 -0
- package/dist/src/common/tsconfig-resolver.d.ts +6 -0
- package/dist/src/errors.d.ts +42 -0
- package/dist/src/extractor/calls-extractor.d.ts +3 -0
- package/dist/src/extractor/extractor-utils.d.ts +5 -0
- package/dist/src/extractor/heritage-extractor.d.ts +3 -0
- package/dist/src/extractor/imports-extractor.d.ts +4 -0
- package/dist/src/extractor/index.d.ts +7 -0
- package/dist/src/extractor/relation-extractor.d.ts +4 -0
- package/dist/src/extractor/symbol-extractor.d.ts +3 -0
- package/dist/src/extractor/types.d.ts +162 -0
- package/dist/src/gildash.d.ts +284 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/indexer/file-indexer.d.ts +27 -0
- package/dist/src/indexer/index-coordinator.d.ts +80 -0
- package/dist/src/indexer/index.d.ts +8 -0
- package/dist/src/indexer/relation-indexer.d.ts +24 -0
- package/dist/src/indexer/symbol-indexer.d.ts +29 -0
- package/dist/src/parser/ast-utils.d.ts +10 -0
- package/dist/src/parser/index.d.ts +6 -0
- package/dist/src/parser/jsdoc-parser.d.ts +2 -0
- package/dist/src/parser/parse-cache.d.ts +10 -0
- package/dist/src/parser/parse-source.d.ts +3 -0
- package/dist/src/parser/source-position.d.ts +3 -0
- package/dist/src/parser/types.d.ts +16 -0
- package/dist/src/search/dependency-graph.d.ts +71 -0
- package/dist/src/search/index.d.ts +6 -0
- package/dist/src/search/relation-search.d.ts +45 -0
- package/dist/src/search/symbol-search.d.ts +76 -0
- package/dist/src/store/connection.d.ts +30 -0
- package/dist/src/store/index.d.ts +10 -0
- package/dist/src/store/repositories/file.repository.d.ts +18 -0
- package/dist/src/store/repositories/fts-utils.d.ts +1 -0
- package/dist/src/store/repositories/relation.repository.d.ts +29 -0
- package/dist/src/store/repositories/symbol.repository.d.ts +46 -0
- package/dist/src/store/schema.d.ts +634 -0
- package/dist/src/watcher/index.d.ts +3 -0
- package/dist/src/watcher/ownership.d.ts +22 -0
- package/dist/src/watcher/project-watcher.d.ts +13 -0
- package/dist/src/watcher/types.d.ts +11 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 zipbul
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.ko.md
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
# @zipbul/gildash
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | **한국어**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@zipbul/gildash)
|
|
6
|
+
[](https://github.com/zipbul/gildash/actions/workflows/ci.yml)
|
|
7
|
+
[](./LICENSE)
|
|
8
|
+
|
|
9
|
+
**Bun 네이티브** TypeScript 코드 인덱서.
|
|
10
|
+
심볼 추출, 파일 간 관계 추적, 의존성 그래프 구축을 하나의 로컬 SQLite 데이터베이스로 제공합니다.
|
|
11
|
+
|
|
12
|
+
<br>
|
|
13
|
+
|
|
14
|
+
## ✨ 주요 기능
|
|
15
|
+
|
|
16
|
+
- **심볼 추출** — 함수, 클래스, 변수, 타입, 인터페이스, 열거형, 프로퍼티를 AST 수준에서 추출
|
|
17
|
+
- **관계 분석** — `import`, `calls`, `extends`, `implements` 관계를 파일 간에 추적
|
|
18
|
+
- **전문 검색** — SQLite FTS5 기반 심볼 이름 전문 검색
|
|
19
|
+
- **의존성 그래프** — 방향 import 그래프로 순환 감지 및 전이적(transitive) 영향도 분석
|
|
20
|
+
- **증분 인덱싱** — `@parcel/watcher` 기반 파일 변경 감지, 변경된 파일만 재인덱싱
|
|
21
|
+
- **멀티 프로세스 안전** — owner/reader 역할 분리로 단일 writer 보장
|
|
22
|
+
|
|
23
|
+
<br>
|
|
24
|
+
|
|
25
|
+
## 📋 요구사항
|
|
26
|
+
|
|
27
|
+
- **Bun** v1.3 이상
|
|
28
|
+
- 지원 확장자: `.ts`, `.mts`, `.cts`
|
|
29
|
+
|
|
30
|
+
<br>
|
|
31
|
+
|
|
32
|
+
## 📦 설치
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
bun add @zipbul/gildash
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
<br>
|
|
39
|
+
|
|
40
|
+
## 🚀 빠른 시작
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { Gildash } from '@zipbul/gildash';
|
|
44
|
+
|
|
45
|
+
// 인덱서 열기 — 최초 실행 시 전체 인덱싱 자동 수행, 이후 파일 변경을 감시
|
|
46
|
+
const ledger = await Gildash.open({
|
|
47
|
+
projectRoot: '/absolute/path/to/project',
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// 심볼 검색
|
|
51
|
+
const hits = ledger.searchSymbols({ text: 'UserService', kind: 'class' });
|
|
52
|
+
|
|
53
|
+
// 의존성 그래프 조회
|
|
54
|
+
const deps = ledger.getDependencies('src/app.ts');
|
|
55
|
+
const affected = await ledger.getAffected(['src/utils.ts']);
|
|
56
|
+
const cyclic = await ledger.hasCycle();
|
|
57
|
+
|
|
58
|
+
await ledger.close();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
<br>
|
|
62
|
+
|
|
63
|
+
## 🔍 API 개요
|
|
64
|
+
|
|
65
|
+
| 메서드 | 반환 타입 | 설명 |
|
|
66
|
+
|--------|-----------|------|
|
|
67
|
+
| `searchSymbols(query)` | `SymbolSearchResult[]` | FTS5 전문 검색 + 필터 조합 |
|
|
68
|
+
| `searchRelations(query)` | `CodeRelation[]` | 파일/심볼/관계 유형 필터 |
|
|
69
|
+
| `getDependencies(filePath, project?)` | `string[]` | 이 파일이 import하는 파일 목록 |
|
|
70
|
+
| `getDependents(filePath, project?)` | `string[]` | 이 파일을 import하는 파일 목록 |
|
|
71
|
+
| `getAffected(changedFiles, project?)` | `Promise<string[]>` | 변경 파일의 전이적 영향 범위 |
|
|
72
|
+
| `hasCycle(project?)` | `Promise<boolean>` | 순환 의존성 감지 |
|
|
73
|
+
| `reindex()` | `Promise<IndexResult>` | 강제 전체 재인덱싱 |
|
|
74
|
+
| `onIndexed(callback)` | `() => void` | 인덱싱 완료 이벤트 구독 |
|
|
75
|
+
| `parseSource(filePath, src)` | `ParsedFile` | 파일 파싱 후 AST 캐시 |
|
|
76
|
+
| `extractSymbols(parsed)` | `ExtractedSymbol[]` | 파싱된 파일에서 심볼 추출 |
|
|
77
|
+
| `extractRelations(parsed)` | `CodeRelation[]` | 파싱된 파일에서 관계 추출 |
|
|
78
|
+
| `projects` | `ProjectBoundary[]` | 감지된 프로젝트 경계 (모노레포) |
|
|
79
|
+
| `getStats(project?)` | `SymbolStats` | 심볼 통계 |
|
|
80
|
+
| `close()` | `Promise<void>` | 인덱서 종료 |
|
|
81
|
+
|
|
82
|
+
<br>
|
|
83
|
+
|
|
84
|
+
## ⚙️ API 레퍼런스
|
|
85
|
+
|
|
86
|
+
### `Gildash.open(options)`
|
|
87
|
+
|
|
88
|
+
인덱서 인스턴스를 생성합니다. 최초 실행 시 전체 인덱싱을 수행하고, 이후 파일 변경을 감시합니다.
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
const ledger = await Gildash.open({
|
|
92
|
+
projectRoot: '/absolute/path', // 필수. 절대 경로
|
|
93
|
+
extensions: ['.ts', '.mts', '.cts'], // 선택. 인덱싱 대상 확장자
|
|
94
|
+
ignorePatterns: ['dist', 'vendor'], // 선택. 무시할 디렉토리/패턴
|
|
95
|
+
parseCacheCapacity: 500, // 선택. 파싱 캐시 크기
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
| 옵션 | 타입 | 기본값 | 설명 |
|
|
100
|
+
|------|------|--------|------|
|
|
101
|
+
| `projectRoot` | `string` | — | 프로젝트 루트 절대 경로 **(필수)** |
|
|
102
|
+
| `extensions` | `string[]` | `['.ts', '.mts', '.cts']` | 인덱싱 대상 파일 확장자 |
|
|
103
|
+
| `ignorePatterns` | `string[]` | `[]` | 무시할 경로 패턴 |
|
|
104
|
+
| `parseCacheCapacity` | `number` | `500` | LRU 파싱 캐시 최대 크기 |
|
|
105
|
+
| `logger` | `Logger` | `console` | 커스텀 로거 (`{ error(...args): void }`) |
|
|
106
|
+
|
|
107
|
+
**반환**: `Promise<Gildash>`
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### `ledger.close()`
|
|
112
|
+
|
|
113
|
+
인덱서를 종료합니다. watcher 중지, DB 연결 해제, 시그널 핸들러 제거를 수행합니다.
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
await ledger.close();
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**반환**: `Promise<void>`
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### `ledger.searchSymbols(query)`
|
|
124
|
+
|
|
125
|
+
심볼을 검색합니다. FTS5 전문 검색과 필터를 조합할 수 있습니다.
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
// 이름으로 검색
|
|
129
|
+
const results = ledger.searchSymbols({ text: 'handleClick' });
|
|
130
|
+
|
|
131
|
+
// 종류 + export 여부 필터
|
|
132
|
+
const classes = ledger.searchSymbols({
|
|
133
|
+
kind: 'class',
|
|
134
|
+
isExported: true,
|
|
135
|
+
limit: 50,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// 파일 경로 필터
|
|
139
|
+
const inFile = ledger.searchSymbols({
|
|
140
|
+
filePath: 'src/services/user.ts',
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
| 필드 | 타입 | 설명 |
|
|
145
|
+
|------|------|------|
|
|
146
|
+
| `text` | `string?` | FTS5 전문 검색 쿼리 |
|
|
147
|
+
| `kind` | `SymbolKind?` | `'function'` \| `'method'` \| `'class'` \| `'variable'` \| `'type'` \| `'interface'` \| `'enum'` \| `'property'` |
|
|
148
|
+
| `filePath` | `string?` | 특정 파일 경로 필터 |
|
|
149
|
+
| `isExported` | `boolean?` | export 여부 필터 |
|
|
150
|
+
| `project` | `string?` | 프로젝트 이름 (모노레포 지원) |
|
|
151
|
+
| `limit` | `number?` | 최대 결과 수 |
|
|
152
|
+
|
|
153
|
+
**반환**: `SymbolSearchResult[]`
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
interface SymbolSearchResult {
|
|
157
|
+
id: number;
|
|
158
|
+
filePath: string;
|
|
159
|
+
kind: SymbolKind;
|
|
160
|
+
name: string;
|
|
161
|
+
span: {
|
|
162
|
+
start: { line: number; column: number };
|
|
163
|
+
end: { line: number; column: number };
|
|
164
|
+
};
|
|
165
|
+
isExported: boolean;
|
|
166
|
+
signature: string | null;
|
|
167
|
+
fingerprint: string | null;
|
|
168
|
+
detail: Record<string, unknown>;
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
### `ledger.searchRelations(query)`
|
|
175
|
+
|
|
176
|
+
파일/심볼 간 관계를 검색합니다.
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
// 특정 파일이 import하는 관계
|
|
180
|
+
const imports = ledger.searchRelations({
|
|
181
|
+
srcFilePath: 'src/app.ts',
|
|
182
|
+
type: 'imports',
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// 특정 심볼을 호출하는 관계
|
|
186
|
+
const callers = ledger.searchRelations({
|
|
187
|
+
dstSymbolName: 'processOrder',
|
|
188
|
+
type: 'calls',
|
|
189
|
+
});
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
| 필드 | 타입 | 설명 |
|
|
193
|
+
|------|------|------|
|
|
194
|
+
| `srcFilePath` | `string?` | 출발 파일 경로 |
|
|
195
|
+
| `srcSymbolName` | `string?` | 출발 심볼 이름 |
|
|
196
|
+
| `dstFilePath` | `string?` | 도착 파일 경로 |
|
|
197
|
+
| `dstSymbolName` | `string?` | 도착 심볼 이름 |
|
|
198
|
+
| `type` | `'imports'` \| `'calls'` \| `'extends'` \| `'implements'`? | 관계 유형 |
|
|
199
|
+
| `project` | `string?` | 프로젝트 이름 |
|
|
200
|
+
| `limit` | `number?` | 최대 결과 수 |
|
|
201
|
+
|
|
202
|
+
**반환**: `CodeRelation[]`
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
interface CodeRelation {
|
|
206
|
+
type: 'imports' | 'calls' | 'extends' | 'implements';
|
|
207
|
+
srcFilePath: string;
|
|
208
|
+
srcSymbolName: string | null; // null = 모듈 레벨
|
|
209
|
+
dstFilePath: string;
|
|
210
|
+
dstSymbolName: string | null;
|
|
211
|
+
metaJson?: string;
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
### `ledger.getDependencies(filePath, project?)`
|
|
218
|
+
|
|
219
|
+
특정 파일이 import하는 파일 목록을 반환합니다.
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
const deps = ledger.getDependencies('src/app.ts');
|
|
223
|
+
// → ['src/utils.ts', 'src/config.ts', ...]
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**반환**: `string[]`
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
### `ledger.getDependents(filePath, project?)`
|
|
231
|
+
|
|
232
|
+
특정 파일을 import하는 파일 목록을 반환합니다.
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
const dependents = ledger.getDependents('src/utils.ts');
|
|
236
|
+
// → ['src/app.ts', 'src/services/user.ts', ...]
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**반환**: `string[]`
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
### `ledger.getAffected(changedFiles, project?)`
|
|
244
|
+
|
|
245
|
+
변경된 파일들의 영향을 받는 모든 파일을 전이적(transitive)으로 계산합니다.
|
|
246
|
+
|
|
247
|
+
```ts
|
|
248
|
+
const affected = await ledger.getAffected(['src/utils.ts']);
|
|
249
|
+
// → ['src/app.ts', 'src/services/user.ts', 'src/main.ts', ...]
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**반환**: `Promise<string[]>`
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
### `ledger.hasCycle(project?)`
|
|
257
|
+
|
|
258
|
+
프로젝트의 import 그래프에 순환 의존성이 있는지 검사합니다.
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
const cyclic = await ledger.hasCycle();
|
|
262
|
+
if (cyclic) {
|
|
263
|
+
console.warn('순환 의존성이 감지되었습니다');
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**반환**: `Promise<boolean>`
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
### `ledger.reindex()`
|
|
272
|
+
|
|
273
|
+
수동으로 전체 재인덱싱을 수행합니다. owner 역할에서만 사용 가능합니다.
|
|
274
|
+
|
|
275
|
+
```ts
|
|
276
|
+
const result = await ledger.reindex();
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**반환**: `Promise<IndexResult>`
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
### `ledger.onIndexed(callback)`
|
|
284
|
+
|
|
285
|
+
인덱싱 완료 이벤트를 구독합니다.
|
|
286
|
+
|
|
287
|
+
```ts
|
|
288
|
+
const unsubscribe = ledger.onIndexed((result) => {
|
|
289
|
+
console.log(`인덱싱 완료: ${result.indexedFiles}개 파일`);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
// 구독 해제
|
|
293
|
+
unsubscribe();
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**반환**: `() => void` (구독 해제 함수)
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
### `ledger.projects`
|
|
301
|
+
|
|
302
|
+
감지된 프로젝트 경계 목록을 반환합니다 (모노레포에서 여러 프로젝트 감지).
|
|
303
|
+
|
|
304
|
+
```ts
|
|
305
|
+
const boundaries = ledger.projects;
|
|
306
|
+
// → [{ project: 'my-app', root: '/path/to/project' }, ...]
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**타입**: `ProjectBoundary[]`
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
### `ledger.getStats(project?)`
|
|
314
|
+
|
|
315
|
+
심볼 통계를 반환합니다.
|
|
316
|
+
|
|
317
|
+
```ts
|
|
318
|
+
const stats = ledger.getStats();
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**반환**: `SymbolStats`
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
### `ledger.parseSource(filePath, sourceText)`
|
|
326
|
+
|
|
327
|
+
파일을 파싱하여 AST를 반환합니다. 결과는 내부 캐시에 저장됩니다.
|
|
328
|
+
|
|
329
|
+
```ts
|
|
330
|
+
const parsed = ledger.parseSource('/path/to/file.ts', sourceCode);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**반환**: `ParsedFile`
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
### `ledger.extractSymbols(parsed)`
|
|
338
|
+
|
|
339
|
+
파싱된 파일에서 심볼을 추출합니다.
|
|
340
|
+
|
|
341
|
+
```ts
|
|
342
|
+
const symbols = ledger.extractSymbols(parsed);
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**반환**: `ExtractedSymbol[]`
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
### `ledger.extractRelations(parsed)`
|
|
350
|
+
|
|
351
|
+
파싱된 파일에서 관계를 추출합니다.
|
|
352
|
+
|
|
353
|
+
```ts
|
|
354
|
+
const relations = ledger.extractRelations(parsed);
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**반환**: `CodeRelation[]`
|
|
358
|
+
|
|
359
|
+
<br>
|
|
360
|
+
|
|
361
|
+
## 🏗 아키텍처
|
|
362
|
+
|
|
363
|
+
```
|
|
364
|
+
Gildash (파사드)
|
|
365
|
+
├── Parser — oxc-parser 기반 TypeScript AST 파싱
|
|
366
|
+
├── Extractor — 심볼/관계 추출 (imports, calls, heritage)
|
|
367
|
+
├── Store — bun:sqlite + drizzle-orm (files, symbols, relations, FTS5)
|
|
368
|
+
├── Indexer — 변경 감지 → 파싱 → 추출 → 저장 파이프라인
|
|
369
|
+
├── Search — 심볼 검색, 관계 검색, 의존성 그래프
|
|
370
|
+
└── Watcher — @parcel/watcher + owner/reader 역할 관리
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Owner/Reader 패턴
|
|
374
|
+
|
|
375
|
+
동일 SQLite DB를 여러 프로세스가 공유할 때, 단일 writer를 보장합니다.
|
|
376
|
+
|
|
377
|
+
- **Owner** — watcher 실행, 인덱싱 수행, heartbeat 전송 (30초 간격)
|
|
378
|
+
- **Reader** — 읽기 전용 접근, 60초 간격으로 owner 상태 확인; owner가 stale 상태가 되면 reader 중 하나가 owner로 승격
|
|
379
|
+
|
|
380
|
+
<br>
|
|
381
|
+
|
|
382
|
+
## 라이선스
|
|
383
|
+
|
|
384
|
+
[MIT](./LICENSE) © [zipbul](https://github.com/zipbul)
|
|
385
|
+
|
|
386
|
+
|