aiwf 0.3.15 → 0.3.17
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/README.ko.md +4 -5
- package/README.md +90 -196
- package/docs/ADR_MANAGEMENT_GUIDE.ko.md +602 -0
- package/docs/ADR_MANAGEMENT_GUIDE.md +602 -0
- package/docs/API_REFERENCE_FULL.ko.md +1135 -0
- package/docs/API_REFERENCE_FULL.md +1135 -0
- package/docs/ARCHITECTURE.ko.md +314 -0
- package/docs/ARCHITECTURE.md +314 -0
- package/docs/EXAMPLES.ko.md +695 -0
- package/docs/EXAMPLES.md +12 -12
- package/docs/GETTING_STARTED.ko.md +219 -0
- package/docs/GETTING_STARTED.md +19 -26
- package/docs/MODULE_MANAGEMENT_GUIDE.ko.md +289 -0
- package/docs/MODULE_MANAGEMENT_GUIDE.md +289 -0
- package/docs/PERFORMANCE_GUIDELINES.ko.md +388 -0
- package/docs/PRD.ko.md +2 -2
- package/docs/PRD.md +2 -2
- package/docs/TROUBLESHOOTING.ko.md +366 -0
- package/docs/YOLO_SYSTEM_GUIDE.ko.md +542 -0
- package/docs/YOLO_SYSTEM_GUIDE.md +542 -0
- package/package.json +50 -2
- package/src/DEPENDENCY_MAP.md +90 -0
- package/src/lib/installer.js +1 -0
- package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -14
- package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -11
- package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +2 -5
- package/src/lib/resources/utils/token-reporter.js +2 -3
- package/src/utils/checkpoint-manager.js +11 -1
- package/src/utils/engineering-guard.js +11 -1
- package/templates/api-server/template/src/controllers/aiwfController.ts +0 -14
- package/templates/api-server/template/src/routes/aiwf.ts +0 -11
- package/templates/web-app/template/src/pages/AiwfDashboard.tsx +2 -5
- package/docs/guides/feature-git-integration-guide-ko.md +0 -481
- package/docs/guides/feature-git-integration-guide.md +0 -481
- package/src/commands/cache-templates.js +0 -209
- package/src/commands/create-offline.js +0 -86
- package/src/commands/state-refactored.js +0 -419
- package/src/lib/resources/commands/feature-ledger.js +0 -565
- package/src/lib/resources/commands/feature_commit_report.js +0 -370
- package/src/lib/resources/commands/scan_git_history.js +0 -234
- package/src/lib/resources/commands/sync_feature_commits.js +0 -154
- package/src/lib/resources/templates/web-app/template/src/components/aiwf/FeatureLedger.tsx +0 -93
- package/src/lib/resources/utils/feature-updater.js +0 -271
- package/src/utils/git-integration.js +0 -173
- package/templates/web-app/template/src/components/aiwf/FeatureLedger.tsx +0 -93
|
@@ -0,0 +1,1135 @@
|
|
|
1
|
+
# AIWF 전체 API 참조
|
|
2
|
+
|
|
3
|
+
[Read in English](API_REFERENCE_FULL.md)
|
|
4
|
+
|
|
5
|
+
## 목차
|
|
6
|
+
|
|
7
|
+
1. [핵심 API](#핵심-api)
|
|
8
|
+
- [리소스 로더](#리소스-로더)
|
|
9
|
+
- [상태 관리](#상태-관리)
|
|
10
|
+
- [템플릿 시스템](#템플릿-시스템)
|
|
11
|
+
2. [명령어 API](#명령어-api)
|
|
12
|
+
- [AI 도구 명령어](#ai-도구-명령어)
|
|
13
|
+
- [압축 명령어](#압축-명령어)
|
|
14
|
+
- [프로젝트 생성](#프로젝트-생성)
|
|
15
|
+
- [평가 명령어](#평가-명령어)
|
|
16
|
+
- [기능 명령어](#기능-명령어)
|
|
17
|
+
- [페르소나 명령어](#페르소나-명령어)
|
|
18
|
+
- [상태 명령어](#상태-명령어)
|
|
19
|
+
- [토큰 명령어](#토큰-명령어)
|
|
20
|
+
- [YOLO 설정](#yolo-설정)
|
|
21
|
+
3. [유틸리티 API](#유틸리티-api)
|
|
22
|
+
- [체크포인트 관리자](#체크포인트-관리자)
|
|
23
|
+
- [Git 유틸리티](#git-유틸리티)
|
|
24
|
+
- [토큰 카운터](#토큰-카운터)
|
|
25
|
+
- [텍스트 프로세서](#텍스트-프로세서)
|
|
26
|
+
4. [플러그인 API](#플러그인-api)
|
|
27
|
+
- [플러그인 인터페이스](#플러그인-인터페이스)
|
|
28
|
+
- [훅 시스템](#훅-시스템)
|
|
29
|
+
5. [AI 통합 API](#ai-통합-api)
|
|
30
|
+
- [페르소나 관리자](#페르소나-관리자)
|
|
31
|
+
- [압축 엔진](#압축-엔진)
|
|
32
|
+
- [평가 시스템](#평가-시스템)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 핵심 API
|
|
37
|
+
|
|
38
|
+
### 리소스 로더
|
|
39
|
+
|
|
40
|
+
리소스 로더는 모든 프레임워크 리소스를 관리하며, 번들된 리소스와 사용자 리소스에 대한 통합 인터페이스를 제공합니다.
|
|
41
|
+
|
|
42
|
+
#### 클래스: `ResourceLoader`
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
import { ResourceLoader } from 'aiwf/lib/resource-loader';
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
##### 생성자
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
new ResourceLoader(options?: ResourceLoaderOptions)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**옵션:**
|
|
55
|
+
```typescript
|
|
56
|
+
interface ResourceLoaderOptions {
|
|
57
|
+
bundledPath?: string; // 번들된 리소스 경로
|
|
58
|
+
userPath?: string; // 사용자 리소스 경로
|
|
59
|
+
preferUserResources?: boolean; // 사용자 리소스 우선 (기본값: true)
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
##### 메서드
|
|
64
|
+
|
|
65
|
+
###### `resolvePath(resourceType, resourceName)`
|
|
66
|
+
|
|
67
|
+
리소스 경로를 확인합니다. 사용자 디렉토리를 먼저 확인한 후 번들된 리소스를 확인합니다.
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
async resolvePath(resourceType: string, resourceName: string): Promise<string>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**예제:**
|
|
74
|
+
```javascript
|
|
75
|
+
const loader = new ResourceLoader();
|
|
76
|
+
const personaPath = await loader.resolvePath('personas', 'analyst.json');
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
###### `loadResource(resourceType, resourceName)`
|
|
80
|
+
|
|
81
|
+
리소스 파일을 로드하고 파싱합니다.
|
|
82
|
+
|
|
83
|
+
```javascript
|
|
84
|
+
async loadResource(resourceType: string, resourceName: string): Promise<any>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**지원 형식:**
|
|
88
|
+
- JSON (`.json`)
|
|
89
|
+
- YAML (`.yaml`, `.yml`)
|
|
90
|
+
- JavaScript 모듈 (`.js`)
|
|
91
|
+
- Markdown (`.md`)
|
|
92
|
+
|
|
93
|
+
###### `listResources(resourceType)`
|
|
94
|
+
|
|
95
|
+
특정 유형의 모든 사용 가능한 리소스를 나열합니다.
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
async listResources(resourceType: string): Promise<string[]>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
###### `copyResource(resourceType, resourceName, destination)`
|
|
102
|
+
|
|
103
|
+
리소스를 지정된 위치로 복사합니다.
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
async copyResource(
|
|
107
|
+
resourceType: string,
|
|
108
|
+
resourceName: string,
|
|
109
|
+
destination: string
|
|
110
|
+
): Promise<void>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 상태 관리
|
|
114
|
+
|
|
115
|
+
체크포인트와 원자적 업데이트를 지원하는 애플리케이션 및 프로젝트 상태를 관리합니다.
|
|
116
|
+
|
|
117
|
+
#### 클래스: `StateIndexManager`
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
import { StateIndexManager } from 'aiwf/lib/state/state-index';
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
##### 생성자
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
new StateIndexManager(aiwfPath: string)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
##### 메서드
|
|
130
|
+
|
|
131
|
+
###### `loadState()`
|
|
132
|
+
|
|
133
|
+
디스크에서 현재 상태를 로드합니다.
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
async loadState(): Promise<StateIndex>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**반환값:**
|
|
140
|
+
```typescript
|
|
141
|
+
interface StateIndex {
|
|
142
|
+
version: string;
|
|
143
|
+
last_updated: string;
|
|
144
|
+
last_updated_by: string;
|
|
145
|
+
project_info: ProjectInfo;
|
|
146
|
+
milestones: Milestone[];
|
|
147
|
+
sprints: Sprint[];
|
|
148
|
+
tasks: Task[];
|
|
149
|
+
workflow_mode: WorkflowMode;
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
###### `saveState(state)`
|
|
154
|
+
|
|
155
|
+
자동 백업과 함께 상태를 디스크에 저장합니다.
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
async saveState(state: StateIndex): Promise<void>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
###### `updateProjectInfo(updates)`
|
|
162
|
+
|
|
163
|
+
프로젝트 정보를 업데이트합니다.
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
async updateProjectInfo(updates: Partial<ProjectInfo>): Promise<void>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
###### `addMilestone(milestone)`
|
|
170
|
+
|
|
171
|
+
프로젝트에 새 마일스톤을 추가합니다.
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
async addMilestone(milestone: Milestone): Promise<void>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 템플릿 시스템
|
|
178
|
+
|
|
179
|
+
프로젝트 템플릿과 코드 생성을 관리합니다.
|
|
180
|
+
|
|
181
|
+
#### 클래스: `TemplateEngine`
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
import { TemplateEngine } from 'aiwf/lib/template-engine';
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
##### 메서드
|
|
188
|
+
|
|
189
|
+
###### `listTemplates()`
|
|
190
|
+
|
|
191
|
+
사용 가능한 모든 프로젝트 템플릿을 나열합니다.
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
async listTemplates(): Promise<TemplateInfo[]>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
###### `createFromTemplate(templateName, targetPath, variables)`
|
|
198
|
+
|
|
199
|
+
템플릿에서 새 프로젝트를 생성합니다.
|
|
200
|
+
|
|
201
|
+
```javascript
|
|
202
|
+
async createFromTemplate(
|
|
203
|
+
templateName: string,
|
|
204
|
+
targetPath: string,
|
|
205
|
+
variables: Record<string, string>
|
|
206
|
+
): Promise<void>
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**예제:**
|
|
210
|
+
```javascript
|
|
211
|
+
const engine = new TemplateEngine();
|
|
212
|
+
await engine.createFromTemplate('api-server', './my-api', {
|
|
213
|
+
projectName: '내 API',
|
|
214
|
+
author: '홍길동',
|
|
215
|
+
description: '멋진 API 서버'
|
|
216
|
+
});
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 명령어 API
|
|
222
|
+
|
|
223
|
+
### AI 도구 명령어
|
|
224
|
+
|
|
225
|
+
AI 도구 통합과 구성을 관리합니다.
|
|
226
|
+
|
|
227
|
+
#### 클래스: `AIToolCommand`
|
|
228
|
+
|
|
229
|
+
```javascript
|
|
230
|
+
import AIToolCommand from 'aiwf/commands/ai-tool';
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
##### 메서드
|
|
234
|
+
|
|
235
|
+
###### `execute(args)`
|
|
236
|
+
|
|
237
|
+
AI 도구 명령을 실행합니다.
|
|
238
|
+
|
|
239
|
+
```javascript
|
|
240
|
+
async execute(args: string[]): Promise<void>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**하위 명령어:**
|
|
244
|
+
- `list` - 사용 가능한 모든 AI 도구 나열
|
|
245
|
+
- `activate <tool>` - AI 도구 활성화
|
|
246
|
+
- `configure <tool>` - AI 도구 구성
|
|
247
|
+
- `status` - 현재 AI 도구 상태 표시
|
|
248
|
+
|
|
249
|
+
### 압축 명령어
|
|
250
|
+
|
|
251
|
+
컨텍스트 최적화를 위한 다양한 압축 전략을 제공합니다.
|
|
252
|
+
|
|
253
|
+
#### 함수
|
|
254
|
+
|
|
255
|
+
###### `compress(mode, content, options)`
|
|
256
|
+
|
|
257
|
+
지정된 전략을 사용하여 콘텐츠를 압축합니다.
|
|
258
|
+
|
|
259
|
+
```javascript
|
|
260
|
+
async compress(
|
|
261
|
+
mode: CompressionMode,
|
|
262
|
+
content: string,
|
|
263
|
+
options?: CompressionOptions
|
|
264
|
+
): Promise<string>
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**압축 모드:**
|
|
268
|
+
- `simple` - 기본 공백 및 주석 제거
|
|
269
|
+
- `moderate` - 균형 잡힌 압축
|
|
270
|
+
- `aggressive` - 최대 압축
|
|
271
|
+
- `custom` - 사용자 정의 규칙
|
|
272
|
+
|
|
273
|
+
**옵션:**
|
|
274
|
+
```typescript
|
|
275
|
+
interface CompressionOptions {
|
|
276
|
+
preserveComments?: boolean;
|
|
277
|
+
preserveWhitespace?: boolean;
|
|
278
|
+
maxLineLength?: number;
|
|
279
|
+
customRules?: CompressionRule[];
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### 프로젝트 생성
|
|
284
|
+
|
|
285
|
+
템플릿에서 새 AIWF 프로젝트를 생성합니다.
|
|
286
|
+
|
|
287
|
+
#### 함수: `createProject`
|
|
288
|
+
|
|
289
|
+
```javascript
|
|
290
|
+
async createProject(options: CreateProjectOptions): Promise<void>
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**옵션:**
|
|
294
|
+
```typescript
|
|
295
|
+
interface CreateProjectOptions {
|
|
296
|
+
template: string;
|
|
297
|
+
name: string;
|
|
298
|
+
path?: string;
|
|
299
|
+
variables?: Record<string, string>;
|
|
300
|
+
skipInstall?: boolean;
|
|
301
|
+
gitInit?: boolean;
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 평가 명령어
|
|
306
|
+
|
|
307
|
+
AI 응답과 코드 품질을 평가합니다.
|
|
308
|
+
|
|
309
|
+
#### 클래스: `EvaluateCommand`
|
|
310
|
+
|
|
311
|
+
##### 메서드
|
|
312
|
+
|
|
313
|
+
###### `evaluateResponse(file, options)`
|
|
314
|
+
|
|
315
|
+
AI 응답의 품질을 평가합니다.
|
|
316
|
+
|
|
317
|
+
```javascript
|
|
318
|
+
async evaluateResponse(
|
|
319
|
+
file: string,
|
|
320
|
+
options?: EvaluationOptions
|
|
321
|
+
): Promise<EvaluationResult>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
###### `evaluateCode(file, options)`
|
|
325
|
+
|
|
326
|
+
코드 품질과 모범 사례를 평가합니다.
|
|
327
|
+
|
|
328
|
+
```javascript
|
|
329
|
+
async evaluateCode(
|
|
330
|
+
file: string,
|
|
331
|
+
options?: CodeEvaluationOptions
|
|
332
|
+
): Promise<CodeEvaluationResult>
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### 기능 명령어
|
|
336
|
+
|
|
337
|
+
기능 추적과 개발 워크플로우를 관리합니다.
|
|
338
|
+
|
|
339
|
+
#### 함수
|
|
340
|
+
|
|
341
|
+
###### `createFeature(name, description)`
|
|
342
|
+
|
|
343
|
+
새 기능 항목을 생성합니다.
|
|
344
|
+
|
|
345
|
+
```javascript
|
|
346
|
+
async createFeature(
|
|
347
|
+
name: string,
|
|
348
|
+
description?: string
|
|
349
|
+
): Promise<FeatureEntry>
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
###### `updateFeatureStatus(id, status)`
|
|
353
|
+
|
|
354
|
+
기능의 상태를 업데이트합니다.
|
|
355
|
+
|
|
356
|
+
```javascript
|
|
357
|
+
async updateFeatureStatus(
|
|
358
|
+
id: string,
|
|
359
|
+
status: FeatureStatus
|
|
360
|
+
): Promise<void>
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**기능 상태:**
|
|
364
|
+
- `planned` - 계획됨
|
|
365
|
+
- `in-progress` - 진행 중
|
|
366
|
+
- `testing` - 테스트 중
|
|
367
|
+
- `completed` - 완료됨
|
|
368
|
+
- `deployed` - 배포됨
|
|
369
|
+
|
|
370
|
+
### 페르소나 명령어
|
|
371
|
+
|
|
372
|
+
AI 페르소나와 구성을 관리합니다.
|
|
373
|
+
|
|
374
|
+
#### 클래스: `PersonaCommand`
|
|
375
|
+
|
|
376
|
+
##### 메서드
|
|
377
|
+
|
|
378
|
+
###### `listPersonas()`
|
|
379
|
+
|
|
380
|
+
사용 가능한 모든 페르소나를 나열합니다.
|
|
381
|
+
|
|
382
|
+
```javascript
|
|
383
|
+
async listPersonas(): Promise<PersonaInfo[]>
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
###### `activatePersona(name)`
|
|
387
|
+
|
|
388
|
+
특정 페르소나를 활성화합니다.
|
|
389
|
+
|
|
390
|
+
```javascript
|
|
391
|
+
async activatePersona(name: string): Promise<void>
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
###### `createPersona(name, config)`
|
|
395
|
+
|
|
396
|
+
커스텀 페르소나를 생성합니다.
|
|
397
|
+
|
|
398
|
+
```javascript
|
|
399
|
+
async createPersona(
|
|
400
|
+
name: string,
|
|
401
|
+
config: PersonaConfig
|
|
402
|
+
): Promise<void>
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### 상태 명령어
|
|
406
|
+
|
|
407
|
+
프로젝트 상태와 워크플로우 전환을 관리합니다.
|
|
408
|
+
|
|
409
|
+
#### 클래스: `StateCommand`
|
|
410
|
+
|
|
411
|
+
##### 메서드
|
|
412
|
+
|
|
413
|
+
###### `showStatus()`
|
|
414
|
+
|
|
415
|
+
현재 프로젝트 상태를 표시합니다.
|
|
416
|
+
|
|
417
|
+
```javascript
|
|
418
|
+
async showStatus(): Promise<StateStatus>
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
###### `checkpoint(name, description)`
|
|
422
|
+
|
|
423
|
+
상태 체크포인트를 생성합니다.
|
|
424
|
+
|
|
425
|
+
```javascript
|
|
426
|
+
async checkpoint(
|
|
427
|
+
name: string,
|
|
428
|
+
description?: string
|
|
429
|
+
): Promise<CheckpointInfo>
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
###### `restore(checkpointId)`
|
|
433
|
+
|
|
434
|
+
체크포인트에서 복원합니다.
|
|
435
|
+
|
|
436
|
+
```javascript
|
|
437
|
+
async restore(checkpointId: string): Promise<void>
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### 토큰 명령어
|
|
441
|
+
|
|
442
|
+
AI 토큰 사용량을 모니터링하고 관리합니다.
|
|
443
|
+
|
|
444
|
+
#### 함수
|
|
445
|
+
|
|
446
|
+
###### `trackUsage(input, output, model)`
|
|
447
|
+
|
|
448
|
+
토큰 사용량을 기록합니다.
|
|
449
|
+
|
|
450
|
+
```javascript
|
|
451
|
+
async trackUsage(
|
|
452
|
+
input: string,
|
|
453
|
+
output: string,
|
|
454
|
+
model?: string
|
|
455
|
+
): Promise<UsageRecord>
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
###### `getUsageReport(period)`
|
|
459
|
+
|
|
460
|
+
사용량 보고서를 생성합니다.
|
|
461
|
+
|
|
462
|
+
```javascript
|
|
463
|
+
async getUsageReport(
|
|
464
|
+
period?: 'day' | 'week' | 'month'
|
|
465
|
+
): Promise<UsageReport>
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### YOLO 설정
|
|
469
|
+
|
|
470
|
+
YOLO 모드 구성을 관리합니다.
|
|
471
|
+
|
|
472
|
+
#### 함수
|
|
473
|
+
|
|
474
|
+
###### `createYoloConfig(options)`
|
|
475
|
+
|
|
476
|
+
YOLO 구성 파일을 생성합니다.
|
|
477
|
+
|
|
478
|
+
```javascript
|
|
479
|
+
async createYoloConfig(options?: YoloOptions): Promise<void>
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
###### `createInteractiveYoloConfig()`
|
|
483
|
+
|
|
484
|
+
대화형 프롬프트를 통해 구성을 생성합니다.
|
|
485
|
+
|
|
486
|
+
```javascript
|
|
487
|
+
async createInteractiveYoloConfig(): Promise<void>
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
## 유틸리티 API
|
|
493
|
+
|
|
494
|
+
### 엔지니어링 가드
|
|
495
|
+
|
|
496
|
+
자율 실행 중 오버엔지니어링을 방지하고 코드 품질을 유지합니다.
|
|
497
|
+
|
|
498
|
+
#### 클래스: `EngineeringGuard`
|
|
499
|
+
|
|
500
|
+
```javascript
|
|
501
|
+
import { EngineeringGuard } from 'aiwf/utils/engineering-guard';
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
##### 생성자
|
|
505
|
+
|
|
506
|
+
```javascript
|
|
507
|
+
new EngineeringGuard(configPath?: string)
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
##### 메서드
|
|
511
|
+
|
|
512
|
+
###### `checkFileComplexity(filePath)`
|
|
513
|
+
|
|
514
|
+
단일 파일의 복잡성 위반을 검사합니다.
|
|
515
|
+
|
|
516
|
+
```javascript
|
|
517
|
+
async checkFileComplexity(filePath: string): Promise<void>
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
###### `checkProject(projectPath, filePatterns)`
|
|
521
|
+
|
|
522
|
+
프로젝트 전체의 포괄적인 복잡성 분석을 수행합니다.
|
|
523
|
+
|
|
524
|
+
```javascript
|
|
525
|
+
async checkProject(
|
|
526
|
+
projectPath: string,
|
|
527
|
+
filePatterns?: string[]
|
|
528
|
+
): Promise<GuardReport>
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
**반환값:**
|
|
532
|
+
```typescript
|
|
533
|
+
interface GuardReport {
|
|
534
|
+
passed: boolean;
|
|
535
|
+
violations: Violation[];
|
|
536
|
+
warnings: Warning[];
|
|
537
|
+
summary: {
|
|
538
|
+
total_violations: number;
|
|
539
|
+
high_severity: number;
|
|
540
|
+
medium_severity: number;
|
|
541
|
+
warnings: number;
|
|
542
|
+
};
|
|
543
|
+
recommendations: string[];
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
###### `provideFeedback(filePath, content)`
|
|
548
|
+
|
|
549
|
+
개발 중 실시간 피드백을 제공합니다.
|
|
550
|
+
|
|
551
|
+
```javascript
|
|
552
|
+
async provideFeedback(
|
|
553
|
+
filePath: string,
|
|
554
|
+
content?: string
|
|
555
|
+
): Promise<Feedback[]>
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
###### `generateReport()`
|
|
559
|
+
|
|
560
|
+
포괄적인 분석 리포트를 생성합니다.
|
|
561
|
+
|
|
562
|
+
```javascript
|
|
563
|
+
generateReport(): GuardReport
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### 체크포인트 관리자
|
|
567
|
+
|
|
568
|
+
상태 체크포인트와 복구를 관리합니다.
|
|
569
|
+
|
|
570
|
+
#### 클래스: `CheckpointManager`
|
|
571
|
+
|
|
572
|
+
```javascript
|
|
573
|
+
import { CheckpointManager } from 'aiwf/utils/checkpoint-manager';
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
##### 생성자
|
|
577
|
+
|
|
578
|
+
```javascript
|
|
579
|
+
new CheckpointManager(projectRoot: string)
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
##### 메서드
|
|
583
|
+
|
|
584
|
+
###### `startSession(sprintId, mode)`
|
|
585
|
+
|
|
586
|
+
추적과 함께 새 YOLO 세션을 시작합니다.
|
|
587
|
+
|
|
588
|
+
```javascript
|
|
589
|
+
async startSession(sprintId: string, mode?: string): Promise<void>
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
###### `startTask(taskId, taskInfo)`
|
|
593
|
+
|
|
594
|
+
특정 태스크 추적을 시작합니다.
|
|
595
|
+
|
|
596
|
+
```javascript
|
|
597
|
+
async startTask(taskId: string, taskInfo?: any): Promise<void>
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
###### `completeTask(taskId, result)`
|
|
601
|
+
|
|
602
|
+
태스크를 결과와 함께 완료된 것으로 표시합니다.
|
|
603
|
+
|
|
604
|
+
```javascript
|
|
605
|
+
async completeTask(taskId: string, result?: any): Promise<void>
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
###### `createCheckpoint(type, metadata)`
|
|
609
|
+
|
|
610
|
+
새 체크포인트를 생성합니다.
|
|
611
|
+
|
|
612
|
+
```javascript
|
|
613
|
+
async createCheckpoint(
|
|
614
|
+
type?: string,
|
|
615
|
+
metadata?: CheckpointMetadata
|
|
616
|
+
): Promise<string>
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
###### `listCheckpoints()`
|
|
620
|
+
|
|
621
|
+
사용 가능한 모든 체크포인트를 나열합니다.
|
|
622
|
+
|
|
623
|
+
```javascript
|
|
624
|
+
async listCheckpoints(): Promise<CheckpointInfo[]>
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
###### `restoreFromCheckpoint(checkpointId)`
|
|
628
|
+
|
|
629
|
+
특정 체크포인트에서 복원합니다.
|
|
630
|
+
|
|
631
|
+
```javascript
|
|
632
|
+
async restoreFromCheckpoint(checkpointId: string): Promise<RestoreResult>
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
**반환값:**
|
|
636
|
+
```typescript
|
|
637
|
+
interface RestoreResult {
|
|
638
|
+
success: boolean;
|
|
639
|
+
checkpoint: Checkpoint;
|
|
640
|
+
tasks_to_resume: {
|
|
641
|
+
completed: string[];
|
|
642
|
+
current: string | null;
|
|
643
|
+
next_task_hint: string;
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
###### `generateProgressReport()`
|
|
649
|
+
|
|
650
|
+
포괄적인 진행률 리포트를 생성합니다.
|
|
651
|
+
|
|
652
|
+
```javascript
|
|
653
|
+
async generateProgressReport(): Promise<ProgressReport>
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
**반환값:**
|
|
657
|
+
```typescript
|
|
658
|
+
interface ProgressReport {
|
|
659
|
+
session: {
|
|
660
|
+
id: string;
|
|
661
|
+
started: string;
|
|
662
|
+
sprint: string;
|
|
663
|
+
mode: string;
|
|
664
|
+
};
|
|
665
|
+
progress: {
|
|
666
|
+
completed: number;
|
|
667
|
+
failed: number;
|
|
668
|
+
skipped: number;
|
|
669
|
+
current: string;
|
|
670
|
+
};
|
|
671
|
+
performance: {
|
|
672
|
+
total_time: string;
|
|
673
|
+
avg_task_time: string;
|
|
674
|
+
success_rate: string;
|
|
675
|
+
};
|
|
676
|
+
checkpoints: CheckpointInfo[];
|
|
677
|
+
recommendations: string[];
|
|
678
|
+
}
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
###### `endSession(summary)`
|
|
682
|
+
|
|
683
|
+
현재 세션을 종료하고 최종 리포트를 생성합니다.
|
|
684
|
+
|
|
685
|
+
```javascript
|
|
686
|
+
async endSession(summary?: any): Promise<ProgressReport>
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### Git 유틸리티
|
|
690
|
+
|
|
691
|
+
Git 통합 유틸리티를 제공합니다.
|
|
692
|
+
|
|
693
|
+
#### 함수
|
|
694
|
+
|
|
695
|
+
###### `parseCommitMessage(message)`
|
|
696
|
+
|
|
697
|
+
구조화된 커밋 메시지를 파싱합니다.
|
|
698
|
+
|
|
699
|
+
```javascript
|
|
700
|
+
parseCommitMessage(message: string): ParsedCommit
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
**반환값:**
|
|
704
|
+
```typescript
|
|
705
|
+
interface ParsedCommit {
|
|
706
|
+
type: string;
|
|
707
|
+
scope?: string;
|
|
708
|
+
subject: string;
|
|
709
|
+
body?: string;
|
|
710
|
+
features?: string[];
|
|
711
|
+
tasks?: string[];
|
|
712
|
+
}
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
###### `getRecentCommits(limit)`
|
|
716
|
+
|
|
717
|
+
최근 커밋 기록을 가져옵니다.
|
|
718
|
+
|
|
719
|
+
```javascript
|
|
720
|
+
async getRecentCommits(limit?: number): Promise<Commit[]>
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
### 토큰 카운터
|
|
724
|
+
|
|
725
|
+
다양한 AI 모델의 토큰을 계산합니다.
|
|
726
|
+
|
|
727
|
+
#### 함수
|
|
728
|
+
|
|
729
|
+
###### `countTokens(text, model)`
|
|
730
|
+
|
|
731
|
+
텍스트의 토큰을 계산합니다.
|
|
732
|
+
|
|
733
|
+
```javascript
|
|
734
|
+
countTokens(text: string, model?: string): number
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
**지원 모델:**
|
|
738
|
+
- `gpt-3.5-turbo`
|
|
739
|
+
- `gpt-4`
|
|
740
|
+
- `claude`
|
|
741
|
+
- `claude-instant`
|
|
742
|
+
|
|
743
|
+
###### `estimateCost(tokens, model)`
|
|
744
|
+
|
|
745
|
+
토큰 수를 기반으로 비용을 추정합니다.
|
|
746
|
+
|
|
747
|
+
```javascript
|
|
748
|
+
estimateCost(tokens: number, model: string): number
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
### 텍스트 프로세서
|
|
752
|
+
|
|
753
|
+
다양한 텍스트 처리 유틸리티입니다.
|
|
754
|
+
|
|
755
|
+
#### 함수
|
|
756
|
+
|
|
757
|
+
###### `summarizeText(text, maxLength)`
|
|
758
|
+
|
|
759
|
+
텍스트의 요약을 생성합니다.
|
|
760
|
+
|
|
761
|
+
```javascript
|
|
762
|
+
async summarizeText(
|
|
763
|
+
text: string,
|
|
764
|
+
maxLength?: number
|
|
765
|
+
): Promise<string>
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
###### `extractKeywords(text)`
|
|
769
|
+
|
|
770
|
+
텍스트에서 키워드를 추출합니다.
|
|
771
|
+
|
|
772
|
+
```javascript
|
|
773
|
+
extractKeywords(text: string): string[]
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
###### `normalizeWhitespace(text)`
|
|
777
|
+
|
|
778
|
+
텍스트의 공백을 정규화합니다.
|
|
779
|
+
|
|
780
|
+
```javascript
|
|
781
|
+
normalizeWhitespace(text: string): string
|
|
782
|
+
```
|
|
783
|
+
|
|
784
|
+
---
|
|
785
|
+
|
|
786
|
+
## 플러그인 API
|
|
787
|
+
|
|
788
|
+
### 플러그인 인터페이스
|
|
789
|
+
|
|
790
|
+
AIWF 플러그인의 표준 인터페이스입니다.
|
|
791
|
+
|
|
792
|
+
#### 인터페이스: `AIWFPlugin`
|
|
793
|
+
|
|
794
|
+
```typescript
|
|
795
|
+
interface AIWFPlugin {
|
|
796
|
+
name: string;
|
|
797
|
+
version: string;
|
|
798
|
+
description?: string;
|
|
799
|
+
|
|
800
|
+
// 생명주기 훅
|
|
801
|
+
init?(context: PluginContext): Promise<void>;
|
|
802
|
+
destroy?(): Promise<void>;
|
|
803
|
+
|
|
804
|
+
// 명령어 훅
|
|
805
|
+
commands?: Record<string, CommandHandler>;
|
|
806
|
+
|
|
807
|
+
// 이벤트 훅
|
|
808
|
+
hooks?: Record<string, HookHandler>;
|
|
809
|
+
}
|
|
810
|
+
```
|
|
811
|
+
|
|
812
|
+
#### 플러그인 컨텍스트
|
|
813
|
+
|
|
814
|
+
```typescript
|
|
815
|
+
interface PluginContext {
|
|
816
|
+
aiwfPath: string;
|
|
817
|
+
projectRoot: string;
|
|
818
|
+
config: AIWFConfig;
|
|
819
|
+
logger: Logger;
|
|
820
|
+
|
|
821
|
+
// 핵심 서비스
|
|
822
|
+
resourceLoader: ResourceLoader;
|
|
823
|
+
stateManager: StateIndexManager;
|
|
824
|
+
templateEngine: TemplateEngine;
|
|
825
|
+
}
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
### 훅 시스템
|
|
829
|
+
|
|
830
|
+
이벤트 기반 확장 시스템입니다.
|
|
831
|
+
|
|
832
|
+
#### 사용 가능한 훅
|
|
833
|
+
|
|
834
|
+
##### 명령어 생명주기
|
|
835
|
+
|
|
836
|
+
```javascript
|
|
837
|
+
hooks: {
|
|
838
|
+
'before-command': async (command, args) => { /* ... */ },
|
|
839
|
+
'after-command': async (command, result) => { /* ... */ },
|
|
840
|
+
'command-error': async (command, error) => { /* ... */ }
|
|
841
|
+
}
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
##### 상태 관리
|
|
845
|
+
|
|
846
|
+
```javascript
|
|
847
|
+
hooks: {
|
|
848
|
+
'before-state-change': async (oldState, newState) => { /* ... */ },
|
|
849
|
+
'after-state-change': async (oldState, newState) => { /* ... */ },
|
|
850
|
+
'state-checkpoint': async (checkpoint) => { /* ... */ }
|
|
851
|
+
}
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
##### 리소스 로딩
|
|
855
|
+
|
|
856
|
+
```javascript
|
|
857
|
+
hooks: {
|
|
858
|
+
'before-resource-load': async (type, name) => { /* ... */ },
|
|
859
|
+
'after-resource-load': async (type, name, content) => { /* ... */ },
|
|
860
|
+
'resource-not-found': async (type, name) => { /* ... */ }
|
|
861
|
+
}
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
---
|
|
865
|
+
|
|
866
|
+
## AI 통합 API
|
|
867
|
+
|
|
868
|
+
### 페르소나 관리자
|
|
869
|
+
|
|
870
|
+
AI 페르소나 구성과 컨텍스트를 관리합니다.
|
|
871
|
+
|
|
872
|
+
#### 클래스: `AIPersonaManager`
|
|
873
|
+
|
|
874
|
+
```javascript
|
|
875
|
+
import { AIPersonaManager } from 'aiwf/lib/ai-persona-manager';
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
##### 메서드
|
|
879
|
+
|
|
880
|
+
###### `loadPersona(name)`
|
|
881
|
+
|
|
882
|
+
페르소나 구성을 로드합니다.
|
|
883
|
+
|
|
884
|
+
```javascript
|
|
885
|
+
async loadPersona(name: string): Promise<Persona>
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
###### `applyPersona(content, persona)`
|
|
889
|
+
|
|
890
|
+
콘텐츠에 페르소나 컨텍스트를 적용합니다.
|
|
891
|
+
|
|
892
|
+
```javascript
|
|
893
|
+
applyPersona(content: string, persona: Persona): string
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
###### `validatePersona(persona)`
|
|
897
|
+
|
|
898
|
+
페르소나 구성을 검증합니다.
|
|
899
|
+
|
|
900
|
+
```javascript
|
|
901
|
+
validatePersona(persona: Persona): ValidationResult
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
### 압축 엔진
|
|
905
|
+
|
|
906
|
+
지능적인 콘텐츠 압축을 제공합니다.
|
|
907
|
+
|
|
908
|
+
#### 클래스: `CompressionEngine`
|
|
909
|
+
|
|
910
|
+
##### 메서드
|
|
911
|
+
|
|
912
|
+
###### `compress(content, strategy)`
|
|
913
|
+
|
|
914
|
+
지정된 전략을 사용하여 콘텐츠를 압축합니다.
|
|
915
|
+
|
|
916
|
+
```javascript
|
|
917
|
+
async compress(
|
|
918
|
+
content: string,
|
|
919
|
+
strategy: CompressionStrategy
|
|
920
|
+
): Promise<CompressedContent>
|
|
921
|
+
```
|
|
922
|
+
|
|
923
|
+
###### `decompress(compressed)`
|
|
924
|
+
|
|
925
|
+
콘텐츠를 압축 해제합니다.
|
|
926
|
+
|
|
927
|
+
```javascript
|
|
928
|
+
async decompress(compressed: CompressedContent): Promise<string>
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
###### `analyzeCompression(content)`
|
|
932
|
+
|
|
933
|
+
잠재적인 압축 절감 효과를 분석합니다.
|
|
934
|
+
|
|
935
|
+
```javascript
|
|
936
|
+
analyzeCompression(content: string): CompressionAnalysis
|
|
937
|
+
```
|
|
938
|
+
|
|
939
|
+
### 평가 시스템
|
|
940
|
+
|
|
941
|
+
AI 응답과 코드 품질을 평가합니다.
|
|
942
|
+
|
|
943
|
+
#### 클래스: `EvaluationSystem`
|
|
944
|
+
|
|
945
|
+
##### 메서드
|
|
946
|
+
|
|
947
|
+
###### `evaluateQuality(content, criteria)`
|
|
948
|
+
|
|
949
|
+
콘텐츠 품질을 평가합니다.
|
|
950
|
+
|
|
951
|
+
```javascript
|
|
952
|
+
async evaluateQuality(
|
|
953
|
+
content: string,
|
|
954
|
+
criteria?: EvaluationCriteria
|
|
955
|
+
): Promise<QualityScore>
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
###### `compareResponses(responses)`
|
|
959
|
+
|
|
960
|
+
여러 AI 응답을 비교합니다.
|
|
961
|
+
|
|
962
|
+
```javascript
|
|
963
|
+
compareResponses(responses: string[]): ComparisonResult
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
###### `generateReport(evaluations)`
|
|
967
|
+
|
|
968
|
+
평가 보고서를 생성합니다.
|
|
969
|
+
|
|
970
|
+
```javascript
|
|
971
|
+
generateReport(evaluations: Evaluation[]): EvaluationReport
|
|
972
|
+
```
|
|
973
|
+
|
|
974
|
+
---
|
|
975
|
+
|
|
976
|
+
## 오류 처리
|
|
977
|
+
|
|
978
|
+
모든 AIWF API는 일관된 오류 처리 패턴을 따릅니다:
|
|
979
|
+
|
|
980
|
+
```javascript
|
|
981
|
+
try {
|
|
982
|
+
const result = await aiwfApi.someMethod();
|
|
983
|
+
} catch (error) {
|
|
984
|
+
if (error.code === 'RESOURCE_NOT_FOUND') {
|
|
985
|
+
// 누락된 리소스 처리
|
|
986
|
+
} else if (error.code === 'VALIDATION_ERROR') {
|
|
987
|
+
// 검증 오류 처리
|
|
988
|
+
console.error(error.details);
|
|
989
|
+
} else {
|
|
990
|
+
// 예상치 못한 오류 처리
|
|
991
|
+
throw error;
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
### 오류 코드
|
|
997
|
+
|
|
998
|
+
- `RESOURCE_NOT_FOUND` - 요청한 리소스를 찾을 수 없음
|
|
999
|
+
- `VALIDATION_ERROR` - 입력 검증 실패
|
|
1000
|
+
- `STATE_CONFLICT` - 상태 작업 충돌
|
|
1001
|
+
- `PERMISSION_DENIED` - 권한 부족
|
|
1002
|
+
- `NETWORK_ERROR` - 네트워크 작업 실패
|
|
1003
|
+
- `TIMEOUT` - 작업 시간 초과
|
|
1004
|
+
|
|
1005
|
+
---
|
|
1006
|
+
|
|
1007
|
+
## 모범 사례
|
|
1008
|
+
|
|
1009
|
+
### 리소스 관리
|
|
1010
|
+
|
|
1011
|
+
1. 프레임워크 리소스 접근 시 항상 ResourceLoader 사용
|
|
1012
|
+
2. I/O 작업에는 비동기 메서드 선호
|
|
1013
|
+
3. 리소스를 찾을 수 없는 오류를 우아하게 처리
|
|
1014
|
+
4. 가능한 경우 비용이 많이 드는 작업을 캐시
|
|
1015
|
+
|
|
1016
|
+
### 상태 관리
|
|
1017
|
+
|
|
1018
|
+
1. 충돌 방지를 위해 원자적 상태 업데이트 사용
|
|
1019
|
+
2. 주요 작업 전에 체크포인트 생성
|
|
1020
|
+
3. 상태 전환 검증
|
|
1021
|
+
4. 동시 수정 처리
|
|
1022
|
+
|
|
1023
|
+
### 오류 처리
|
|
1024
|
+
|
|
1025
|
+
1. 다양한 시나리오에 대한 구체적인 오류 코드 사용
|
|
1026
|
+
2. 의미 있는 오류 메시지 제공
|
|
1027
|
+
3. 오류 세부 정보에 컨텍스트 포함
|
|
1028
|
+
4. 적절한 오류 로깅
|
|
1029
|
+
|
|
1030
|
+
### 성능
|
|
1031
|
+
|
|
1032
|
+
1. 대용량 파일에는 스트리밍 사용
|
|
1033
|
+
2. 목록에 페이지네이션 구현
|
|
1034
|
+
3. 자주 액세스하는 데이터 캐시
|
|
1035
|
+
4. 메모리 사용량 모니터링
|
|
1036
|
+
|
|
1037
|
+
---
|
|
1038
|
+
|
|
1039
|
+
## 예제
|
|
1040
|
+
|
|
1041
|
+
### 커스텀 명령어 생성
|
|
1042
|
+
|
|
1043
|
+
```javascript
|
|
1044
|
+
import { ResourceLoader } from 'aiwf/lib/resource-loader';
|
|
1045
|
+
import { StateIndexManager } from 'aiwf/lib/state/state-index';
|
|
1046
|
+
|
|
1047
|
+
export default class CustomCommand {
|
|
1048
|
+
constructor() {
|
|
1049
|
+
this.loader = new ResourceLoader();
|
|
1050
|
+
this.stateManager = new StateIndexManager('.aiwf');
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
async execute(args) {
|
|
1054
|
+
// 현재 상태 로드
|
|
1055
|
+
const state = await this.stateManager.loadState();
|
|
1056
|
+
|
|
1057
|
+
// 작업 수행
|
|
1058
|
+
// ...
|
|
1059
|
+
|
|
1060
|
+
// 업데이트된 상태 저장
|
|
1061
|
+
await this.stateManager.saveState(state);
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
```
|
|
1065
|
+
|
|
1066
|
+
### 플러그인 생성
|
|
1067
|
+
|
|
1068
|
+
```javascript
|
|
1069
|
+
export default {
|
|
1070
|
+
name: 'my-plugin',
|
|
1071
|
+
version: '1.0.0',
|
|
1072
|
+
|
|
1073
|
+
async init(context) {
|
|
1074
|
+
this.logger = context.logger;
|
|
1075
|
+
this.logger.info('내 플러그인이 초기화되었습니다');
|
|
1076
|
+
},
|
|
1077
|
+
|
|
1078
|
+
commands: {
|
|
1079
|
+
'my-command': {
|
|
1080
|
+
description: '내 커스텀 명령어',
|
|
1081
|
+
handler: async (args, options) => {
|
|
1082
|
+
// 명령어 구현
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
},
|
|
1086
|
+
|
|
1087
|
+
hooks: {
|
|
1088
|
+
'after-state-change': async (oldState, newState) => {
|
|
1089
|
+
this.logger.info('상태가 변경되었습니다', {
|
|
1090
|
+
from: oldState.workflow_mode,
|
|
1091
|
+
to: newState.workflow_mode
|
|
1092
|
+
});
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
};
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
### 압축 엔진 사용
|
|
1099
|
+
|
|
1100
|
+
```javascript
|
|
1101
|
+
import { CompressionEngine } from 'aiwf/utils/compression-engine';
|
|
1102
|
+
|
|
1103
|
+
const engine = new CompressionEngine();
|
|
1104
|
+
|
|
1105
|
+
// 압축 전 분석
|
|
1106
|
+
const analysis = engine.analyzeCompression(largeContent);
|
|
1107
|
+
console.log(`잠재적 절감: ${analysis.savingsPercent}%`);
|
|
1108
|
+
|
|
1109
|
+
// 특정 전략으로 압축
|
|
1110
|
+
const compressed = await engine.compress(largeContent, {
|
|
1111
|
+
strategy: 'aggressive',
|
|
1112
|
+
preserveStructure: true
|
|
1113
|
+
});
|
|
1114
|
+
|
|
1115
|
+
// 나중에 압축 해제
|
|
1116
|
+
const original = await engine.decompress(compressed);
|
|
1117
|
+
```
|
|
1118
|
+
|
|
1119
|
+
---
|
|
1120
|
+
|
|
1121
|
+
## 버전 히스토리
|
|
1122
|
+
|
|
1123
|
+
- **v0.3.x** - 현재 안정 버전
|
|
1124
|
+
- 완전한 API 재설계
|
|
1125
|
+
- 플러그인 시스템 도입
|
|
1126
|
+
- 향상된 상태 관리
|
|
1127
|
+
|
|
1128
|
+
- **v0.2.x** - 레거시 버전
|
|
1129
|
+
- 기본 명령어 구조
|
|
1130
|
+
- 초기 리소스 로더
|
|
1131
|
+
|
|
1132
|
+
- **v0.1.x** - 초기 릴리스
|
|
1133
|
+
- 핵심 프레임워크 설정
|
|
1134
|
+
|
|
1135
|
+
자세한 변경 로그는 [CHANGELOG.md](../CHANGELOG.md)를 참조하세요.
|