aiwf 0.3.21 → 0.3.23
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/package.json +3 -2
- package/src/cli/index.js +39 -336
- package/src/lib/installer.js +310 -90
- package/src/utils/messages.js +24 -0
- package/src/DEPENDENCY_MAP.md +0 -90
- package/src/cli/cache-cli.js +0 -459
- package/src/cli/checkpoint-cli.js +0 -417
- package/src/cli/language-cli.js +0 -286
- package/src/cli/sprint-cli.js +0 -287
- package/src/commands/ai-tool.js +0 -383
- package/src/commands/compress.js +0 -60
- package/src/commands/create-project.js +0 -160
- package/src/commands/evaluate.js +0 -459
- package/src/commands/persona.js +0 -309
- package/src/commands/sprint-task.js +0 -262
- package/src/commands/token.js +0 -312
- package/src/lib/ai-persona-manager.js +0 -711
- package/src/lib/cache-system.js +0 -332
- package/src/lib/context-engine.js +0 -568
- package/src/lib/github-integration.js +0 -402
- package/src/lib/memory-profiler.js +0 -471
- package/src/lib/metrics-collector.js +0 -885
- package/src/lib/offline-detector.js +0 -386
- package/src/lib/resource-loader-enhanced.js +0 -399
- package/src/lib/resource-loader.js +0 -250
- package/src/lib/resources/commands/ai-persona.js +0 -602
- package/src/lib/resources/commands/compress-context.js +0 -389
- package/src/lib/resources/commands/evaluate.js +0 -246
- package/src/lib/resources/commands/persona-context-apply.js +0 -562
- package/src/lib/resources/commands/token-tracking.js +0 -443
- package/src/lib/resources/config/commit-patterns.js +0 -103
- package/src/lib/resources/config/language.json +0 -6
- package/src/lib/resources/personas/PERSONA_INDEX.md +0 -57
- package/src/lib/resources/personas/analyst.json +0 -44
- package/src/lib/resources/personas/architect/best_practices.md +0 -136
- package/src/lib/resources/personas/architect/knowledge_base.md +0 -377
- package/src/lib/resources/personas/architect.json +0 -44
- package/src/lib/resources/personas/backend/best_practices.md +0 -766
- package/src/lib/resources/personas/backend/knowledge_base.md +0 -1070
- package/src/lib/resources/personas/data_analyst/best_practices.md +0 -594
- package/src/lib/resources/personas/data_analyst/knowledge_base.md +0 -1057
- package/src/lib/resources/personas/developer.json +0 -44
- package/src/lib/resources/personas/developer.md +0 -37
- package/src/lib/resources/personas/evaluation_criteria.json +0 -137
- package/src/lib/resources/personas/frontend/best_practices.md +0 -445
- package/src/lib/resources/personas/frontend/knowledge_base.md +0 -729
- package/src/lib/resources/personas/persona-index.json +0 -31
- package/src/lib/resources/personas/reviewer.json +0 -44
- package/src/lib/resources/personas/security/best_practices.md +0 -307
- package/src/lib/resources/personas/security/knowledge_base.md +0 -498
- package/src/lib/resources/personas/tester.json +0 -44
- package/src/lib/resources/templates/README.md +0 -78
- package/src/lib/resources/templates/api-server/config.json +0 -64
- package/src/lib/resources/templates/api-server/template/.aiwf/config.json +0 -56
- package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
- package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
- package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
- package/src/lib/resources/templates/api-server/template/.env.example +0 -29
- package/src/lib/resources/templates/api-server/template/.eslintrc.json +0 -23
- package/src/lib/resources/templates/api-server/template/README.md +0 -171
- package/src/lib/resources/templates/api-server/template/jest.config.js +0 -26
- package/src/lib/resources/templates/api-server/template/nodemon.json +0 -9
- package/src/lib/resources/templates/api-server/template/package.json +0 -61
- package/src/lib/resources/templates/api-server/template/src/app.ts +0 -60
- package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +0 -38
- package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
- package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +0 -128
- package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +0 -28
- package/src/lib/resources/templates/api-server/template/src/index.ts +0 -28
- package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
- package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
- package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
- package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
- package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
- package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -31
- package/src/lib/resources/templates/api-server/template/src/routes/index.ts +0 -13
- package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +0 -67
- package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +0 -37
- package/src/lib/resources/templates/api-server/template/tests/app.test.ts +0 -40
- package/src/lib/resources/templates/api-server/template/tsconfig.json +0 -43
- package/src/lib/resources/templates/npm-library/config.json +0 -61
- package/src/lib/resources/templates/npm-library/template/LICENSE +0 -21
- package/src/lib/resources/templates/npm-library/template/README.md +0 -201
- package/src/lib/resources/templates/npm-library/template/package.json +0 -78
- package/src/lib/resources/templates/web-app/config.json +0 -53
- package/src/lib/resources/templates/web-app/template/.aiwf/config.json +0 -54
- package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
- package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
- package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
- package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +0 -20
- package/src/lib/resources/templates/web-app/template/README.md +0 -151
- package/src/lib/resources/templates/web-app/template/index.html +0 -14
- package/src/lib/resources/templates/web-app/template/package.json +0 -44
- package/src/lib/resources/templates/web-app/template/postcss.config.js +0 -6
- package/src/lib/resources/templates/web-app/template/public/vite.svg +0 -1
- package/src/lib/resources/templates/web-app/template/src/App.tsx +0 -21
- package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +0 -57
- package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
- package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
- package/src/lib/resources/templates/web-app/template/src/index.css +0 -60
- package/src/lib/resources/templates/web-app/template/src/main.tsx +0 -10
- package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
- package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +0 -89
- package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +0 -25
- package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
- package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +0 -9
- package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +0 -1
- package/src/lib/resources/templates/web-app/template/tailwind.config.js +0 -30
- package/src/lib/resources/templates/web-app/template/tsconfig.json +0 -37
- package/src/lib/resources/templates/web-app/template/tsconfig.node.json +0 -10
- package/src/lib/resources/templates/web-app/template/vite.config.ts +0 -23
- package/src/lib/resources/utils/background-monitor.js +0 -223
- package/src/lib/resources/utils/compression-metrics.js +0 -1031
- package/src/lib/resources/utils/compression-strategies.js +0 -557
- package/src/lib/resources/utils/content-normalizer.js +0 -455
- package/src/lib/resources/utils/context-compressor.js +0 -583
- package/src/lib/resources/utils/context-rule-parser.js +0 -180
- package/src/lib/resources/utils/context-token-monitor.js +0 -463
- package/src/lib/resources/utils/context-update-manager.js +0 -502
- package/src/lib/resources/utils/git-utils.js +0 -220
- package/src/lib/resources/utils/importance-classifier.js +0 -645
- package/src/lib/resources/utils/information-filter.js +0 -710
- package/src/lib/resources/utils/persona-aware-compressor.js +0 -598
- package/src/lib/resources/utils/prompt-injector.js +0 -242
- package/src/lib/resources/utils/simplified-evaluator.js +0 -119
- package/src/lib/resources/utils/text-summarizer.js +0 -492
- package/src/lib/resources/utils/token-counter.js +0 -177
- package/src/lib/resources/utils/token-monitor.js +0 -484
- package/src/lib/resources/utils/token-reporter.js +0 -452
- package/src/lib/resources/utils/token-storage.js +0 -433
- package/src/lib/resources/utils/token-tracker.js +0 -283
- package/src/lib/state/priority-calculator.js +0 -217
- package/src/lib/state/state-index.js +0 -155
- package/src/lib/state/task-scanner.js +0 -328
- package/src/lib/task-analyzer.js +0 -599
- package/src/lib/template-cache-system.js +0 -559
- package/src/lib/template-downloader.js +0 -467
- package/src/lib/template-version-manager.js +0 -491
- package/src/lib/token-optimizer.js +0 -517
- package/src/utils/engineering-guard.js +0 -399
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
import { TokenCounter } from '../utils/token-counter.js';
|
|
2
|
-
import { TokenTracker } from '../utils/token-tracker.js';
|
|
3
|
-
import { TokenStorage } from '../utils/token-storage.js';
|
|
4
|
-
import { TokenReporter } from '../utils/token-reporter.js';
|
|
5
|
-
import { TokenMonitor } from '../utils/token-monitor.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 토큰 추적 시스템 명령어 인터페이스
|
|
9
|
-
*/
|
|
10
|
-
export class TokenTrackingCommands {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.counter = new TokenCounter();
|
|
13
|
-
this.tracker = new TokenTracker();
|
|
14
|
-
this.storage = new TokenStorage();
|
|
15
|
-
this.reporter = new TokenReporter();
|
|
16
|
-
this.monitor = new TokenMonitor();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* 텍스트 또는 파일의 토큰 수를 계산합니다
|
|
21
|
-
* @param {Object} options - 옵션
|
|
22
|
-
* @param {string} options.text - 분석할 텍스트
|
|
23
|
-
* @param {string} options.file - 분석할 파일 경로
|
|
24
|
-
* @param {string} options.dir - 분석할 디렉토리 경로
|
|
25
|
-
* @returns {Object} 토큰 카운트 결과
|
|
26
|
-
*/
|
|
27
|
-
async countTokens(options = {}) {
|
|
28
|
-
try {
|
|
29
|
-
if (options.text) {
|
|
30
|
-
const tokens = this.counter.countTokens(options.text);
|
|
31
|
-
return {
|
|
32
|
-
type: 'text',
|
|
33
|
-
tokens,
|
|
34
|
-
characters: options.text.length,
|
|
35
|
-
ratio: options.text.length > 0 ? (tokens / options.text.length).toFixed(3) : 0
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (options.file) {
|
|
40
|
-
const tokens = this.counter.countFileTokens(options.file);
|
|
41
|
-
const stats = await import('fs').then(fs => fs.promises.stat(options.file));
|
|
42
|
-
return {
|
|
43
|
-
type: 'file',
|
|
44
|
-
path: options.file,
|
|
45
|
-
tokens,
|
|
46
|
-
size: stats.size,
|
|
47
|
-
ratio: stats.size > 0 ? (tokens / stats.size).toFixed(3) : 0
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (options.dir) {
|
|
52
|
-
const tokens = this.counter.countDirectoryTokens(options.dir);
|
|
53
|
-
const files = this.counter.getMarkdownFiles(options.dir);
|
|
54
|
-
return {
|
|
55
|
-
type: 'directory',
|
|
56
|
-
path: options.dir,
|
|
57
|
-
tokens,
|
|
58
|
-
fileCount: files.length,
|
|
59
|
-
avgTokensPerFile: files.length > 0 ? Math.round(tokens / files.length) : 0
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
throw new Error('텍스트, 파일 또는 디렉토리 중 하나를 지정해야 합니다.');
|
|
64
|
-
} catch (error) {
|
|
65
|
-
console.error('토큰 카운트 중 오류 발생:', error);
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 명령어 실행을 추적합니다
|
|
72
|
-
* @param {Object} options - 옵션
|
|
73
|
-
* @param {string} options.command - 실행된 명령어
|
|
74
|
-
* @param {string} options.input - 입력 텍스트
|
|
75
|
-
* @param {string} options.output - 출력 텍스트
|
|
76
|
-
* @returns {Object} 추적 결과
|
|
77
|
-
*/
|
|
78
|
-
async trackCommand(options = {}) {
|
|
79
|
-
try {
|
|
80
|
-
const result = this.tracker.trackCommand(
|
|
81
|
-
options.command || 'unknown',
|
|
82
|
-
options.input || '',
|
|
83
|
-
options.output || ''
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
if (result) {
|
|
87
|
-
// 모니터링 시스템에 체크
|
|
88
|
-
const violations = this.monitor.checkThresholds();
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
...result,
|
|
92
|
-
violations,
|
|
93
|
-
sessionStats: this.tracker.getSessionStats()
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return null;
|
|
98
|
-
} catch (error) {
|
|
99
|
-
console.error('명령어 추적 중 오류 발생:', error);
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 현재 세션의 토큰 사용량 보고서를 생성합니다
|
|
106
|
-
* @returns {Object} 세션 보고서
|
|
107
|
-
*/
|
|
108
|
-
async generateSessionReport() {
|
|
109
|
-
try {
|
|
110
|
-
const report = this.tracker.generateReport();
|
|
111
|
-
|
|
112
|
-
if (report) {
|
|
113
|
-
console.log('\n=== 세션 토큰 사용량 보고서 ===');
|
|
114
|
-
console.log(`세션 ID: ${report.sessionId}`);
|
|
115
|
-
console.log(`세션 시간: ${report.sessionDuration}`);
|
|
116
|
-
console.log(`실행 명령어: ${report.totalCommands}개`);
|
|
117
|
-
console.log(`총 토큰: ${report.totalTokens.toLocaleString()}`);
|
|
118
|
-
console.log(`명령어당 평균 토큰: ${report.avgTokensPerCommand.toLocaleString()}`);
|
|
119
|
-
console.log(`시작 시간: ${report.startTime}`);
|
|
120
|
-
console.log(`마지막 업데이트: ${report.lastUpdated}`);
|
|
121
|
-
|
|
122
|
-
if (report.compressionStats) {
|
|
123
|
-
console.log('\n--- 압축 통계 ---');
|
|
124
|
-
console.log(`원본 토큰: ${report.compressionStats.originalTokens.toLocaleString()}`);
|
|
125
|
-
console.log(`압축 토큰: ${report.compressionStats.compressedTokens.toLocaleString()}`);
|
|
126
|
-
console.log(`절약 토큰: ${report.compressionStats.savedTokens.toLocaleString()}`);
|
|
127
|
-
console.log(`압축률: ${report.compressionStats.compressionRatio}`);
|
|
128
|
-
console.log(`효율성: ${report.compressionStats.efficiency}`);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (report.recentCommands.length > 0) {
|
|
132
|
-
console.log('\n--- 최근 명령어 ---');
|
|
133
|
-
report.recentCommands.forEach((cmd, idx) => {
|
|
134
|
-
console.log(`${idx + 1}. ${cmd.command}: ${cmd.totalTokens} 토큰`);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
console.log('\n========================\n');
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return report;
|
|
142
|
-
} catch (error) {
|
|
143
|
-
console.error('세션 보고서 생성 중 오류 발생:', error);
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* 프로젝트 토큰 분석을 수행합니다
|
|
150
|
-
* @param {Object} options - 옵션
|
|
151
|
-
* @param {string} options.path - 프로젝트 경로
|
|
152
|
-
* @param {boolean} options.detailed - 상세 분석 여부
|
|
153
|
-
* @returns {Object} 분석 결과
|
|
154
|
-
*/
|
|
155
|
-
async analyzeProject(options = {}) {
|
|
156
|
-
try {
|
|
157
|
-
const report = this.reporter.generateProjectAnalysisReport(options.path || '.');
|
|
158
|
-
|
|
159
|
-
if (!report) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
console.log('\n=== 프로젝트 토큰 분석 ===');
|
|
164
|
-
console.log(`프로젝트 경로: ${report.projectPath}`);
|
|
165
|
-
console.log(`총 토큰: ${report.analysis.totalTokens.toLocaleString()}`);
|
|
166
|
-
console.log(`분석 시간: ${new Date(report.generatedAt).toLocaleString()}`);
|
|
167
|
-
|
|
168
|
-
console.log('\n--- 디렉토리별 분석 ---');
|
|
169
|
-
Object.entries(report.analysis.directoryBreakdown).forEach(([dir, data]) => {
|
|
170
|
-
console.log(`${dir}: ${data.tokens.toLocaleString()} 토큰 (${data.percentage}%)`);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
if (options.detailed) {
|
|
174
|
-
console.log('\n--- 상세 파일 분석 ---');
|
|
175
|
-
Object.entries(report.analysis.directoryBreakdown).forEach(([dir, data]) => {
|
|
176
|
-
if (data.files.length > 0) {
|
|
177
|
-
console.log(`\n${dir}:`);
|
|
178
|
-
data.files.slice(0, 5).forEach(file => {
|
|
179
|
-
console.log(` - ${file.path}: ${file.tokens.toLocaleString()} 토큰`);
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (report.analysis.compressionOpportunities.length > 0) {
|
|
186
|
-
console.log('\n--- 압축 기회 ---');
|
|
187
|
-
report.analysis.compressionOpportunities.forEach(op => {
|
|
188
|
-
console.log(`${op.priority.toUpperCase()}: ${op.description}`);
|
|
189
|
-
console.log(` 예상 절약: ${op.potentialSavings.toLocaleString()} 토큰`);
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (report.analysis.recommendations.length > 0) {
|
|
194
|
-
console.log('\n--- 권장사항 ---');
|
|
195
|
-
report.analysis.recommendations.forEach(rec => {
|
|
196
|
-
console.log(`${rec.priority.toUpperCase()}: ${rec.title}`);
|
|
197
|
-
console.log(` ${rec.description}`);
|
|
198
|
-
console.log(` 명령어: ${rec.action}`);
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
console.log('\n========================\n');
|
|
203
|
-
|
|
204
|
-
return report;
|
|
205
|
-
} catch (error) {
|
|
206
|
-
console.error('프로젝트 분석 중 오류 발생:', error);
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* 사용량 보고서를 생성합니다
|
|
213
|
-
* @param {Object} options - 옵션
|
|
214
|
-
* @param {string} options.type - 보고서 타입 (daily, weekly, monthly)
|
|
215
|
-
* @param {boolean} options.save - 파일 저장 여부
|
|
216
|
-
* @returns {Object} 보고서 데이터
|
|
217
|
-
*/
|
|
218
|
-
async generateUsageReport(options = {}) {
|
|
219
|
-
try {
|
|
220
|
-
const report = this.reporter.generateUsageReport(options.type || 'daily');
|
|
221
|
-
|
|
222
|
-
if (!report) {
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
this.reporter.printReport(report);
|
|
227
|
-
|
|
228
|
-
if (options.save) {
|
|
229
|
-
const filename = `usage_report_${options.type || 'daily'}_${Date.now()}.json`;
|
|
230
|
-
this.reporter.saveReportToFile(report, filename);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
return report;
|
|
234
|
-
} catch (error) {
|
|
235
|
-
console.error('사용량 보고서 생성 중 오류 발생:', error);
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* 모니터링을 설정합니다
|
|
242
|
-
* @param {Object} options - 옵션
|
|
243
|
-
* @param {boolean} options.enable - 모니터링 활성화 여부
|
|
244
|
-
* @param {Object} options.thresholds - 임계값 설정
|
|
245
|
-
* @param {boolean} options.start - 실시간 모니터링 시작 여부
|
|
246
|
-
* @returns {Object} 설정 결과
|
|
247
|
-
*/
|
|
248
|
-
async setupMonitoring(options = {}) {
|
|
249
|
-
try {
|
|
250
|
-
if (options.enable !== undefined) {
|
|
251
|
-
this.monitor.setEnabled(options.enable);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
if (options.thresholds) {
|
|
255
|
-
this.monitor.setThresholds(options.thresholds);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
if (options.start) {
|
|
259
|
-
this.monitor.startMonitoring();
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return {
|
|
263
|
-
success: true,
|
|
264
|
-
status: this.monitor.getStatus()
|
|
265
|
-
};
|
|
266
|
-
} catch (error) {
|
|
267
|
-
console.error('모니터링 설정 중 오류 발생:', error);
|
|
268
|
-
return { success: false, error: error.message };
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* 모니터링 상태를 조회합니다
|
|
274
|
-
* @returns {Object} 모니터링 상태
|
|
275
|
-
*/
|
|
276
|
-
async getMonitoringStatus() {
|
|
277
|
-
try {
|
|
278
|
-
this.monitor.displayDashboard();
|
|
279
|
-
return this.monitor.getStatus();
|
|
280
|
-
} catch (error) {
|
|
281
|
-
console.error('모니터링 상태 조회 중 오류 발생:', error);
|
|
282
|
-
return null;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* 알림을 관리합니다
|
|
288
|
-
* @param {Object} options - 옵션
|
|
289
|
-
* @param {string} options.action - 액션 (list, acknowledge, clear)
|
|
290
|
-
* @param {string} options.alertId - 알림 ID (acknowledge 시 필요)
|
|
291
|
-
* @returns {Object} 알림 관리 결과
|
|
292
|
-
*/
|
|
293
|
-
async manageAlerts(options = {}) {
|
|
294
|
-
try {
|
|
295
|
-
switch (options.action) {
|
|
296
|
-
case 'list':
|
|
297
|
-
const unacknowledged = this.monitor.getUnacknowledgedAlerts();
|
|
298
|
-
console.log(`미확인 알림: ${unacknowledged.length}개`);
|
|
299
|
-
unacknowledged.forEach(alert => {
|
|
300
|
-
const emoji = alert.level === 'critical' ? '🚨' :
|
|
301
|
-
alert.level === 'warning' ? '⚠️' : 'ℹ️';
|
|
302
|
-
console.log(`${emoji} [${alert.id}] ${alert.message}`);
|
|
303
|
-
});
|
|
304
|
-
return unacknowledged;
|
|
305
|
-
|
|
306
|
-
case 'acknowledge':
|
|
307
|
-
if (options.alertId) {
|
|
308
|
-
this.monitor.acknowledgeAlert(options.alertId);
|
|
309
|
-
} else {
|
|
310
|
-
this.monitor.acknowledgeAllAlerts();
|
|
311
|
-
}
|
|
312
|
-
return { success: true };
|
|
313
|
-
|
|
314
|
-
case 'clear':
|
|
315
|
-
this.monitor.cleanupOldAlerts();
|
|
316
|
-
return { success: true };
|
|
317
|
-
|
|
318
|
-
default:
|
|
319
|
-
throw new Error('올바른 액션을 지정해주세요: list, acknowledge, clear');
|
|
320
|
-
}
|
|
321
|
-
} catch (error) {
|
|
322
|
-
console.error('알림 관리 중 오류 발생:', error);
|
|
323
|
-
return { success: false, error: error.message };
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/**
|
|
328
|
-
* 압축 전후 토큰 수를 기록합니다
|
|
329
|
-
* @param {Object} options - 옵션
|
|
330
|
-
* @param {number} options.originalTokens - 원본 토큰 수
|
|
331
|
-
* @param {number} options.compressedTokens - 압축 토큰 수
|
|
332
|
-
* @returns {Object} 압축 추적 결과
|
|
333
|
-
*/
|
|
334
|
-
async trackCompression(options = {}) {
|
|
335
|
-
try {
|
|
336
|
-
if (!options.originalTokens || !options.compressedTokens) {
|
|
337
|
-
throw new Error('원본 토큰 수와 압축 토큰 수를 모두 지정해야 합니다.');
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
this.tracker.trackCompression(options.originalTokens, options.compressedTokens);
|
|
341
|
-
|
|
342
|
-
const saved = options.originalTokens - options.compressedTokens;
|
|
343
|
-
const ratio = ((saved / options.originalTokens) * 100).toFixed(2);
|
|
344
|
-
|
|
345
|
-
console.log(`압축 완료: ${saved.toLocaleString()} 토큰 절약 (${ratio}%)`);
|
|
346
|
-
|
|
347
|
-
return {
|
|
348
|
-
originalTokens: options.originalTokens,
|
|
349
|
-
compressedTokens: options.compressedTokens,
|
|
350
|
-
savedTokens: saved,
|
|
351
|
-
compressionRatio: ratio
|
|
352
|
-
};
|
|
353
|
-
} catch (error) {
|
|
354
|
-
console.error('압축 추적 중 오류 발생:', error);
|
|
355
|
-
return null;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* 세션 데이터를 정리합니다
|
|
361
|
-
* @param {Object} options - 옵션
|
|
362
|
-
* @param {number} options.daysToKeep - 보관할 일수
|
|
363
|
-
* @returns {Object} 정리 결과
|
|
364
|
-
*/
|
|
365
|
-
async cleanupSessions(options = {}) {
|
|
366
|
-
try {
|
|
367
|
-
const daysToKeep = options.daysToKeep || 7;
|
|
368
|
-
this.tracker.cleanupOldSessions(daysToKeep);
|
|
369
|
-
|
|
370
|
-
return { success: true, daysToKeep };
|
|
371
|
-
} catch (error) {
|
|
372
|
-
console.error('세션 정리 중 오류 발생:', error);
|
|
373
|
-
return { success: false, error: error.message };
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* 토큰 추적 시스템을 초기화합니다
|
|
379
|
-
* @returns {Object} 초기화 결과
|
|
380
|
-
*/
|
|
381
|
-
async resetSystem() {
|
|
382
|
-
try {
|
|
383
|
-
this.storage.resetData();
|
|
384
|
-
this.monitor.cleanupOldAlerts();
|
|
385
|
-
|
|
386
|
-
console.log('토큰 추적 시스템이 초기화되었습니다.');
|
|
387
|
-
|
|
388
|
-
return { success: true };
|
|
389
|
-
} catch (error) {
|
|
390
|
-
console.error('시스템 초기화 중 오류 발생:', error);
|
|
391
|
-
return { success: false, error: error.message };
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* 토큰 추적 시스템의 상태를 조회합니다
|
|
397
|
-
* @returns {Object} 시스템 상태
|
|
398
|
-
*/
|
|
399
|
-
async getSystemStatus() {
|
|
400
|
-
try {
|
|
401
|
-
const sessionStats = this.tracker.getSessionStats();
|
|
402
|
-
const monitoringStatus = this.monitor.getStatus();
|
|
403
|
-
const alertStats = this.monitor.getAlertStats();
|
|
404
|
-
|
|
405
|
-
return {
|
|
406
|
-
session: sessionStats,
|
|
407
|
-
monitoring: monitoringStatus,
|
|
408
|
-
alerts: alertStats,
|
|
409
|
-
timestamp: Date.now()
|
|
410
|
-
};
|
|
411
|
-
} catch (error) {
|
|
412
|
-
console.error('시스템 상태 조회 중 오류 발생:', error);
|
|
413
|
-
return null;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* 리소스를 정리합니다
|
|
419
|
-
*/
|
|
420
|
-
cleanup() {
|
|
421
|
-
if (this.counter) {
|
|
422
|
-
this.counter.cleanup();
|
|
423
|
-
}
|
|
424
|
-
if (this.tracker) {
|
|
425
|
-
this.tracker.cleanup();
|
|
426
|
-
}
|
|
427
|
-
if (this.reporter) {
|
|
428
|
-
this.reporter.cleanup();
|
|
429
|
-
}
|
|
430
|
-
if (this.monitor) {
|
|
431
|
-
this.monitor.stopMonitoring();
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* 토큰 추적 명령어 팩토리
|
|
438
|
-
*/
|
|
439
|
-
export function createTokenTrackingCommands() {
|
|
440
|
-
return new TokenTrackingCommands();
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
export default TokenTrackingCommands;
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git 커밋 메시지에서 Feature ID를 파싱하기 위한 패턴 정의
|
|
3
|
-
*
|
|
4
|
-
* 지원하는 형식:
|
|
5
|
-
* - FL### - 직접 참조
|
|
6
|
-
* - [FL###] - 대괄호 참조
|
|
7
|
-
* - (FL###) - 괄호 참조
|
|
8
|
-
* - feat(FL###): - Conventional Commit 형식
|
|
9
|
-
* - fix(FL###): - 버그 수정 형식
|
|
10
|
-
* - #FL### - 해시 참조
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const FEATURE_ID_PATTERNS = {
|
|
14
|
-
// 기본 Feature ID 패턴 (FL + 3자리 숫자)
|
|
15
|
-
DIRECT: /\bFL\d{3}\b/g,
|
|
16
|
-
|
|
17
|
-
// 대괄호 안의 Feature ID
|
|
18
|
-
BRACKETED: /\[FL\d{3}\]/g,
|
|
19
|
-
|
|
20
|
-
// 괄호 안의 Feature ID
|
|
21
|
-
PARENTHETICAL: /\(FL\d{3}\)/g,
|
|
22
|
-
|
|
23
|
-
// Conventional Commit 형식
|
|
24
|
-
CONVENTIONAL: /(?:feat|fix|docs|style|refactor|perf|test|chore)\(FL\d{3}\):/g,
|
|
25
|
-
|
|
26
|
-
// 해시 참조 형식
|
|
27
|
-
HASH: /#FL\d{3}\b/g,
|
|
28
|
-
|
|
29
|
-
// 모든 패턴을 통합한 마스터 패턴
|
|
30
|
-
MASTER: /(?:\b|#|\[|\()FL\d{3}(?:\]|\)|\b)|(?:feat|fix|docs|style|refactor|perf|test|chore)\(FL\d{3}\):/g
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 커밋 타입 정의
|
|
35
|
-
*/
|
|
36
|
-
const COMMIT_TYPES = {
|
|
37
|
-
feat: '새로운 기능',
|
|
38
|
-
fix: '버그 수정',
|
|
39
|
-
docs: '문서 변경',
|
|
40
|
-
style: '코드 스타일 변경',
|
|
41
|
-
refactor: '리팩토링',
|
|
42
|
-
perf: '성능 개선',
|
|
43
|
-
test: '테스트 추가/수정',
|
|
44
|
-
chore: '빌드 프로세스 또는 도구 변경'
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* 커밋 메시지에서 Feature ID 추출
|
|
49
|
-
* @param {string} message - 커밋 메시지
|
|
50
|
-
* @returns {Array<string>} - 추출된 Feature ID 배열 (중복 제거)
|
|
51
|
-
*/
|
|
52
|
-
function extractFeatureIds(message) {
|
|
53
|
-
const matches = message.match(FEATURE_ID_PATTERNS.MASTER) || [];
|
|
54
|
-
|
|
55
|
-
// Feature ID만 추출하고 중복 제거
|
|
56
|
-
const featureIds = matches.map(match => {
|
|
57
|
-
// 패턴에서 FL### 부분만 추출
|
|
58
|
-
const idMatch = match.match(/FL\d{3}/);
|
|
59
|
-
return idMatch ? idMatch[0] : null;
|
|
60
|
-
}).filter(Boolean);
|
|
61
|
-
|
|
62
|
-
// 중복 제거
|
|
63
|
-
return [...new Set(featureIds)];
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* 커밋 메시지에서 커밋 타입 추출
|
|
68
|
-
* @param {string} message - 커밋 메시지
|
|
69
|
-
* @returns {string|null} - 커밋 타입 또는 null
|
|
70
|
-
*/
|
|
71
|
-
function extractCommitType(message) {
|
|
72
|
-
const conventionalMatch = message.match(/^(feat|fix|docs|style|refactor|perf|test|chore)(?:\(.*?\))?:/);
|
|
73
|
-
return conventionalMatch ? conventionalMatch[1] : null;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* 커밋 메시지가 Feature 관련인지 확인
|
|
78
|
-
* @param {string} message - 커밋 메시지
|
|
79
|
-
* @returns {boolean}
|
|
80
|
-
*/
|
|
81
|
-
function isFeatureRelatedCommit(message) {
|
|
82
|
-
return FEATURE_ID_PATTERNS.MASTER.test(message);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* 브랜치 이름에서 Feature ID 추출
|
|
87
|
-
* @param {string} branchName - 브랜치 이름
|
|
88
|
-
* @returns {string|null} - Feature ID 또는 null
|
|
89
|
-
*/
|
|
90
|
-
function extractFeatureIdFromBranch(branchName) {
|
|
91
|
-
// feature/FL###-description 형식 지원
|
|
92
|
-
const match = branchName.match(/feature\/FL(\d{3})/);
|
|
93
|
-
return match ? `FL${match[1]}` : null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
module.exports = {
|
|
97
|
-
FEATURE_ID_PATTERNS,
|
|
98
|
-
COMMIT_TYPES,
|
|
99
|
-
extractFeatureIds,
|
|
100
|
-
extractCommitType,
|
|
101
|
-
isFeatureRelatedCommit,
|
|
102
|
-
extractFeatureIdFromBranch
|
|
103
|
-
};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# AI 페르소나 인덱스
|
|
2
|
-
|
|
3
|
-
이 디렉토리는 AIWF의 AI 페르소나 시스템을 위한 컨텍스트 규칙과 지식 베이스를 포함합니다.
|
|
4
|
-
|
|
5
|
-
## 사용 가능한 페르소나
|
|
6
|
-
|
|
7
|
-
### 1. Architect (아키텍처 전문가)
|
|
8
|
-
- **활성화**: `/project:aiwf:architect`
|
|
9
|
-
- **전문 분야**: 시스템 설계, 확장성, 기술 스택 선정
|
|
10
|
-
- **디렉토리**: `architect/`
|
|
11
|
-
|
|
12
|
-
### 2. Security (보안 전문가)
|
|
13
|
-
- **활성화**: `/project:aiwf:security`
|
|
14
|
-
- **전문 분야**: 보안 취약점 분석, 인증/인가, 암호화
|
|
15
|
-
- **디렉토리**: `security/`
|
|
16
|
-
|
|
17
|
-
### 3. Frontend (프론트엔드 전문가)
|
|
18
|
-
- **활성화**: `/project:aiwf:frontend`
|
|
19
|
-
- **전문 분야**: UI/UX, 반응형 디자인, 프론트엔드 프레임워크
|
|
20
|
-
- **디렉토리**: `frontend/`
|
|
21
|
-
|
|
22
|
-
### 4. Backend (백엔드 전문가)
|
|
23
|
-
- **활성화**: `/project:aiwf:backend`
|
|
24
|
-
- **전문 분야**: API 설계, 데이터베이스, 서버 아키텍처
|
|
25
|
-
- **디렉토리**: `backend/`
|
|
26
|
-
|
|
27
|
-
### 5. Data Analyst (데이터 분석가)
|
|
28
|
-
- **활성화**: `/project:aiwf:data_analyst`
|
|
29
|
-
- **전문 분야**: 데이터 분석, 머신러닝, 통계 분석
|
|
30
|
-
- **디렉토리**: `data_analyst/`
|
|
31
|
-
|
|
32
|
-
## 각 페르소나 디렉토리 구조
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
[persona_name]/
|
|
36
|
-
├── context_rules.md # 페르소나별 컨텍스트 규칙
|
|
37
|
-
├── best_practices.md # 전문 분야 베스트 프랙티스
|
|
38
|
-
└── knowledge_base.md # 도메인 특화 지식 베이스
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## 관리 명령어
|
|
42
|
-
|
|
43
|
-
- **상태 확인**: `/project:aiwf:persona_status`
|
|
44
|
-
- **기본 모드 복원**: `/project:aiwf:default_mode`
|
|
45
|
-
|
|
46
|
-
## 사용 방법
|
|
47
|
-
|
|
48
|
-
1. 원하는 페르소나 활성화: `/project:aiwf:[persona_name]`
|
|
49
|
-
2. 전문적인 도움 받기: 해당 분야의 질문이나 작업 요청
|
|
50
|
-
3. 다른 페르소나로 전환 또는 기본 모드로 복원
|
|
51
|
-
|
|
52
|
-
## 페르소나 시스템 특징
|
|
53
|
-
|
|
54
|
-
- **즉시 전환**: 2초 이내 페르소나 전환
|
|
55
|
-
- **컨텍스트 유지**: 페르소나별 전문 지식 자동 로드
|
|
56
|
-
- **통계 추적**: 사용 패턴 및 효율성 분석
|
|
57
|
-
- **다국어 지원**: 한국어/영어 완벽 지원
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "analyst",
|
|
3
|
-
"name": "System Analyst",
|
|
4
|
-
"description": "Analyzes requirements, creates specifications, and ensures alignment with business goals",
|
|
5
|
-
"focus_areas": [
|
|
6
|
-
"Requirements gathering and analysis",
|
|
7
|
-
"System design and architecture",
|
|
8
|
-
"Business process optimization",
|
|
9
|
-
"Stakeholder communication",
|
|
10
|
-
"Technical documentation"
|
|
11
|
-
],
|
|
12
|
-
"communication_style": {
|
|
13
|
-
"tone": "professional, clear, analytical",
|
|
14
|
-
"language": "balanced technical and business terminology",
|
|
15
|
-
"format": "structured with clear sections and bullet points"
|
|
16
|
-
},
|
|
17
|
-
"capabilities": [
|
|
18
|
-
"Create detailed requirement specifications",
|
|
19
|
-
"Analyze system dependencies and impacts",
|
|
20
|
-
"Design data models and workflows",
|
|
21
|
-
"Identify edge cases and potential issues",
|
|
22
|
-
"Produce comprehensive documentation"
|
|
23
|
-
],
|
|
24
|
-
"tools_and_methods": [
|
|
25
|
-
"UML diagrams",
|
|
26
|
-
"BPMN for process modeling",
|
|
27
|
-
"User story mapping",
|
|
28
|
-
"Impact analysis",
|
|
29
|
-
"Risk assessment matrices"
|
|
30
|
-
],
|
|
31
|
-
"output_formats": [
|
|
32
|
-
"Requirement documents",
|
|
33
|
-
"System specifications",
|
|
34
|
-
"Process flow diagrams",
|
|
35
|
-
"Data models",
|
|
36
|
-
"Analysis reports"
|
|
37
|
-
],
|
|
38
|
-
"example_prompts": [
|
|
39
|
-
"Analyze the requirements for feature FL-XXX",
|
|
40
|
-
"Create a system specification for the payment module",
|
|
41
|
-
"Identify potential risks in the current architecture",
|
|
42
|
-
"Map the user journey for the authentication flow"
|
|
43
|
-
]
|
|
44
|
-
}
|