aiwf 0.3.22 → 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.
Files changed (140) hide show
  1. package/package.json +3 -2
  2. package/src/cli/index.js +39 -336
  3. package/src/lib/installer.js +294 -90
  4. package/src/utils/messages.js +24 -0
  5. package/src/DEPENDENCY_MAP.md +0 -90
  6. package/src/cli/cache-cli.js +0 -459
  7. package/src/cli/checkpoint-cli.js +0 -417
  8. package/src/cli/language-cli.js +0 -286
  9. package/src/cli/sprint-cli.js +0 -287
  10. package/src/commands/ai-tool.js +0 -383
  11. package/src/commands/compress.js +0 -60
  12. package/src/commands/create-project.js +0 -160
  13. package/src/commands/evaluate.js +0 -459
  14. package/src/commands/persona.js +0 -309
  15. package/src/commands/sprint-task.js +0 -262
  16. package/src/commands/token.js +0 -312
  17. package/src/lib/ai-persona-manager.js +0 -711
  18. package/src/lib/cache-system.js +0 -332
  19. package/src/lib/context-engine.js +0 -568
  20. package/src/lib/github-integration.js +0 -402
  21. package/src/lib/memory-profiler.js +0 -471
  22. package/src/lib/metrics-collector.js +0 -885
  23. package/src/lib/offline-detector.js +0 -386
  24. package/src/lib/resource-loader-enhanced.js +0 -399
  25. package/src/lib/resource-loader.js +0 -250
  26. package/src/lib/resources/commands/ai-persona.js +0 -602
  27. package/src/lib/resources/commands/compress-context.js +0 -389
  28. package/src/lib/resources/commands/evaluate.js +0 -246
  29. package/src/lib/resources/commands/persona-context-apply.js +0 -562
  30. package/src/lib/resources/commands/token-tracking.js +0 -443
  31. package/src/lib/resources/config/commit-patterns.js +0 -103
  32. package/src/lib/resources/config/language.json +0 -6
  33. package/src/lib/resources/personas/PERSONA_INDEX.md +0 -57
  34. package/src/lib/resources/personas/analyst.json +0 -44
  35. package/src/lib/resources/personas/architect/best_practices.md +0 -136
  36. package/src/lib/resources/personas/architect/knowledge_base.md +0 -377
  37. package/src/lib/resources/personas/architect.json +0 -44
  38. package/src/lib/resources/personas/backend/best_practices.md +0 -766
  39. package/src/lib/resources/personas/backend/knowledge_base.md +0 -1070
  40. package/src/lib/resources/personas/data_analyst/best_practices.md +0 -594
  41. package/src/lib/resources/personas/data_analyst/knowledge_base.md +0 -1057
  42. package/src/lib/resources/personas/developer.json +0 -44
  43. package/src/lib/resources/personas/developer.md +0 -37
  44. package/src/lib/resources/personas/evaluation_criteria.json +0 -137
  45. package/src/lib/resources/personas/frontend/best_practices.md +0 -445
  46. package/src/lib/resources/personas/frontend/knowledge_base.md +0 -729
  47. package/src/lib/resources/personas/persona-index.json +0 -31
  48. package/src/lib/resources/personas/reviewer.json +0 -44
  49. package/src/lib/resources/personas/security/best_practices.md +0 -307
  50. package/src/lib/resources/personas/security/knowledge_base.md +0 -498
  51. package/src/lib/resources/personas/tester.json +0 -44
  52. package/src/lib/resources/templates/README.md +0 -78
  53. package/src/lib/resources/templates/api-server/config.json +0 -64
  54. package/src/lib/resources/templates/api-server/template/.aiwf/config.json +0 -56
  55. package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
  56. package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
  57. package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
  58. package/src/lib/resources/templates/api-server/template/.env.example +0 -29
  59. package/src/lib/resources/templates/api-server/template/.eslintrc.json +0 -23
  60. package/src/lib/resources/templates/api-server/template/README.md +0 -171
  61. package/src/lib/resources/templates/api-server/template/jest.config.js +0 -26
  62. package/src/lib/resources/templates/api-server/template/nodemon.json +0 -9
  63. package/src/lib/resources/templates/api-server/template/package.json +0 -61
  64. package/src/lib/resources/templates/api-server/template/src/app.ts +0 -60
  65. package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +0 -38
  66. package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
  67. package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +0 -128
  68. package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +0 -28
  69. package/src/lib/resources/templates/api-server/template/src/index.ts +0 -28
  70. package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
  71. package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
  72. package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
  73. package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
  74. package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
  75. package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -31
  76. package/src/lib/resources/templates/api-server/template/src/routes/index.ts +0 -13
  77. package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +0 -67
  78. package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +0 -37
  79. package/src/lib/resources/templates/api-server/template/tests/app.test.ts +0 -40
  80. package/src/lib/resources/templates/api-server/template/tsconfig.json +0 -43
  81. package/src/lib/resources/templates/npm-library/config.json +0 -61
  82. package/src/lib/resources/templates/npm-library/template/LICENSE +0 -21
  83. package/src/lib/resources/templates/npm-library/template/README.md +0 -201
  84. package/src/lib/resources/templates/npm-library/template/package.json +0 -78
  85. package/src/lib/resources/templates/web-app/config.json +0 -53
  86. package/src/lib/resources/templates/web-app/template/.aiwf/config.json +0 -54
  87. package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
  88. package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
  89. package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
  90. package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +0 -20
  91. package/src/lib/resources/templates/web-app/template/README.md +0 -151
  92. package/src/lib/resources/templates/web-app/template/index.html +0 -14
  93. package/src/lib/resources/templates/web-app/template/package.json +0 -44
  94. package/src/lib/resources/templates/web-app/template/postcss.config.js +0 -6
  95. package/src/lib/resources/templates/web-app/template/public/vite.svg +0 -1
  96. package/src/lib/resources/templates/web-app/template/src/App.tsx +0 -21
  97. package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +0 -57
  98. package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
  99. package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
  100. package/src/lib/resources/templates/web-app/template/src/index.css +0 -60
  101. package/src/lib/resources/templates/web-app/template/src/main.tsx +0 -10
  102. package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
  103. package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +0 -89
  104. package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +0 -25
  105. package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
  106. package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +0 -9
  107. package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +0 -1
  108. package/src/lib/resources/templates/web-app/template/tailwind.config.js +0 -30
  109. package/src/lib/resources/templates/web-app/template/tsconfig.json +0 -37
  110. package/src/lib/resources/templates/web-app/template/tsconfig.node.json +0 -10
  111. package/src/lib/resources/templates/web-app/template/vite.config.ts +0 -23
  112. package/src/lib/resources/utils/background-monitor.js +0 -223
  113. package/src/lib/resources/utils/compression-metrics.js +0 -1031
  114. package/src/lib/resources/utils/compression-strategies.js +0 -557
  115. package/src/lib/resources/utils/content-normalizer.js +0 -455
  116. package/src/lib/resources/utils/context-compressor.js +0 -583
  117. package/src/lib/resources/utils/context-rule-parser.js +0 -180
  118. package/src/lib/resources/utils/context-token-monitor.js +0 -463
  119. package/src/lib/resources/utils/context-update-manager.js +0 -502
  120. package/src/lib/resources/utils/git-utils.js +0 -220
  121. package/src/lib/resources/utils/importance-classifier.js +0 -645
  122. package/src/lib/resources/utils/information-filter.js +0 -710
  123. package/src/lib/resources/utils/persona-aware-compressor.js +0 -598
  124. package/src/lib/resources/utils/prompt-injector.js +0 -242
  125. package/src/lib/resources/utils/simplified-evaluator.js +0 -119
  126. package/src/lib/resources/utils/text-summarizer.js +0 -492
  127. package/src/lib/resources/utils/token-counter.js +0 -177
  128. package/src/lib/resources/utils/token-monitor.js +0 -484
  129. package/src/lib/resources/utils/token-reporter.js +0 -452
  130. package/src/lib/resources/utils/token-storage.js +0 -433
  131. package/src/lib/resources/utils/token-tracker.js +0 -283
  132. package/src/lib/state/priority-calculator.js +0 -217
  133. package/src/lib/state/state-index.js +0 -155
  134. package/src/lib/state/task-scanner.js +0 -328
  135. package/src/lib/task-analyzer.js +0 -599
  136. package/src/lib/template-cache-system.js +0 -559
  137. package/src/lib/template-downloader.js +0 -467
  138. package/src/lib/template-version-manager.js +0 -491
  139. package/src/lib/token-optimizer.js +0 -517
  140. package/src/utils/engineering-guard.js +0 -399
@@ -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
- };
@@ -1,9 +0,0 @@
1
- {
2
- "watch": ["src"],
3
- "ext": "ts",
4
- "ignore": ["src/**/*.spec.ts", "src/**/*.test.ts"],
5
- "exec": "ts-node -r tsconfig-paths/register ./src/index.ts",
6
- "env": {
7
- "NODE_ENV": "development"
8
- }
9
- }
@@ -1,61 +0,0 @@
1
- {
2
- "name": "{{projectName}}",
3
- "version": "0.0.1",
4
- "description": "AIWF 통합 Express API 서버",
5
- "main": "dist/index.js",
6
- "scripts": {
7
- "dev": "nodemon",
8
- "build": "tsc",
9
- "start": "node dist/index.js",
10
- "test": "jest",
11
- "test:watch": "jest --watch",
12
- "lint": "eslint . --ext .ts",
13
- "aiwf": "node .aiwf/scripts/cli.js",
14
- "aiwf:status": "npm run aiwf status",
15
- "aiwf:feature": "npm run aiwf feature",
16
- "aiwf:api": "npm run aiwf api"
17
- },
18
- "keywords": [
19
- "api",
20
- "express",
21
- "typescript",
22
- "aiwf"
23
- ],
24
- "author": "",
25
- "license": "MIT",
26
- "dependencies": {
27
- "express": "^4.18.2",
28
- "cors": "^2.8.5",
29
- "helmet": "^7.0.0",
30
- "compression": "^1.7.4",
31
- "dotenv": "^16.3.1",
32
- "jsonwebtoken": "^9.0.1",
33
- "bcryptjs": "^2.4.3",
34
- "express-validator": "^7.0.1",
35
- "swagger-jsdoc": "^6.2.8",
36
- "swagger-ui-express": "^5.0.0",
37
- "winston": "^3.9.0",
38
- "express-rate-limit": "^6.8.0"
39
- },
40
- "devDependencies": {
41
- "@types/express": "^4.17.17",
42
- "@types/node": "^20.0.0",
43
- "@types/cors": "^2.8.13",
44
- "@types/compression": "^1.7.2",
45
- "@types/jsonwebtoken": "^9.0.2",
46
- "@types/bcryptjs": "^2.4.2",
47
- "@types/swagger-jsdoc": "^6.0.1",
48
- "@types/swagger-ui-express": "^4.1.3",
49
- "@typescript-eslint/eslint-plugin": "^5.60.0",
50
- "@typescript-eslint/parser": "^5.60.0",
51
- "typescript": "^5.1.0",
52
- "ts-node": "^10.9.0",
53
- "nodemon": "^3.0.0",
54
- "eslint": "^8.43.0",
55
- "jest": "^29.5.0",
56
- "@types/jest": "^29.5.0",
57
- "ts-jest": "^29.1.0",
58
- "supertest": "^6.3.0",
59
- "@types/supertest": "^2.0.12"
60
- }
61
- }
@@ -1,60 +0,0 @@
1
- import express, { Application } from 'express';
2
- import cors from 'cors';
3
- import helmet from 'helmet';
4
- import compression from 'compression';
5
- import rateLimit from 'express-rate-limit';
6
- import swaggerUi from 'swagger-ui-express';
7
- import { swaggerSpec } from '@config/swagger';
8
- import { errorHandler } from '@middleware/errorHandler';
9
- import { notFoundHandler } from '@middleware/notFoundHandler';
10
- import { requestLogger } from '@middleware/requestLogger';
11
- import { aiwfMiddleware } from '@middleware/aiwfMiddleware';
12
- import routes from '@routes/index';
13
-
14
- const app: Application = express();
15
-
16
- // Security middleware
17
- app.use(helmet());
18
- app.use(cors());
19
-
20
- // Rate limiting
21
- const limiter = rateLimit({
22
- windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '900000'),
23
- max: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS || '100'),
24
- message: 'Too many requests from this IP, please try again later.',
25
- });
26
- app.use('/api', limiter);
27
-
28
- // Body parsing middleware
29
- app.use(express.json({ limit: '10mb' }));
30
- app.use(express.urlencoded({ extended: true, limit: '10mb' }));
31
-
32
- // Compression middleware
33
- app.use(compression());
34
-
35
- // Request logging
36
- app.use(requestLogger);
37
-
38
- // AIWF integration
39
- app.use(aiwfMiddleware);
40
-
41
- // API Documentation
42
- app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
43
-
44
- // Health check
45
- app.get('/health', (req, res) => {
46
- res.status(200).json({
47
- status: 'healthy',
48
- timestamp: new Date().toISOString(),
49
- uptime: process.uptime(),
50
- });
51
- });
52
-
53
- // API routes
54
- app.use('/api', routes);
55
-
56
- // Error handlers
57
- app.use(notFoundHandler);
58
- app.use(errorHandler);
59
-
60
- export default app;
@@ -1,38 +0,0 @@
1
- import swaggerJsdoc from 'swagger-jsdoc';
2
- import { version } from '../../package.json';
3
-
4
- const options: swaggerJsdoc.Options = {
5
- definition: {
6
- openapi: '3.0.0',
7
- info: {
8
- title: '{{projectName}} API',
9
- version,
10
- description: 'AIWF 통합 Express API 서버',
11
- contact: {
12
- name: 'API Support',
13
- email: 'support@example.com',
14
- },
15
- },
16
- servers: [
17
- {
18
- url: `http://localhost:${process.env.PORT || 3000}`,
19
- description: 'Development server',
20
- },
21
- ],
22
- components: {
23
- securitySchemes: {
24
- bearerAuth: {
25
- type: 'http',
26
- scheme: 'bearer',
27
- bearerFormat: 'JWT',
28
- },
29
- },
30
- },
31
- security: [{
32
- bearerAuth: [],
33
- }],
34
- },
35
- apis: ['./src/routes/**/*.ts', './src/models/**/*.ts'],
36
- };
37
-
38
- export const swaggerSpec = swaggerJsdoc(options);