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.
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 +310 -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,54 +0,0 @@
1
- import { Request, Response, NextFunction } from 'express';
2
- import fs from 'fs/promises';
3
- import path from 'path';
4
-
5
- export const aiwfController = {
6
-
7
- getTokenUsage: async (req: Request, res: Response, next: NextFunction) => {
8
- try {
9
- // 실제 구현에서는 토큰 사용량을 추적하는 로직 필요
10
- const mockData = {
11
- total: parseInt(process.env.AIWF_TOKEN_LIMIT || '100000'),
12
- used: 45000,
13
- remaining: 55000,
14
- percentage: 45,
15
- history: [
16
- {
17
- date: new Date().toISOString(),
18
- tokens: 1500,
19
- action: 'API endpoint creation',
20
- endpoint: 'POST /api/v1/users',
21
- },
22
- ],
23
- };
24
-
25
- res.json({
26
- success: true,
27
- data: mockData,
28
- });
29
- } catch (error) {
30
- next(error);
31
- }
32
- },
33
-
34
- getContextStatus: async (req: Request, res: Response, next: NextFunction) => {
35
- try {
36
- const configPath = path.join(process.cwd(), '.aiwf', 'config.json');
37
- const configData = await fs.readFile(configPath, 'utf-8');
38
- const config = JSON.parse(configData);
39
-
40
- res.json({
41
- success: true,
42
- data: {
43
- compressionLevel: config.features.context_compression.level,
44
- cacheEnabled: config.features.context_compression.cache_enabled,
45
- tokenLimit: config.features.context_compression.token_limit,
46
- activePersona: config.features.ai_persona.default,
47
- availablePersonas: config.features.ai_persona.available,
48
- },
49
- });
50
- } catch (error) {
51
- next(error);
52
- }
53
- },
54
- };
@@ -1,128 +0,0 @@
1
- import { Request, Response, NextFunction } from 'express';
2
- import { validationResult } from 'express-validator';
3
- import bcrypt from 'bcryptjs';
4
- import jwt from 'jsonwebtoken';
5
-
6
- interface User {
7
- id: string;
8
- email: string;
9
- password: string;
10
- name: string;
11
- }
12
-
13
- // 임시 메모리 저장소 (실제로는 데이터베이스 사용)
14
- const users: User[] = [];
15
-
16
- export const authController = {
17
- register: async (req: Request, res: Response, next: NextFunction) => {
18
- try {
19
- const errors = validationResult(req);
20
- if (!errors.isEmpty()) {
21
- return res.status(400).json({
22
- success: false,
23
- errors: errors.array()
24
- });
25
- }
26
-
27
- const { email, password, name } = req.body;
28
-
29
- // 중복 체크
30
- const existingUser = users.find(u => u.email === email);
31
- if (existingUser) {
32
- return res.status(409).json({
33
- success: false,
34
- error: { message: 'Email already exists' }
35
- });
36
- }
37
-
38
- // 비밀번호 해싱
39
- const hashedPassword = await bcrypt.hash(
40
- password,
41
- parseInt(process.env.BCRYPT_ROUNDS || '10')
42
- );
43
-
44
- // 사용자 생성
45
- const newUser: User = {
46
- id: Date.now().toString(),
47
- email,
48
- password: hashedPassword,
49
- name,
50
- };
51
- users.push(newUser);
52
-
53
- // JWT 토큰 생성
54
- const token = jwt.sign(
55
- { id: newUser.id, email: newUser.email },
56
- process.env.JWT_SECRET || 'secret',
57
- { expiresIn: process.env.JWT_EXPIRES_IN || '7d' }
58
- );
59
-
60
- res.status(201).json({
61
- success: true,
62
- data: {
63
- user: {
64
- id: newUser.id,
65
- email: newUser.email,
66
- name: newUser.name,
67
- },
68
- token,
69
- },
70
- });
71
- } catch (error) {
72
- next(error);
73
- }
74
- },
75
-
76
- login: async (req: Request, res: Response, next: NextFunction) => {
77
- try {
78
- const errors = validationResult(req);
79
- if (!errors.isEmpty()) {
80
- return res.status(400).json({
81
- success: false,
82
- errors: errors.array()
83
- });
84
- }
85
-
86
- const { email, password } = req.body;
87
-
88
- // 사용자 찾기
89
- const user = users.find(u => u.email === email);
90
- if (!user) {
91
- return res.status(401).json({
92
- success: false,
93
- error: { message: 'Invalid credentials' }
94
- });
95
- }
96
-
97
- // 비밀번호 확인
98
- const isPasswordValid = await bcrypt.compare(password, user.password);
99
- if (!isPasswordValid) {
100
- return res.status(401).json({
101
- success: false,
102
- error: { message: 'Invalid credentials' }
103
- });
104
- }
105
-
106
- // JWT 토큰 생성
107
- const token = jwt.sign(
108
- { id: user.id, email: user.email },
109
- process.env.JWT_SECRET || 'secret',
110
- { expiresIn: process.env.JWT_EXPIRES_IN || '7d' }
111
- );
112
-
113
- res.json({
114
- success: true,
115
- data: {
116
- user: {
117
- id: user.id,
118
- email: user.email,
119
- name: user.name,
120
- },
121
- token,
122
- },
123
- });
124
- } catch (error) {
125
- next(error);
126
- }
127
- },
128
- };
@@ -1,28 +0,0 @@
1
- import { Request, Response } from 'express';
2
- import os from 'os';
3
-
4
- export const statusController = {
5
- getStatus: (req: Request, res: Response) => {
6
- res.json({
7
- success: true,
8
- data: {
9
- service: '{{projectName}}',
10
- version: process.env.npm_package_version || '0.0.1',
11
- environment: process.env.NODE_ENV || 'development',
12
- uptime: process.uptime(),
13
- timestamp: new Date().toISOString(),
14
- system: {
15
- platform: os.platform(),
16
- release: os.release(),
17
- totalMemory: os.totalmem(),
18
- freeMemory: os.freemem(),
19
- cpus: os.cpus().length,
20
- },
21
- aiwf: {
22
- enabled: process.env.AIWF_ENABLED === 'true',
23
- compressionLevel: process.env.AIWF_COMPRESSION_LEVEL || 'balanced',
24
- },
25
- },
26
- });
27
- },
28
- };
@@ -1,28 +0,0 @@
1
- import 'dotenv/config';
2
- import app from './app';
3
- import logger from '@utils/logger';
4
-
5
- const PORT = process.env.PORT || 3000;
6
- const HOST = process.env.HOST || 'localhost';
7
-
8
- const server = app.listen(PORT, () => {
9
- logger.info(`🚀 Server is running on http://${HOST}:${PORT}`);
10
- logger.info(`📚 API Documentation available at http://${HOST}:${PORT}/docs`);
11
- logger.info(`🤖 AIWF Integration enabled`);
12
- });
13
-
14
- // Graceful shutdown
15
- process.on('SIGTERM', () => {
16
- logger.info('SIGTERM signal received: closing HTTP server');
17
- server.close(() => {
18
- logger.info('HTTP server closed');
19
- process.exit(0);
20
- });
21
- });
22
-
23
- process.on('unhandledRejection', (reason, promise) => {
24
- logger.error('Unhandled Rejection at:', promise, 'reason:', reason);
25
- // Application specific logging, throwing an error, or other logic here
26
- });
27
-
28
- export default server;
@@ -1,50 +0,0 @@
1
- import { Request, Response, NextFunction } from 'express';
2
- import fs from 'fs/promises';
3
- import path from 'path';
4
-
5
- interface AiwfRequest extends Request {
6
- aiwf?: {
7
- featureId?: string;
8
- persona?: string;
9
- tokenUsage?: number;
10
- };
11
- }
12
-
13
- export const aiwfMiddleware = async (
14
- req: AiwfRequest,
15
- res: Response,
16
- next: NextFunction
17
- ) => {
18
- // AIWF 헤더 체크
19
- const featureId = req.headers['x-aiwf-feature-id'] as string;
20
- const persona = req.headers['x-aiwf-persona'] as string;
21
-
22
- req.aiwf = {
23
- featureId,
24
- persona: persona || 'backend-engineer',
25
- tokenUsage: 0,
26
- };
27
-
28
- // Feature 추적
29
- if (featureId && process.env.AIWF_ENABLED === 'true') {
30
- try {
31
- const ledgerPath = path.join(process.cwd(), '.aiwf', 'feature-ledger.json');
32
- const ledgerData = await fs.readFile(ledgerPath, 'utf-8');
33
- const ledger = JSON.parse(ledgerData);
34
-
35
- // API 엔드포인트 추적 로직
36
- const endpoint = `${req.method} ${req.route?.path || req.path}`;
37
- const feature = ledger.features.find((f: any) => f.id === featureId);
38
-
39
- if (feature && !feature.endpoints?.includes(endpoint)) {
40
- feature.endpoints = feature.endpoints || [];
41
- feature.endpoints.push(endpoint);
42
- await fs.writeFile(ledgerPath, JSON.stringify(ledger, null, 2));
43
- }
44
- } catch (error) {
45
- // 에러 무시 (AIWF 기능이 없어도 API는 동작해야 함)
46
- }
47
- }
48
-
49
- next();
50
- };
@@ -1,41 +0,0 @@
1
- import { Request, Response, NextFunction } from 'express';
2
- import jwt from 'jsonwebtoken';
3
-
4
- interface AuthRequest extends Request {
5
- user?: {
6
- id: string;
7
- email: string;
8
- };
9
- }
10
-
11
- export const authMiddleware = (
12
- req: AuthRequest,
13
- res: Response,
14
- next: NextFunction
15
- ) => {
16
- const authHeader = req.headers.authorization;
17
-
18
- if (!authHeader || !authHeader.startsWith('Bearer ')) {
19
- return res.status(401).json({
20
- success: false,
21
- error: { message: 'No token provided' }
22
- });
23
- }
24
-
25
- const token = authHeader.substring(7);
26
-
27
- try {
28
- const decoded = jwt.verify(
29
- token,
30
- process.env.JWT_SECRET || 'secret'
31
- ) as { id: string; email: string };
32
-
33
- req.user = decoded;
34
- next();
35
- } catch (error) {
36
- return res.status(401).json({
37
- success: false,
38
- error: { message: 'Invalid token' }
39
- });
40
- }
41
- };
@@ -1,42 +0,0 @@
1
- import { Request, Response, NextFunction } from 'express';
2
- import logger from '@utils/logger';
3
-
4
- interface CustomError extends Error {
5
- statusCode?: number;
6
- status?: string;
7
- isOperational?: boolean;
8
- }
9
-
10
- export const errorHandler = (
11
- err: CustomError,
12
- req: Request,
13
- res: Response,
14
- next: NextFunction
15
- ) => {
16
- let { statusCode = 500, message } = err;
17
-
18
- logger.error({
19
- error: err,
20
- request: {
21
- method: req.method,
22
- url: req.url,
23
- headers: req.headers,
24
- body: req.body,
25
- },
26
- });
27
-
28
- // Don't leak error details in production
29
- if (process.env.NODE_ENV === 'production' && statusCode === 500) {
30
- message = 'Internal Server Error';
31
- }
32
-
33
- res.status(statusCode).json({
34
- success: false,
35
- error: {
36
- statusCode,
37
- message,
38
- ...(process.env.NODE_ENV === 'development' && { stack: err.stack }),
39
- },
40
- timestamp: new Date().toISOString(),
41
- });
42
- };
@@ -1,14 +0,0 @@
1
- import { Request, Response } from 'express';
2
-
3
- export const notFoundHandler = (req: Request, res: Response) => {
4
- res.status(404).json({
5
- success: false,
6
- error: {
7
- statusCode: 404,
8
- message: 'Resource not found',
9
- path: req.url,
10
- method: req.method,
11
- },
12
- timestamp: new Date().toISOString(),
13
- });
14
- };
@@ -1,20 +0,0 @@
1
- import { Request, Response, NextFunction } from 'express';
2
- import logger from '@utils/logger';
3
-
4
- export const requestLogger = (req: Request, res: Response, next: NextFunction) => {
5
- const start = Date.now();
6
-
7
- res.on('finish', () => {
8
- const duration = Date.now() - start;
9
- logger.info({
10
- method: req.method,
11
- url: req.url,
12
- status: res.statusCode,
13
- duration: `${duration}ms`,
14
- ip: req.ip,
15
- userAgent: req.get('user-agent'),
16
- });
17
- });
18
-
19
- next();
20
- };
@@ -1,31 +0,0 @@
1
- import { Router } from 'express';
2
- import { aiwfController } from '@controllers/aiwfController';
3
-
4
- const router = Router();
5
-
6
-
7
- /**
8
- * @swagger
9
- * /api/aiwf/token-usage:
10
- * get:
11
- * summary: 토큰 사용량 조회
12
- * tags: [AIWF]
13
- * responses:
14
- * 200:
15
- * description: 토큰 사용 현황
16
- */
17
- router.get('/token-usage', aiwfController.getTokenUsage);
18
-
19
- /**
20
- * @swagger
21
- * /api/aiwf/context:
22
- * get:
23
- * summary: Context 상태 조회
24
- * tags: [AIWF]
25
- * responses:
26
- * 200:
27
- * description: Context 압축 상태
28
- */
29
- router.get('/context', aiwfController.getContextStatus);
30
-
31
- export default router;
@@ -1,13 +0,0 @@
1
- import { Router } from 'express';
2
- import v1Routes from './v1';
3
- import aiwfRoutes from './aiwf';
4
-
5
- const router = Router();
6
-
7
- // API 버전 라우팅
8
- router.use('/v1', v1Routes);
9
-
10
- // AIWF 전용 라우트
11
- router.use('/aiwf', aiwfRoutes);
12
-
13
- export default router;
@@ -1,67 +0,0 @@
1
- import { Router } from 'express';
2
- import { statusController } from '@controllers/statusController';
3
- import { authController } from '@controllers/authController';
4
- import { authMiddleware } from '@middleware/authMiddleware';
5
-
6
- const router = Router();
7
-
8
- /**
9
- * @swagger
10
- * /api/v1/status:
11
- * get:
12
- * summary: API 상태 확인
13
- * tags: [Status]
14
- * responses:
15
- * 200:
16
- * description: API 상태 정보
17
- */
18
- router.get('/status', statusController.getStatus);
19
-
20
- /**
21
- * @swagger
22
- * /api/v1/auth/register:
23
- * post:
24
- * summary: 사용자 등록
25
- * tags: [Auth]
26
- * requestBody:
27
- * required: true
28
- * content:
29
- * application/json:
30
- * schema:
31
- * type: object
32
- * properties:
33
- * email:
34
- * type: string
35
- * password:
36
- * type: string
37
- * name:
38
- * type: string
39
- */
40
- router.post('/auth/register', authController.register);
41
-
42
- /**
43
- * @swagger
44
- * /api/v1/auth/login:
45
- * post:
46
- * summary: 사용자 로그인
47
- * tags: [Auth]
48
- * requestBody:
49
- * required: true
50
- * content:
51
- * application/json:
52
- * schema:
53
- * type: object
54
- * properties:
55
- * email:
56
- * type: string
57
- * password:
58
- * type: string
59
- */
60
- router.post('/auth/login', authController.login);
61
-
62
- // Protected routes example
63
- router.get('/protected', authMiddleware, (req, res) => {
64
- res.json({ message: 'This is a protected route' });
65
- });
66
-
67
- export default router;
@@ -1,37 +0,0 @@
1
- import winston from 'winston';
2
-
3
- const logger = winston.createLogger({
4
- level: process.env.LOG_LEVEL || 'info',
5
- format: winston.format.combine(
6
- winston.format.timestamp(),
7
- winston.format.errors({ stack: true }),
8
- winston.format.splat(),
9
- winston.format.json()
10
- ),
11
- defaultMeta: { service: '{{projectName}}' },
12
- transports: [
13
- new winston.transports.Console({
14
- format: winston.format.combine(
15
- winston.format.colorize(),
16
- winston.format.simple()
17
- ),
18
- }),
19
- ],
20
- });
21
-
22
- // Production에서는 파일 로깅 추가
23
- if (process.env.NODE_ENV === 'production') {
24
- logger.add(
25
- new winston.transports.File({
26
- filename: 'logs/error.log',
27
- level: 'error',
28
- })
29
- );
30
- logger.add(
31
- new winston.transports.File({
32
- filename: 'logs/combined.log',
33
- })
34
- );
35
- }
36
-
37
- export default logger;
@@ -1,40 +0,0 @@
1
- import request from 'supertest';
2
- import app from '../src/app';
3
-
4
- describe('App', () => {
5
- describe('GET /health', () => {
6
- it('should return health status', async () => {
7
- const response = await request(app)
8
- .get('/health')
9
- .expect(200);
10
-
11
- expect(response.body).toHaveProperty('status', 'healthy');
12
- expect(response.body).toHaveProperty('timestamp');
13
- expect(response.body).toHaveProperty('uptime');
14
- });
15
- });
16
-
17
- describe('GET /api/v1/status', () => {
18
- it('should return API status', async () => {
19
- const response = await request(app)
20
- .get('/api/v1/status')
21
- .expect(200);
22
-
23
- expect(response.body.success).toBe(true);
24
- expect(response.body.data).toHaveProperty('service');
25
- expect(response.body.data).toHaveProperty('version');
26
- expect(response.body.data).toHaveProperty('aiwf');
27
- });
28
- });
29
-
30
- describe('404 Handler', () => {
31
- it('should return 404 for unknown routes', async () => {
32
- const response = await request(app)
33
- .get('/unknown-route')
34
- .expect(404);
35
-
36
- expect(response.body.success).toBe(false);
37
- expect(response.body.error.statusCode).toBe(404);
38
- });
39
- });
40
- });
@@ -1,43 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "commonjs",
5
- "lib": ["ES2022"],
6
- "outDir": "./dist",
7
- "rootDir": "./src",
8
- "strict": true,
9
- "esModuleInterop": true,
10
- "skipLibCheck": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "resolveJsonModule": true,
13
- "declaration": true,
14
- "declarationMap": true,
15
- "sourceMap": true,
16
- "removeComments": true,
17
- "noImplicitAny": true,
18
- "strictNullChecks": true,
19
- "strictFunctionTypes": true,
20
- "noImplicitThis": true,
21
- "noUnusedLocals": true,
22
- "noUnusedParameters": true,
23
- "noImplicitReturns": true,
24
- "noFallthroughCasesInSwitch": true,
25
- "allowSyntheticDefaultImports": true,
26
- "emitDecoratorMetadata": true,
27
- "experimentalDecorators": true,
28
- "baseUrl": ".",
29
- "paths": {
30
- "@/*": ["src/*"],
31
- "@config/*": ["src/config/*"],
32
- "@controllers/*": ["src/controllers/*"],
33
- "@middleware/*": ["src/middleware/*"],
34
- "@models/*": ["src/models/*"],
35
- "@routes/*": ["src/routes/*"],
36
- "@services/*": ["src/services/*"],
37
- "@utils/*": ["src/utils/*"],
38
- "@types/*": ["src/types/*"]
39
- }
40
- },
41
- "include": ["src/**/*"],
42
- "exclude": ["node_modules", "dist", "tests"]
43
- }