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.
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "developer",
3
+ "description": "일반 개발자 (기본값)",
4
+ "activatedAt": "2025-07-19T01:15:42.150Z"
5
+ }
@@ -3,7 +3,7 @@
3
3
  AI를 시스템 아키텍처 전문가 모드로 전환합니다.
4
4
 
5
5
  ```bash
6
- cd .aiwf && node ../claude-code/aiwf/ko/commands/ai-persona.js architect
6
+ aiwf persona set architect
7
7
  ```
8
8
 
9
9
  ## 페르소나 컨텍스트 적용
@@ -3,7 +3,7 @@
3
3
  AI를 백엔드 개발 전문가 모드로 전환합니다.
4
4
 
5
5
  ```bash
6
- cd .aiwf && node ../claude-code/aiwf/ko/commands/ai-persona.js backend
6
+ aiwf persona set developer
7
7
  ```
8
8
 
9
9
  ## 페르소나 컨텍스트 적용
@@ -3,7 +3,7 @@
3
3
  AI를 데이터 분석 전문가 모드로 전환합니다.
4
4
 
5
5
  ```bash
6
- cd .aiwf && node ../claude-code/aiwf/ko/commands/ai-persona.js data_analyst
6
+ aiwf persona set developer
7
7
  ```
8
8
 
9
9
  ## 페르소나 컨텍스트 적용
@@ -3,7 +3,7 @@
3
3
  AI를 프론트엔드 개발 전문가 모드로 전환합니다.
4
4
 
5
5
  ```bash
6
- cd .aiwf && node ../claude-code/aiwf/ko/commands/ai-persona.js frontend
6
+ aiwf persona set developer
7
7
  ```
8
8
 
9
9
  ## 페르소나 컨텍스트 적용
@@ -3,7 +3,7 @@
3
3
  AI를 보안 전문가 모드로 전환합니다.
4
4
 
5
5
  ```bash
6
- cd .aiwf && node ../claude-code/aiwf/ko/commands/ai-persona.js security
6
+ aiwf persona set security
7
7
  ```
8
8
 
9
9
  ## 페르소나 컨텍스트 적용
@@ -3,7 +3,7 @@
3
3
  현재 활성화된 AI 페르소나의 상태를 확인합니다.
4
4
 
5
5
  ```bash
6
- cd .aiwf && node ../claude-code/aiwf/ko/commands/ai-persona.js status
6
+ aiwf persona status
7
7
  ```
8
8
 
9
9
  ## 설명
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/aiwf/aiwf/compare/v1.0.0...HEAD
128
- [1.0.0]: https://github.com/aiwf/aiwf/compare/v0.3.0...v1.0.0
129
- [0.3.0]: https://github.com/aiwf/aiwf/compare/v0.2.0...v0.3.0
130
- [0.2.0]: https://github.com/aiwf/aiwf/compare/v0.1.0...v0.2.0
131
- [0.1.0]: https://github.com/aiwf/aiwf/releases/tag/v0.1.0
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwf",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "AI Workflow Framework for Claude Code with multi-language support (Korean/English)",
5
5
  "main": "index.js",
6
6
  "type": "module",
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;