aiwf 0.3.17 → 0.3.18
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 +1 -1
- package/src/config/file-lists.js +5 -5
- package/templates/README.md +0 -78
- package/templates/api-server/config.json +0 -64
- package/templates/api-server/template/.aiwf/config.json +0 -56
- package/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
- package/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
- package/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
- package/templates/api-server/template/.env.example +0 -29
- package/templates/api-server/template/.eslintrc.json +0 -23
- package/templates/api-server/template/README.md +0 -171
- package/templates/api-server/template/jest.config.js +0 -26
- package/templates/api-server/template/nodemon.json +0 -9
- package/templates/api-server/template/package.json +0 -61
- package/templates/api-server/template/src/app.ts +0 -60
- package/templates/api-server/template/src/config/swagger.ts +0 -38
- package/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
- package/templates/api-server/template/src/controllers/authController.ts +0 -128
- package/templates/api-server/template/src/controllers/statusController.ts +0 -28
- package/templates/api-server/template/src/index.ts +0 -28
- package/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
- package/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
- package/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
- package/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
- package/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
- package/templates/api-server/template/src/routes/aiwf.ts +0 -31
- package/templates/api-server/template/src/routes/index.ts +0 -13
- package/templates/api-server/template/src/routes/v1/index.ts +0 -67
- package/templates/api-server/template/src/utils/logger.ts +0 -37
- package/templates/api-server/template/tests/app.test.ts +0 -40
- package/templates/api-server/template/tsconfig.json +0 -43
- package/templates/npm-library/config.json +0 -61
- package/templates/npm-library/template/LICENSE +0 -21
- package/templates/npm-library/template/README.md +0 -201
- package/templates/npm-library/template/package.json +0 -78
- package/templates/web-app/config.json +0 -53
- package/templates/web-app/template/.aiwf/config.json +0 -54
- package/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
- package/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
- package/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
- package/templates/web-app/template/.eslintrc.cjs +0 -20
- package/templates/web-app/template/README.md +0 -151
- package/templates/web-app/template/index.html +0 -14
- package/templates/web-app/template/package.json +0 -44
- package/templates/web-app/template/postcss.config.js +0 -6
- package/templates/web-app/template/public/vite.svg +0 -1
- package/templates/web-app/template/src/App.tsx +0 -21
- package/templates/web-app/template/src/components/Layout.tsx +0 -57
- package/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
- package/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
- package/templates/web-app/template/src/index.css +0 -60
- package/templates/web-app/template/src/main.tsx +0 -10
- package/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
- package/templates/web-app/template/src/pages/HomePage.tsx +0 -89
- package/templates/web-app/template/src/pages/NotFound.tsx +0 -25
- package/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
- package/templates/web-app/template/src/types/global.d.ts +0 -9
- package/templates/web-app/template/src/vite-env.d.ts +0 -1
- package/templates/web-app/template/tailwind.config.js +0 -30
- package/templates/web-app/template/tsconfig.json +0 -37
- package/templates/web-app/template/tsconfig.node.json +0 -10
- package/templates/web-app/template/vite.config.ts +0 -23
- /package/rules/global/{code-style-guide.md → aiwf-code-style-guide.md} +0 -0
- /package/rules/global/{coding-principles.md → aiwf-coding-principles.md} +0 -0
- /package/rules/global/{development-process.md → aiwf-development-process.md} +0 -0
- /package/rules/global/{global-rules.md → aiwf-global-rules.md} +0 -0
- /package/rules/manual/{generate-plan-docs.md → aiwf-generate-plan-docs.md} +0 -0
package/package.json
CHANGED
package/src/config/file-lists.js
CHANGED
|
@@ -66,15 +66,15 @@ export const COMMAND_FILES = [
|
|
|
66
66
|
|
|
67
67
|
// 글로벌 룰 파일 목록
|
|
68
68
|
export const GLOBAL_RULES_FILES = [
|
|
69
|
-
'code-style-guide.md',
|
|
70
|
-
'coding-principles.md',
|
|
71
|
-
'development-process.md',
|
|
72
|
-
'global-rules.md'
|
|
69
|
+
'aiwf-code-style-guide.md',
|
|
70
|
+
'aiwf-coding-principles.md',
|
|
71
|
+
'aiwf-development-process.md',
|
|
72
|
+
'aiwf-global-rules.md'
|
|
73
73
|
];
|
|
74
74
|
|
|
75
75
|
// 수동 룰 파일 목록
|
|
76
76
|
export const MANUAL_RULES_FILES = [
|
|
77
|
-
'generate-plan-docs.md'
|
|
77
|
+
'aiwf-generate-plan-docs.md'
|
|
78
78
|
];
|
|
79
79
|
|
|
80
80
|
// 템플릿 파일 목록 (향후 추가 예정)
|
package/templates/README.md
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# AIWF 프로젝트 템플릿
|
|
2
|
-
|
|
3
|
-
이 디렉토리에는 AIWF 프로젝트 템플릿이 포함되어 있습니다.
|
|
4
|
-
|
|
5
|
-
## 사용 가능한 템플릿
|
|
6
|
-
|
|
7
|
-
### 1. web-app (웹 애플리케이션)
|
|
8
|
-
- React 18 + TypeScript
|
|
9
|
-
- Vite 빌드 도구
|
|
10
|
-
- Tailwind CSS
|
|
11
|
-
- React Router
|
|
12
|
-
- Zustand 상태 관리
|
|
13
|
-
- AIWF 대시보드 통합
|
|
14
|
-
|
|
15
|
-
### 2. api-server (API 서버)
|
|
16
|
-
- Express + TypeScript
|
|
17
|
-
- JWT 인증
|
|
18
|
-
- Swagger 문서화
|
|
19
|
-
- 에러 핸들링
|
|
20
|
-
- AIWF API 엔드포인트
|
|
21
|
-
|
|
22
|
-
### 3. npm-library (NPM 라이브러리)
|
|
23
|
-
- TypeScript 기반
|
|
24
|
-
- Rollup 번들링
|
|
25
|
-
- Jest 테스트
|
|
26
|
-
- 듀얼 모듈 시스템 (ESM/CJS)
|
|
27
|
-
- 자동 버전 관리
|
|
28
|
-
|
|
29
|
-
## 템플릿 사용법
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# 대화형 모드
|
|
33
|
-
aiwf create
|
|
34
|
-
|
|
35
|
-
# 직접 지정
|
|
36
|
-
aiwf create web-app my-app
|
|
37
|
-
|
|
38
|
-
# 오프라인 모드
|
|
39
|
-
aiwf create --offline web-app my-app
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## 템플릿 구조
|
|
43
|
-
|
|
44
|
-
각 템플릿은 다음 구조를 따릅니다:
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
template-name/
|
|
48
|
-
├── config.json # 템플릿 메타데이터
|
|
49
|
-
└── template/ # 실제 프로젝트 파일
|
|
50
|
-
├── src/ # 소스 코드
|
|
51
|
-
├── .aiwf/ # AIWF 설정
|
|
52
|
-
├── package.json # 의존성
|
|
53
|
-
└── README.md # 프로젝트 문서
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## 템플릿 커스터마이징
|
|
57
|
-
|
|
58
|
-
템플릿의 플레이스홀더:
|
|
59
|
-
- `{{projectName}}` - 프로젝트 이름
|
|
60
|
-
- `{{description}}` - 프로젝트 설명
|
|
61
|
-
- `{{author}}` - 작성자
|
|
62
|
-
- `{{year}}` - 현재 연도
|
|
63
|
-
- `{{createdAt}}` - 생성 시간
|
|
64
|
-
|
|
65
|
-
## 캐시 관리
|
|
66
|
-
|
|
67
|
-
템플릿은 오프라인 사용을 위해 캐시될 수 있습니다:
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
# 캐시 생성
|
|
71
|
-
aiwf cache create
|
|
72
|
-
|
|
73
|
-
# 캐시 확인
|
|
74
|
-
aiwf cache check
|
|
75
|
-
|
|
76
|
-
# 캐시 삭제
|
|
77
|
-
aiwf cache clear
|
|
78
|
-
```
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "api-server",
|
|
3
|
-
"displayName": "API 서버 (Node.js + Express)",
|
|
4
|
-
"description": "Express와 TypeScript로 구성된 RESTful API 서버 템플릿",
|
|
5
|
-
"type": "api-server",
|
|
6
|
-
"language": "typescript",
|
|
7
|
-
"framework": "express",
|
|
8
|
-
"features": [
|
|
9
|
-
"Express 4",
|
|
10
|
-
"TypeScript",
|
|
11
|
-
"JWT Authentication",
|
|
12
|
-
"Swagger Documentation",
|
|
13
|
-
"Database Ready",
|
|
14
|
-
"AIWF Integration",
|
|
15
|
-
"Error Handling",
|
|
16
|
-
"Request Validation"
|
|
17
|
-
],
|
|
18
|
-
"structure": {
|
|
19
|
-
"src": "소스 코드",
|
|
20
|
-
"tests": "테스트 파일",
|
|
21
|
-
".aiwf": "AIWF 설정 및 메타데이터",
|
|
22
|
-
"docs": "API 문서"
|
|
23
|
-
},
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"express": "^4.18.2",
|
|
26
|
-
"cors": "^2.8.5",
|
|
27
|
-
"helmet": "^7.0.0",
|
|
28
|
-
"compression": "^1.7.4",
|
|
29
|
-
"dotenv": "^16.3.1",
|
|
30
|
-
"jsonwebtoken": "^9.0.1",
|
|
31
|
-
"bcryptjs": "^2.4.3",
|
|
32
|
-
"express-validator": "^7.0.1",
|
|
33
|
-
"swagger-jsdoc": "^6.2.8",
|
|
34
|
-
"swagger-ui-express": "^5.0.0"
|
|
35
|
-
},
|
|
36
|
-
"devDependencies": {
|
|
37
|
-
"@types/express": "^4.17.17",
|
|
38
|
-
"@types/node": "^20.0.0",
|
|
39
|
-
"@types/cors": "^2.8.13",
|
|
40
|
-
"@types/compression": "^1.7.2",
|
|
41
|
-
"@types/jsonwebtoken": "^9.0.2",
|
|
42
|
-
"@types/bcryptjs": "^2.4.2",
|
|
43
|
-
"@types/swagger-jsdoc": "^6.0.1",
|
|
44
|
-
"@types/swagger-ui-express": "^4.1.3",
|
|
45
|
-
"@typescript-eslint/eslint-plugin": "^5.60.0",
|
|
46
|
-
"@typescript-eslint/parser": "^5.60.0",
|
|
47
|
-
"typescript": "^5.1.0",
|
|
48
|
-
"ts-node": "^10.9.0",
|
|
49
|
-
"nodemon": "^3.0.0",
|
|
50
|
-
"eslint": "^8.43.0",
|
|
51
|
-
"jest": "^29.5.0",
|
|
52
|
-
"@types/jest": "^29.5.0",
|
|
53
|
-
"supertest": "^6.3.0",
|
|
54
|
-
"@types/supertest": "^2.0.12"
|
|
55
|
-
},
|
|
56
|
-
"scripts": {
|
|
57
|
-
"dev": "nodemon",
|
|
58
|
-
"build": "tsc",
|
|
59
|
-
"start": "node dist/index.js",
|
|
60
|
-
"test": "jest",
|
|
61
|
-
"lint": "eslint . --ext .ts",
|
|
62
|
-
"aiwf": "node .aiwf/scripts/cli.js"
|
|
63
|
-
}
|
|
64
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project_name": "{{projectName}}",
|
|
3
|
-
"project_type": "api-server",
|
|
4
|
-
"framework": "express",
|
|
5
|
-
"language": "typescript",
|
|
6
|
-
"created_at": "{{createdAt}}",
|
|
7
|
-
"version": "0.0.1",
|
|
8
|
-
"features": {
|
|
9
|
-
"feature_ledger": {
|
|
10
|
-
"enabled": true,
|
|
11
|
-
"auto_track": true,
|
|
12
|
-
"git_integration": true,
|
|
13
|
-
"api_endpoints": true
|
|
14
|
-
},
|
|
15
|
-
"ai_persona": {
|
|
16
|
-
"enabled": true,
|
|
17
|
-
"default": "backend-engineer",
|
|
18
|
-
"available": [
|
|
19
|
-
"backend-engineer",
|
|
20
|
-
"api-architect",
|
|
21
|
-
"database-specialist",
|
|
22
|
-
"security-auditor",
|
|
23
|
-
"performance-optimizer"
|
|
24
|
-
]
|
|
25
|
-
},
|
|
26
|
-
"context_compression": {
|
|
27
|
-
"enabled": true,
|
|
28
|
-
"level": "balanced",
|
|
29
|
-
"token_limit": 100000,
|
|
30
|
-
"cache_enabled": true
|
|
31
|
-
},
|
|
32
|
-
"api_documentation": {
|
|
33
|
-
"enabled": true,
|
|
34
|
-
"swagger": true,
|
|
35
|
-
"postman_sync": false
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
"structure": {
|
|
39
|
-
"src_dir": "src",
|
|
40
|
-
"test_dir": "tests",
|
|
41
|
-
"build_dir": "dist",
|
|
42
|
-
"docs_dir": "docs"
|
|
43
|
-
},
|
|
44
|
-
"conventions": {
|
|
45
|
-
"routing": "restful",
|
|
46
|
-
"authentication": "jwt",
|
|
47
|
-
"validation": "express-validator",
|
|
48
|
-
"testing": "jest",
|
|
49
|
-
"linting": "eslint",
|
|
50
|
-
"database": "prepared"
|
|
51
|
-
},
|
|
52
|
-
"scripts": {
|
|
53
|
-
"pre_commit": "npm run lint && npm test",
|
|
54
|
-
"post_feature": "npm run aiwf:feature update && npm run aiwf:api docs"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "1.0.0",
|
|
3
|
-
"project": "{{projectName}}",
|
|
4
|
-
"created": "{{createdAt}}",
|
|
5
|
-
"features": [
|
|
6
|
-
{
|
|
7
|
-
"id": "F001",
|
|
8
|
-
"name": "API 서버 초기 설정",
|
|
9
|
-
"description": "Express + TypeScript 기반 RESTful API 서버 초기 설정",
|
|
10
|
-
"type": "setup",
|
|
11
|
-
"status": "completed",
|
|
12
|
-
"created_at": "{{createdAt}}",
|
|
13
|
-
"completed_at": "{{createdAt}}",
|
|
14
|
-
"components": [
|
|
15
|
-
"Express 서버 설정",
|
|
16
|
-
"TypeScript 설정",
|
|
17
|
-
"미들웨어 구성",
|
|
18
|
-
"에러 핸들링",
|
|
19
|
-
"API 문서화 (Swagger)"
|
|
20
|
-
],
|
|
21
|
-
"endpoints": [
|
|
22
|
-
"GET /api/health",
|
|
23
|
-
"GET /api/v1/status",
|
|
24
|
-
"GET /docs"
|
|
25
|
-
],
|
|
26
|
-
"files": [
|
|
27
|
-
"src/index.ts",
|
|
28
|
-
"src/app.ts",
|
|
29
|
-
"src/middleware/*",
|
|
30
|
-
"src/config/*"
|
|
31
|
-
],
|
|
32
|
-
"tags": ["초기설정", "인프라", "API"]
|
|
33
|
-
}
|
|
34
|
-
],
|
|
35
|
-
"statistics": {
|
|
36
|
-
"total_features": 1,
|
|
37
|
-
"completed": 1,
|
|
38
|
-
"in_progress": 0,
|
|
39
|
-
"planned": 0,
|
|
40
|
-
"total_endpoints": 3
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "backend-engineer",
|
|
3
|
-
"name": "백엔드 엔지니어",
|
|
4
|
-
"description": "Express API 서버 개발 전문가",
|
|
5
|
-
"expertise": [
|
|
6
|
-
"RESTful API 설계",
|
|
7
|
-
"Express.js 최적화",
|
|
8
|
-
"데이터베이스 설계 및 쿼리 최적화",
|
|
9
|
-
"인증/인가 시스템",
|
|
10
|
-
"API 보안",
|
|
11
|
-
"성능 튜닝"
|
|
12
|
-
],
|
|
13
|
-
"context": {
|
|
14
|
-
"focus_areas": [
|
|
15
|
-
"API 설계 패턴",
|
|
16
|
-
"에러 핸들링",
|
|
17
|
-
"입력 검증",
|
|
18
|
-
"미들웨어 아키텍처",
|
|
19
|
-
"데이터베이스 트랜잭션"
|
|
20
|
-
],
|
|
21
|
-
"code_style": {
|
|
22
|
-
"naming": "camelCase (변수/함수), PascalCase (클래스/인터페이스)",
|
|
23
|
-
"structure": "계층형 아키텍처 (Controller-Service-Repository)",
|
|
24
|
-
"error_handling": "중앙집중식 에러 핸들러",
|
|
25
|
-
"validation": "DTO와 validation 미들웨어 사용"
|
|
26
|
-
},
|
|
27
|
-
"best_practices": [
|
|
28
|
-
"RESTful 원칙 준수",
|
|
29
|
-
"적절한 HTTP 상태 코드 사용",
|
|
30
|
-
"요청/응답 DTO 정의",
|
|
31
|
-
"비즈니스 로직과 컨트롤러 분리",
|
|
32
|
-
"트랜잭션 관리"
|
|
33
|
-
]
|
|
34
|
-
},
|
|
35
|
-
"prompts": {
|
|
36
|
-
"api_design": "RESTful 원칙을 따르며 확장 가능하고 유지보수가 쉬운 API를 설계해주세요.",
|
|
37
|
-
"security": "OWASP Top 10을 고려하여 보안이 강화된 API를 구현해주세요.",
|
|
38
|
-
"performance": "캐싱, 쿼리 최적화, 비동기 처리를 활용하여 고성능 API를 만들어주세요."
|
|
39
|
-
}
|
|
40
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
|
|
6
|
-
const args = process.argv.slice(2);
|
|
7
|
-
const command = args[0];
|
|
8
|
-
const subcommand = args[1];
|
|
9
|
-
|
|
10
|
-
const projectRoot = path.resolve(__dirname, '../..');
|
|
11
|
-
const aiwfDir = path.join(projectRoot, '.aiwf');
|
|
12
|
-
const featureLedgerPath = path.join(aiwfDir, 'feature-ledger.json');
|
|
13
|
-
const configPath = path.join(aiwfDir, 'config.json');
|
|
14
|
-
|
|
15
|
-
// Feature Ledger 관련 명령어
|
|
16
|
-
if (command === 'feature') {
|
|
17
|
-
const ledger = JSON.parse(fs.readFileSync(featureLedgerPath, 'utf8'));
|
|
18
|
-
|
|
19
|
-
switch (subcommand) {
|
|
20
|
-
case 'list':
|
|
21
|
-
console.log('\n📋 Feature Ledger\n');
|
|
22
|
-
ledger.features.forEach(feature => {
|
|
23
|
-
const status = {
|
|
24
|
-
completed: '✅',
|
|
25
|
-
in_progress: '🔄',
|
|
26
|
-
planned: '📝'
|
|
27
|
-
}[feature.status];
|
|
28
|
-
console.log(`${status} [${feature.id}] ${feature.name}`);
|
|
29
|
-
console.log(` ${feature.description}`);
|
|
30
|
-
if (feature.endpoints && feature.endpoints.length > 0) {
|
|
31
|
-
console.log(` Endpoints: ${feature.endpoints.join(', ')}`);
|
|
32
|
-
}
|
|
33
|
-
console.log(` Tags: ${feature.tags.join(', ')}`);
|
|
34
|
-
console.log();
|
|
35
|
-
});
|
|
36
|
-
console.log(`총 ${ledger.features.length}개 기능`);
|
|
37
|
-
break;
|
|
38
|
-
|
|
39
|
-
case 'stats':
|
|
40
|
-
console.log('\n📊 Feature 통계\n');
|
|
41
|
-
console.log(`총 기능: ${ledger.statistics.total_features}`);
|
|
42
|
-
console.log(`완료: ${ledger.statistics.completed}`);
|
|
43
|
-
console.log(`진행중: ${ledger.statistics.in_progress}`);
|
|
44
|
-
console.log(`계획됨: ${ledger.statistics.planned}`);
|
|
45
|
-
console.log(`총 엔드포인트: ${ledger.statistics.total_endpoints || 0}`);
|
|
46
|
-
break;
|
|
47
|
-
|
|
48
|
-
default:
|
|
49
|
-
console.log('사용법: npm run aiwf feature [list|stats]');
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// API 관련 명령어
|
|
54
|
-
else if (command === 'api') {
|
|
55
|
-
switch (subcommand) {
|
|
56
|
-
case 'docs':
|
|
57
|
-
console.log('API 문서 업데이트 중...');
|
|
58
|
-
console.log('Swagger 문서가 /docs 경로에서 제공됩니다.');
|
|
59
|
-
break;
|
|
60
|
-
|
|
61
|
-
case 'validate':
|
|
62
|
-
console.log('API 스펙 검증 중...');
|
|
63
|
-
// 실제 구현에서는 OpenAPI 스펙 검증 로직
|
|
64
|
-
console.log('✅ API 스펙이 유효합니다.');
|
|
65
|
-
break;
|
|
66
|
-
|
|
67
|
-
default:
|
|
68
|
-
console.log('사용법: npm run aiwf api [docs|validate]');
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// 상태 명령어
|
|
73
|
-
else if (command === 'status') {
|
|
74
|
-
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
75
|
-
const ledger = JSON.parse(fs.readFileSync(featureLedgerPath, 'utf8'));
|
|
76
|
-
|
|
77
|
-
console.log('\n🚀 AIWF API 서버 상태\n');
|
|
78
|
-
console.log(`프로젝트: ${config.project_name}`);
|
|
79
|
-
console.log(`타입: ${config.project_type}`);
|
|
80
|
-
console.log(`프레임워크: ${config.framework}`);
|
|
81
|
-
console.log(`버전: ${config.version}`);
|
|
82
|
-
console.log();
|
|
83
|
-
console.log('📊 통계:');
|
|
84
|
-
console.log(`- 총 기능: ${ledger.statistics.total_features}`);
|
|
85
|
-
console.log(`- 총 엔드포인트: ${ledger.statistics.total_endpoints || 0}`);
|
|
86
|
-
console.log();
|
|
87
|
-
console.log('🤖 AI 페르소나:', config.features.ai_persona.default);
|
|
88
|
-
console.log('📦 Context 압축:', config.features.context_compression.level);
|
|
89
|
-
console.log('📚 API 문서화:', config.features.api_documentation.swagger ? 'Swagger 활성화' : '비활성화');
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// 도움말
|
|
93
|
-
else {
|
|
94
|
-
console.log(`
|
|
95
|
-
AIWF CLI - AI Workflow Framework (API Server)
|
|
96
|
-
|
|
97
|
-
사용법: npm run aiwf [command] [subcommand]
|
|
98
|
-
|
|
99
|
-
명령어:
|
|
100
|
-
status 프로젝트 상태 보기
|
|
101
|
-
feature list 기능 목록 보기
|
|
102
|
-
feature stats 기능 통계 보기
|
|
103
|
-
api docs API 문서 업데이트
|
|
104
|
-
api validate API 스펙 검증
|
|
105
|
-
|
|
106
|
-
예시:
|
|
107
|
-
npm run aiwf status
|
|
108
|
-
npm run aiwf feature list
|
|
109
|
-
npm run aiwf api docs
|
|
110
|
-
`);
|
|
111
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Application
|
|
2
|
-
NODE_ENV=development
|
|
3
|
-
PORT=3000
|
|
4
|
-
HOST=localhost
|
|
5
|
-
|
|
6
|
-
# Security
|
|
7
|
-
JWT_SECRET=your-super-secret-jwt-key-change-this
|
|
8
|
-
JWT_EXPIRES_IN=7d
|
|
9
|
-
BCRYPT_ROUNDS=10
|
|
10
|
-
|
|
11
|
-
# Database (uncomment and configure as needed)
|
|
12
|
-
# DB_HOST=localhost
|
|
13
|
-
# DB_PORT=5432
|
|
14
|
-
# DB_NAME=myapp
|
|
15
|
-
# DB_USER=myuser
|
|
16
|
-
# DB_PASSWORD=mypassword
|
|
17
|
-
|
|
18
|
-
# AIWF Settings
|
|
19
|
-
AIWF_ENABLED=true
|
|
20
|
-
AIWF_TOKEN_LIMIT=100000
|
|
21
|
-
AIWF_COMPRESSION_LEVEL=balanced
|
|
22
|
-
|
|
23
|
-
# API Rate Limiting
|
|
24
|
-
RATE_LIMIT_WINDOW_MS=900000
|
|
25
|
-
RATE_LIMIT_MAX_REQUESTS=100
|
|
26
|
-
|
|
27
|
-
# Logging
|
|
28
|
-
LOG_LEVEL=info
|
|
29
|
-
LOG_FORMAT=json
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"parser": "@typescript-eslint/parser",
|
|
3
|
-
"extends": [
|
|
4
|
-
"eslint:recommended",
|
|
5
|
-
"plugin:@typescript-eslint/recommended"
|
|
6
|
-
],
|
|
7
|
-
"parserOptions": {
|
|
8
|
-
"ecmaVersion": 2022,
|
|
9
|
-
"sourceType": "module",
|
|
10
|
-
"project": "./tsconfig.json"
|
|
11
|
-
},
|
|
12
|
-
"rules": {
|
|
13
|
-
"@typescript-eslint/explicit-function-return-type": "off",
|
|
14
|
-
"@typescript-eslint/no-explicit-any": "warn",
|
|
15
|
-
"@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
|
|
16
|
-
"no-console": ["warn", { "allow": ["warn", "error"] }]
|
|
17
|
-
},
|
|
18
|
-
"env": {
|
|
19
|
-
"node": true,
|
|
20
|
-
"es2022": true,
|
|
21
|
-
"jest": true
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# {{projectName}}
|
|
2
|
-
|
|
3
|
-
AIWF가 통합된 Express + TypeScript RESTful API 서버입니다.
|
|
4
|
-
|
|
5
|
-
## 시작하기
|
|
6
|
-
|
|
7
|
-
### 개발 서버 실행
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install
|
|
11
|
-
cp .env.example .env
|
|
12
|
-
npm run dev
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
서버가 [http://localhost:3000](http://localhost:3000)에서 실행됩니다.
|
|
16
|
-
|
|
17
|
-
### API 문서
|
|
18
|
-
|
|
19
|
-
Swagger UI: [http://localhost:3000/docs](http://localhost:3000/docs)
|
|
20
|
-
|
|
21
|
-
### 빌드
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
npm run build
|
|
25
|
-
npm start
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 기술 스택
|
|
29
|
-
|
|
30
|
-
- **Express 4** - 웹 프레임워크
|
|
31
|
-
- **TypeScript** - 타입 안정성
|
|
32
|
-
- **JWT** - 인증
|
|
33
|
-
- **Swagger** - API 문서화
|
|
34
|
-
- **Winston** - 로깅
|
|
35
|
-
- **Jest** - 테스팅
|
|
36
|
-
- **AIWF** - AI 지원 개발 워크플로우
|
|
37
|
-
|
|
38
|
-
## 프로젝트 구조
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
src/
|
|
42
|
-
├── config/ # 설정 파일
|
|
43
|
-
├── controllers/ # 요청 핸들러
|
|
44
|
-
├── middleware/ # Express 미들웨어
|
|
45
|
-
├── models/ # 데이터 모델
|
|
46
|
-
├── routes/ # API 라우트 정의
|
|
47
|
-
├── services/ # 비즈니스 로직
|
|
48
|
-
├── utils/ # 유틸리티 함수
|
|
49
|
-
└── types/ # TypeScript 타입 정의
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## API 엔드포인트
|
|
53
|
-
|
|
54
|
-
### 인증
|
|
55
|
-
|
|
56
|
-
- `POST /api/v1/auth/register` - 회원가입
|
|
57
|
-
- `POST /api/v1/auth/login` - 로그인
|
|
58
|
-
|
|
59
|
-
### 상태
|
|
60
|
-
|
|
61
|
-
- `GET /health` - 헬스체크
|
|
62
|
-
- `GET /api/v1/status` - API 상태
|
|
63
|
-
|
|
64
|
-
### AIWF
|
|
65
|
-
|
|
66
|
-
- `GET /api/aiwf/features` - Feature Ledger 조회
|
|
67
|
-
- `GET /api/aiwf/token-usage` - 토큰 사용량 조회
|
|
68
|
-
- `GET /api/aiwf/context` - Context 상태 조회
|
|
69
|
-
|
|
70
|
-
## AIWF 기능
|
|
71
|
-
|
|
72
|
-
### Feature Ledger
|
|
73
|
-
|
|
74
|
-
API 엔드포인트 개발을 자동으로 추적합니다.
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
npm run aiwf:feature list # 기능 목록 보기
|
|
78
|
-
npm run aiwf:feature stats # 통계 보기
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### API 문서 자동화
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
npm run aiwf:api docs # API 문서 업데이트
|
|
85
|
-
npm run aiwf:api validate # API 스펙 검증
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### AI 페르소나
|
|
89
|
-
|
|
90
|
-
- `backend-engineer` - 백엔드 개발 (기본값)
|
|
91
|
-
- `api-architect` - API 설계
|
|
92
|
-
- `database-specialist` - 데이터베이스
|
|
93
|
-
- `security-auditor` - 보안 감사
|
|
94
|
-
- `performance-optimizer` - 성능 최적화
|
|
95
|
-
|
|
96
|
-
## 개발 가이드
|
|
97
|
-
|
|
98
|
-
### 새 API 엔드포인트 추가
|
|
99
|
-
|
|
100
|
-
1. 라우트 정의 (`src/routes/`)
|
|
101
|
-
2. 컨트롤러 구현 (`src/controllers/`)
|
|
102
|
-
3. 서비스 로직 작성 (`src/services/`)
|
|
103
|
-
4. 입력 검증 추가
|
|
104
|
-
5. Swagger 문서 작성
|
|
105
|
-
|
|
106
|
-
### 미들웨어 추가
|
|
107
|
-
|
|
108
|
-
```typescript
|
|
109
|
-
// src/middleware/myMiddleware.ts
|
|
110
|
-
export const myMiddleware = (req: Request, res: Response, next: NextFunction) => {
|
|
111
|
-
// 미들웨어 로직
|
|
112
|
-
next();
|
|
113
|
-
};
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### 환경 변수
|
|
117
|
-
|
|
118
|
-
`.env` 파일 설정:
|
|
119
|
-
|
|
120
|
-
```env
|
|
121
|
-
NODE_ENV=development
|
|
122
|
-
PORT=3000
|
|
123
|
-
JWT_SECRET=your-secret-key
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## 테스트
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
# 전체 테스트 실행
|
|
130
|
-
npm test
|
|
131
|
-
|
|
132
|
-
# 감시 모드
|
|
133
|
-
npm run test:watch
|
|
134
|
-
|
|
135
|
-
# 커버리지 리포트
|
|
136
|
-
npm test -- --coverage
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## 보안
|
|
140
|
-
|
|
141
|
-
- Helmet.js로 보안 헤더 설정
|
|
142
|
-
- Rate limiting 적용
|
|
143
|
-
- JWT 토큰 인증
|
|
144
|
-
- 입력 검증 (express-validator)
|
|
145
|
-
- CORS 설정
|
|
146
|
-
|
|
147
|
-
## 배포
|
|
148
|
-
|
|
149
|
-
### Docker
|
|
150
|
-
|
|
151
|
-
```dockerfile
|
|
152
|
-
FROM node:18-alpine
|
|
153
|
-
WORKDIR /app
|
|
154
|
-
COPY package*.json ./
|
|
155
|
-
RUN npm ci --only=production
|
|
156
|
-
COPY . .
|
|
157
|
-
RUN npm run build
|
|
158
|
-
EXPOSE 3000
|
|
159
|
-
CMD ["npm", "start"]
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### PM2
|
|
163
|
-
|
|
164
|
-
```bash
|
|
165
|
-
npm run build
|
|
166
|
-
pm2 start dist/index.js --name {{projectName}}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## 라이선스
|
|
170
|
-
|
|
171
|
-
MIT
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
preset: 'ts-jest',
|
|
3
|
-
testEnvironment: 'node',
|
|
4
|
-
roots: ['<rootDir>/src', '<rootDir>/tests'],
|
|
5
|
-
testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
|
|
6
|
-
transform: {
|
|
7
|
-
'^.+\\.ts$': 'ts-jest',
|
|
8
|
-
},
|
|
9
|
-
collectCoverageFrom: [
|
|
10
|
-
'src/**/*.ts',
|
|
11
|
-
'!src/**/*.d.ts',
|
|
12
|
-
'!src/**/*.interface.ts',
|
|
13
|
-
'!src/index.ts',
|
|
14
|
-
],
|
|
15
|
-
moduleNameMapper: {
|
|
16
|
-
'^@/(.*)$': '<rootDir>/src/$1',
|
|
17
|
-
'^@config/(.*)$': '<rootDir>/src/config/$1',
|
|
18
|
-
'^@controllers/(.*)$': '<rootDir>/src/controllers/$1',
|
|
19
|
-
'^@middleware/(.*)$': '<rootDir>/src/middleware/$1',
|
|
20
|
-
'^@models/(.*)$': '<rootDir>/src/models/$1',
|
|
21
|
-
'^@routes/(.*)$': '<rootDir>/src/routes/$1',
|
|
22
|
-
'^@services/(.*)$': '<rootDir>/src/services/$1',
|
|
23
|
-
'^@utils/(.*)$': '<rootDir>/src/utils/$1',
|
|
24
|
-
'^@types/(.*)$': '<rootDir>/src/types/$1',
|
|
25
|
-
},
|
|
26
|
-
};
|