aiwf 0.3.4 → 0.3.5
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/.aiwf/metrics/metrics.json +18 -0
- package/.aiwf/personas/current.json +5 -0
- package/.claude/commands/aiwf/aiwf_persona_architect.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_backend.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_data_analyst.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_frontend.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_security.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_status.md +1 -1
- package/CHANGELOG.md +54 -5
- package/claude-code/aiwf/ko/commands/ai-persona.js +1 -1
- package/package.json +1 -1
- package/src/cli/index.js +41 -0
- package/src/commands/persona.js +288 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sessions": [],
|
|
3
|
+
"personaPerformance": {},
|
|
4
|
+
"taskOutcomes": [],
|
|
5
|
+
"aggregated": {
|
|
6
|
+
"eventCounts": {
|
|
7
|
+
"persona_switch": 1
|
|
8
|
+
},
|
|
9
|
+
"personaSwitches": [
|
|
10
|
+
{
|
|
11
|
+
"from": "developer",
|
|
12
|
+
"to": "architect",
|
|
13
|
+
"trigger": "auto",
|
|
14
|
+
"timestamp": 1752885541651
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.5] - 2025-07-19
|
|
11
|
+
|
|
12
|
+
### ✨ Features
|
|
13
|
+
- **Persona Management**: Implement unified persona management system (`b913da0`)
|
|
14
|
+
- **Runtime State**: Add runtime persona state and metrics tracking (`6e5ca2c`)
|
|
15
|
+
- **Templates**: Add AIWF test instance and project templates (`3034bce`)
|
|
16
|
+
- **Korean Support**: AIWF 한글 템플릿 추가 문서 및 파일 보완 (`5a24037`)
|
|
17
|
+
- **Template Structure**: AIWF 한글 템플릿 구조 완성 (`f12fb76`)
|
|
18
|
+
- **Template Manager**: 템플릿 관리자 구현 및 작업 템플릿 개선 (`feec001`)
|
|
19
|
+
- **Context Compression**: Implement persona-aware context compression (`646fd4c`)
|
|
20
|
+
- **Quality Evaluation**: Add persona quality evaluation system (`4b60a79`)
|
|
21
|
+
- **Claude Commands**: Add Claude Code commands for 5 AI personas (`3ccdb7b`)
|
|
22
|
+
- **Feature Ledger**: Implement Feature Ledger CLI with full CRUD operations (`97c15b3`)
|
|
23
|
+
|
|
24
|
+
### 📝 Documentation
|
|
25
|
+
- **Persona Docs**: Standardize persona command documentation (`a5a1a98`)
|
|
26
|
+
- **README**: Update README with new persona features (`5dbafc6`)
|
|
27
|
+
|
|
28
|
+
### ♻️ Refactoring
|
|
29
|
+
- **Project Structure**: 완전한 src 폴더 구조 통합 및 정리 (`92fc7f0`)
|
|
30
|
+
- **Evaluation System**: Replace complex evaluation with lightweight background monitoring (`b39da95`)
|
|
31
|
+
|
|
32
|
+
### 🔧 Build/Config
|
|
33
|
+
- **Dependencies**: Bump version to 0.3.4 and clean up dependencies (`66166cb`)
|
|
34
|
+
- **Gitignore**: Add .aiwf/backup_*/ pattern to .gitignore (`2952457`)
|
|
35
|
+
- **Development Rules**: Update .gitignore and add framework development rules to CLAUDE.md (`e58a4eb`)
|
|
36
|
+
|
|
37
|
+
### 🔄 Other Changes
|
|
38
|
+
- 버전 0.3.3으로 업데이트 및 불필요한 압축 관련 문서 삭제 (`9c7c67e`)
|
|
39
|
+
- 설치 완료 플래그 파일 생성 및 기존 설치 확인 로직 수정 (`e956b59`)
|
|
40
|
+
- 버전 업데이트 및 불필요한 CLI 명령어 제거 (`659e6b5`)
|
|
41
|
+
|
|
42
|
+
## [0.3.4] - 2025-07-19
|
|
43
|
+
|
|
44
|
+
### 🔧 Build/Config
|
|
45
|
+
- Clean up dependencies and update package configuration
|
|
46
|
+
|
|
47
|
+
## [0.3.3] - 2025-07-14
|
|
48
|
+
|
|
49
|
+
### 🔄 Other Changes
|
|
50
|
+
- Remove unnecessary compression-related documentation
|
|
51
|
+
- Create installation completion flag file
|
|
52
|
+
- Fix existing installation check logic
|
|
53
|
+
- Remove unnecessary CLI commands
|
|
54
|
+
|
|
10
55
|
### Added
|
|
11
56
|
- 📚 **Comprehensive Documentation Suite**
|
|
12
57
|
- API Reference guide with complete module documentation
|
|
@@ -124,8 +169,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
124
169
|
- GitHub repository download functionality
|
|
125
170
|
- Simple installation script
|
|
126
171
|
|
|
127
|
-
[Unreleased]: https://github.com/
|
|
128
|
-
[
|
|
129
|
-
[0.3.
|
|
130
|
-
[0.
|
|
131
|
-
[0.1
|
|
172
|
+
[Unreleased]: https://github.com/moonklabs/aiwf/compare/v0.3.5...HEAD
|
|
173
|
+
[0.3.5]: https://github.com/moonklabs/aiwf/compare/v0.3.4...v0.3.5
|
|
174
|
+
[0.3.4]: https://github.com/moonklabs/aiwf/compare/v0.3.3...v0.3.4
|
|
175
|
+
[0.3.3]: https://github.com/moonklabs/aiwf/compare/v0.3.1...v0.3.3
|
|
176
|
+
[0.3.1]: https://github.com/moonklabs/aiwf/compare/v1.0.0...v0.3.1
|
|
177
|
+
[1.0.0]: https://github.com/moonklabs/aiwf/compare/v0.3.0...v1.0.0
|
|
178
|
+
[0.3.0]: https://github.com/moonklabs/aiwf/compare/v0.2.0...v0.3.0
|
|
179
|
+
[0.2.0]: https://github.com/moonklabs/aiwf/compare/v0.1.0...v0.2.0
|
|
180
|
+
[0.1.0]: https://github.com/moonklabs/aiwf/releases/tag/v0.1.0
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 다양한 개발 작업을 위한 AI 행동 페르소나 관리
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { AIPersonaManager } from '../../../../lib/ai-persona-manager.js';
|
|
8
|
+
import { AIPersonaManager } from '../../../../src/lib/ai-persona-manager.js';
|
|
9
9
|
import { getBackgroundMonitor } from '../utils/background-monitor.js';
|
|
10
10
|
import path from 'path';
|
|
11
11
|
import chalk from 'chalk';
|
package/package.json
CHANGED
package/src/cli/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { program } from 'commander';
|
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { installAIWF } from '../lib/installer.js';
|
|
6
6
|
import AIToolCommand from '../commands/ai-tool.js';
|
|
7
|
+
import PersonaCommand from '../commands/persona.js';
|
|
7
8
|
import { CacheCLI } from './cache-cli.js';
|
|
8
9
|
|
|
9
10
|
// Parse version from package.json
|
|
@@ -161,5 +162,45 @@ lang
|
|
|
161
162
|
await resetLanguage();
|
|
162
163
|
});
|
|
163
164
|
|
|
165
|
+
// Persona management commands
|
|
166
|
+
const persona = program.command('persona');
|
|
167
|
+
persona.description('Manage AI personas / AI 페르소나 관리');
|
|
168
|
+
|
|
169
|
+
persona
|
|
170
|
+
.command('status')
|
|
171
|
+
.alias('s')
|
|
172
|
+
.description('Show current persona status / 현재 페르소나 상태 표시')
|
|
173
|
+
.action(async () => {
|
|
174
|
+
const personaCmd = new PersonaCommand();
|
|
175
|
+
await personaCmd.showStatus();
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
persona
|
|
179
|
+
.command('list')
|
|
180
|
+
.alias('ls')
|
|
181
|
+
.description('List available personas / 사용 가능한 페르소나 목록')
|
|
182
|
+
.action(async () => {
|
|
183
|
+
const personaCmd = new PersonaCommand();
|
|
184
|
+
await personaCmd.listPersonas();
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
persona
|
|
188
|
+
.command('set <persona-name>')
|
|
189
|
+
.alias('switch')
|
|
190
|
+
.description('Switch to specific persona / 특정 페르소나로 전환')
|
|
191
|
+
.action(async (personaName) => {
|
|
192
|
+
const personaCmd = new PersonaCommand();
|
|
193
|
+
await personaCmd.setPersona(personaName);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
persona
|
|
197
|
+
.command('reset')
|
|
198
|
+
.alias('r')
|
|
199
|
+
.description('Reset to default persona / 기본 페르소나로 리셋')
|
|
200
|
+
.action(async () => {
|
|
201
|
+
const personaCmd = new PersonaCommand();
|
|
202
|
+
await personaCmd.resetPersona();
|
|
203
|
+
});
|
|
204
|
+
|
|
164
205
|
// Parse command line arguments
|
|
165
206
|
program.parse(process.argv);
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AI 페르소나 명령어
|
|
5
|
+
* AI 행동 페르소나 관리 및 전환
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { AIPersonaManager } from '../lib/ai-persona-manager.js';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
import { dirname } from 'path';
|
|
13
|
+
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
|
|
17
|
+
class PersonaCommand {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.personaManager = null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 페르소나 매니저 초기화
|
|
24
|
+
*/
|
|
25
|
+
async initPersonaManager() {
|
|
26
|
+
if (!this.personaManager) {
|
|
27
|
+
this.personaManager = new AIPersonaManager({
|
|
28
|
+
personaConfigPath: path.join(process.cwd(), '.aiwf', 'personas'),
|
|
29
|
+
metricsPath: path.join(process.cwd(), '.aiwf', 'metrics'),
|
|
30
|
+
metricsEnabled: true,
|
|
31
|
+
autoDetectionEnabled: true
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
await this.personaManager.init();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return this.personaManager;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 페르소나 상태 표시
|
|
42
|
+
*/
|
|
43
|
+
async showStatus() {
|
|
44
|
+
try {
|
|
45
|
+
// 파일에서 현재 페르소나 읽기
|
|
46
|
+
const fs = await import('fs/promises');
|
|
47
|
+
const path = await import('path');
|
|
48
|
+
const personaFile = path.join(process.cwd(), '.aiwf', 'personas', 'current.json');
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
const content = await fs.readFile(personaFile, 'utf-8');
|
|
52
|
+
const currentPersona = JSON.parse(content);
|
|
53
|
+
|
|
54
|
+
console.log(chalk.cyan('🎭 현재 AI 페르소나 상태'));
|
|
55
|
+
console.log(chalk.gray('-'.repeat(50)));
|
|
56
|
+
console.log(`현재 페르소나: ${chalk.yellow(currentPersona.name)}`);
|
|
57
|
+
console.log(`설명: ${currentPersona.description}`);
|
|
58
|
+
console.log(`활성화 시간: ${new Date(currentPersona.activatedAt).toLocaleString('ko-KR')}`);
|
|
59
|
+
|
|
60
|
+
const behaviors = this.getKoreanBehaviors(currentPersona.name);
|
|
61
|
+
if (behaviors.length > 0) {
|
|
62
|
+
console.log('\n주요 동작:');
|
|
63
|
+
behaviors.forEach(behavior => {
|
|
64
|
+
console.log(` • ${behavior}`);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
console.log(chalk.gray('\n' + '-'.repeat(50)));
|
|
69
|
+
console.log(chalk.green('✅ 페르소나가 활성화되어 있습니다.'));
|
|
70
|
+
|
|
71
|
+
} catch (fileError) {
|
|
72
|
+
console.log(chalk.yellow('⚠️ 현재 활성화된 페르소나가 없습니다.'));
|
|
73
|
+
console.log(chalk.gray('사용 가능한 페르소나 목록을 보려면: aiwf persona list'));
|
|
74
|
+
console.log(chalk.gray('페르소나를 설정하려면: aiwf persona set <페르소나명>'));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error(chalk.red('❌ 페르소나 상태 확인 중 오류가 발생했습니다:'), error.message);
|
|
79
|
+
console.error(error.stack);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 페르소나 목록 표시
|
|
85
|
+
*/
|
|
86
|
+
async listPersonas() {
|
|
87
|
+
try {
|
|
88
|
+
console.log(chalk.cyan('🎭 사용 가능한 AI 페르소나'));
|
|
89
|
+
console.log(chalk.gray('-'.repeat(50)));
|
|
90
|
+
|
|
91
|
+
// 기본 페르소나 목록을 하드코딩으로 표시 (초기화 문제 회피)
|
|
92
|
+
const defaultPersonas = [
|
|
93
|
+
{ name: 'architect', description: '시스템 설계 및 아키텍처 전문가' },
|
|
94
|
+
{ name: 'developer', description: '일반 개발자 (기본값)' },
|
|
95
|
+
{ name: 'reviewer', description: '코드 리뷰 및 품질 관리 전문가' },
|
|
96
|
+
{ name: 'debugger', description: '디버깅 및 문제 해결 전문가' },
|
|
97
|
+
{ name: 'optimizer', description: '성능 최적화 전문가' },
|
|
98
|
+
{ name: 'security', description: '보안 및 취약점 분석 전문가' },
|
|
99
|
+
{ name: 'documenter', description: '문서화 및 기술 작성 전문가' }
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
defaultPersonas.forEach(persona => {
|
|
103
|
+
const displayName = chalk.yellow(persona.name);
|
|
104
|
+
console.log(` ${displayName} - ${persona.description}`);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
console.log(chalk.gray('\n' + '-'.repeat(50)));
|
|
108
|
+
console.log(chalk.gray('사용법: aiwf persona set <페르소나명>'));
|
|
109
|
+
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.error(chalk.red('❌ 페르소나 목록 조회 중 오류가 발생했습니다:'), error.message);
|
|
112
|
+
console.error(error.stack);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* 페르소나 전환
|
|
118
|
+
*/
|
|
119
|
+
async setPersona(personaName) {
|
|
120
|
+
if (!personaName) {
|
|
121
|
+
console.error(chalk.red('❌ 페르소나 이름을 지정해주세요.'));
|
|
122
|
+
console.log(chalk.gray('사용법: aiwf persona set <페르소나명>'));
|
|
123
|
+
console.log(chalk.gray('사용 가능한 페르소나: aiwf persona list'));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
// 유효한 페르소나인지 확인
|
|
129
|
+
const validPersonas = ['architect', 'developer', 'reviewer', 'debugger', 'optimizer', 'security', 'documenter'];
|
|
130
|
+
|
|
131
|
+
if (!validPersonas.includes(personaName)) {
|
|
132
|
+
console.error(chalk.red(`❌ 페르소나 '${personaName}'를 찾을 수 없습니다.`));
|
|
133
|
+
console.log(chalk.gray('사용 가능한 페르소나: aiwf persona list'));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 간단한 페르소나 설정 (파일 기반)
|
|
138
|
+
const fs = await import('fs/promises');
|
|
139
|
+
const path = await import('path');
|
|
140
|
+
const personaDir = path.join(process.cwd(), '.aiwf', 'personas');
|
|
141
|
+
|
|
142
|
+
// 디렉토리 생성
|
|
143
|
+
await fs.mkdir(personaDir, { recursive: true });
|
|
144
|
+
|
|
145
|
+
// 현재 페르소나 저장
|
|
146
|
+
const personaConfig = {
|
|
147
|
+
name: personaName,
|
|
148
|
+
description: this.getKoreanDescription(personaName),
|
|
149
|
+
activatedAt: new Date().toISOString()
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
await fs.writeFile(
|
|
153
|
+
path.join(personaDir, 'current.json'),
|
|
154
|
+
JSON.stringify(personaConfig, null, 2)
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
console.log(chalk.green('🎭 AI 페르소나 활성화 완료'));
|
|
158
|
+
console.log(chalk.gray('-'.repeat(50)));
|
|
159
|
+
console.log(`현재 페르소나: ${chalk.yellow(personaName)}`);
|
|
160
|
+
console.log(`전문 분야: ${this.getKoreanDescription(personaName)}`);
|
|
161
|
+
console.log(chalk.gray('-'.repeat(50)));
|
|
162
|
+
console.log(chalk.green('✅ 페르소나가 성공적으로 활성화되었습니다.'));
|
|
163
|
+
|
|
164
|
+
} catch (error) {
|
|
165
|
+
console.error(chalk.red('❌ 페르소나 전환 중 오류가 발생했습니다:'), error.message);
|
|
166
|
+
console.error(error.stack);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* 페르소나 리셋
|
|
172
|
+
*/
|
|
173
|
+
async resetPersona() {
|
|
174
|
+
try {
|
|
175
|
+
// 기본 페르소나(developer)로 리셋
|
|
176
|
+
await this.setPersona('developer');
|
|
177
|
+
console.log(chalk.green('🔄 페르소나가 기본값(developer)으로 리셋되었습니다.'));
|
|
178
|
+
|
|
179
|
+
} catch (error) {
|
|
180
|
+
console.error(chalk.red('❌ 페르소나 리셋 중 오류가 발생했습니다:'), error.message);
|
|
181
|
+
console.error(error.stack);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* 명령어 실행
|
|
187
|
+
*/
|
|
188
|
+
async execute(args) {
|
|
189
|
+
const [subcommand, ...restArgs] = args;
|
|
190
|
+
|
|
191
|
+
switch (subcommand) {
|
|
192
|
+
case 'status':
|
|
193
|
+
await this.showStatus();
|
|
194
|
+
break;
|
|
195
|
+
case 'list':
|
|
196
|
+
await this.listPersonas();
|
|
197
|
+
break;
|
|
198
|
+
case 'set':
|
|
199
|
+
await this.setPersona(restArgs[0]);
|
|
200
|
+
break;
|
|
201
|
+
case 'reset':
|
|
202
|
+
await this.resetPersona();
|
|
203
|
+
break;
|
|
204
|
+
default:
|
|
205
|
+
this.showHelp();
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* 도움말 표시
|
|
212
|
+
*/
|
|
213
|
+
showHelp() {
|
|
214
|
+
console.log(chalk.cyan('🎭 AIWF 페르소나 관리'));
|
|
215
|
+
console.log(chalk.gray('-'.repeat(50)));
|
|
216
|
+
console.log('사용법: aiwf persona <명령어> [옵션]');
|
|
217
|
+
console.log('');
|
|
218
|
+
console.log('명령어:');
|
|
219
|
+
console.log(' status 현재 페르소나 상태 표시');
|
|
220
|
+
console.log(' list 사용 가능한 페르소나 목록');
|
|
221
|
+
console.log(' set <페르소나명> 특정 페르소나로 전환');
|
|
222
|
+
console.log(' reset 기본 페르소나로 리셋');
|
|
223
|
+
console.log('');
|
|
224
|
+
console.log('예시:');
|
|
225
|
+
console.log(' aiwf persona status');
|
|
226
|
+
console.log(' aiwf persona list');
|
|
227
|
+
console.log(' aiwf persona set architect');
|
|
228
|
+
console.log(' aiwf persona reset');
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* 한국어 설명 가져오기
|
|
233
|
+
*/
|
|
234
|
+
getKoreanDescription(persona) {
|
|
235
|
+
const descriptions = {
|
|
236
|
+
architect: '시스템 설계 및 아키텍처 전문가',
|
|
237
|
+
developer: '일반 개발자 (기본값)',
|
|
238
|
+
reviewer: '코드 리뷰 및 품질 관리 전문가',
|
|
239
|
+
debugger: '디버깅 및 문제 해결 전문가',
|
|
240
|
+
optimizer: '성능 최적화 전문가',
|
|
241
|
+
security: '보안 및 취약점 분석 전문가',
|
|
242
|
+
devops: 'DevOps 및 인프라 관리 전문가',
|
|
243
|
+
tester: '테스트 및 QA 전문가',
|
|
244
|
+
documenter: '문서화 및 기술 작성 전문가',
|
|
245
|
+
mentor: '멘토링 및 교육 전문가'
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
return descriptions[persona] || '설명 없음';
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* 한국어 동작 설명 가져오기
|
|
253
|
+
*/
|
|
254
|
+
getKoreanBehaviors(persona) {
|
|
255
|
+
const behaviors = {
|
|
256
|
+
architect: [
|
|
257
|
+
'큰 그림과 전체 시스템 구조에 집중',
|
|
258
|
+
'확장성과 유지보수성 우선시',
|
|
259
|
+
'디자인 패턴과 아키텍처 원칙 적용',
|
|
260
|
+
'통합 지점과 인터페이스 고려'
|
|
261
|
+
],
|
|
262
|
+
developer: [
|
|
263
|
+
'실용적이고 효율적인 코드 작성',
|
|
264
|
+
'베스트 프랙티스 적용',
|
|
265
|
+
'가독성과 유지보수성 중시'
|
|
266
|
+
],
|
|
267
|
+
reviewer: [
|
|
268
|
+
'코드 품질과 표준 준수 확인',
|
|
269
|
+
'잠재적 버그와 개선점 식별',
|
|
270
|
+
'성능과 보안 측면 검토'
|
|
271
|
+
],
|
|
272
|
+
debugger: [
|
|
273
|
+
'문제의 근본 원인 분석',
|
|
274
|
+
'체계적인 디버깅 접근',
|
|
275
|
+
'재현 가능한 테스트 케이스 생성'
|
|
276
|
+
],
|
|
277
|
+
optimizer: [
|
|
278
|
+
'성능 병목 지점 식별',
|
|
279
|
+
'메모리 사용량 최적화',
|
|
280
|
+
'알고리즘 효율성 개선'
|
|
281
|
+
]
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
return behaviors[persona] || ['기본 동작'];
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export default PersonaCommand;
|