aiag-cli 1.8.0 → 2.1.0

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 (121) hide show
  1. package/README.md +125 -89
  2. package/dist/api/client.d.ts +170 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +513 -0
  5. package/dist/api/client.js.map +1 -0
  6. package/dist/api/endpoints.d.ts +112 -0
  7. package/dist/api/endpoints.d.ts.map +1 -0
  8. package/dist/api/endpoints.js +150 -0
  9. package/dist/api/endpoints.js.map +1 -0
  10. package/dist/api/types.d.ts +395 -0
  11. package/dist/api/types.d.ts.map +1 -0
  12. package/dist/api/types.js +7 -0
  13. package/dist/api/types.js.map +1 -0
  14. package/dist/auth/credentials.d.ts +73 -0
  15. package/dist/auth/credentials.d.ts.map +1 -0
  16. package/dist/auth/credentials.js +150 -0
  17. package/dist/auth/credentials.js.map +1 -0
  18. package/dist/auth/device.d.ts +58 -0
  19. package/dist/auth/device.d.ts.map +1 -0
  20. package/dist/auth/device.js +235 -0
  21. package/dist/auth/device.js.map +1 -0
  22. package/dist/auth/token.d.ts +55 -0
  23. package/dist/auth/token.d.ts.map +1 -0
  24. package/dist/auth/token.js +153 -0
  25. package/dist/auth/token.js.map +1 -0
  26. package/dist/cli.js +51 -1
  27. package/dist/cli.js.map +1 -1
  28. package/dist/commands/auto.d.ts.map +1 -1
  29. package/dist/commands/auto.js +321 -236
  30. package/dist/commands/auto.js.map +1 -1
  31. package/dist/commands/complete.d.ts +1 -0
  32. package/dist/commands/complete.d.ts.map +1 -1
  33. package/dist/commands/complete.js +30 -0
  34. package/dist/commands/complete.js.map +1 -1
  35. package/dist/commands/connect.d.ts +25 -0
  36. package/dist/commands/connect.d.ts.map +1 -0
  37. package/dist/commands/connect.js +305 -0
  38. package/dist/commands/connect.js.map +1 -0
  39. package/dist/commands/login.d.ts +19 -0
  40. package/dist/commands/login.d.ts.map +1 -0
  41. package/dist/commands/login.js +119 -0
  42. package/dist/commands/login.js.map +1 -0
  43. package/dist/commands/logout.d.ts +15 -0
  44. package/dist/commands/logout.d.ts.map +1 -0
  45. package/dist/commands/logout.js +50 -0
  46. package/dist/commands/logout.js.map +1 -0
  47. package/dist/commands/next.d.ts +1 -0
  48. package/dist/commands/next.d.ts.map +1 -1
  49. package/dist/commands/next.js +41 -2
  50. package/dist/commands/next.js.map +1 -1
  51. package/dist/commands/project.d.ts +13 -0
  52. package/dist/commands/project.d.ts.map +1 -0
  53. package/dist/commands/project.js +92 -0
  54. package/dist/commands/project.js.map +1 -0
  55. package/dist/commands/session.d.ts +10 -2
  56. package/dist/commands/session.d.ts.map +1 -1
  57. package/dist/commands/session.js +80 -3
  58. package/dist/commands/session.js.map +1 -1
  59. package/dist/commands/status.d.ts +1 -0
  60. package/dist/commands/status.d.ts.map +1 -1
  61. package/dist/commands/status.js +51 -0
  62. package/dist/commands/status.js.map +1 -1
  63. package/dist/commands/sync.d.ts +33 -0
  64. package/dist/commands/sync.d.ts.map +1 -0
  65. package/dist/commands/sync.js +555 -0
  66. package/dist/commands/sync.js.map +1 -0
  67. package/dist/commands/work.d.ts +1 -0
  68. package/dist/commands/work.d.ts.map +1 -1
  69. package/dist/commands/work.js +22 -1
  70. package/dist/commands/work.js.map +1 -1
  71. package/dist/config/global.d.ts +54 -0
  72. package/dist/config/global.d.ts.map +1 -0
  73. package/dist/config/global.js +110 -0
  74. package/dist/config/global.js.map +1 -0
  75. package/dist/prompts/coding.d.ts +31 -0
  76. package/dist/prompts/coding.d.ts.map +1 -0
  77. package/dist/prompts/coding.js +228 -0
  78. package/dist/prompts/coding.js.map +1 -0
  79. package/dist/prompts/index.d.ts +10 -0
  80. package/dist/prompts/index.d.ts.map +1 -0
  81. package/dist/prompts/index.js +10 -0
  82. package/dist/prompts/index.js.map +1 -0
  83. package/dist/prompts/initializer.d.ts +20 -0
  84. package/dist/prompts/initializer.d.ts.map +1 -0
  85. package/dist/prompts/initializer.js +147 -0
  86. package/dist/prompts/initializer.js.map +1 -0
  87. package/dist/sdk/client.d.ts +67 -0
  88. package/dist/sdk/client.d.ts.map +1 -0
  89. package/dist/sdk/client.js +196 -0
  90. package/dist/sdk/client.js.map +1 -0
  91. package/dist/sdk/index.d.ts +8 -0
  92. package/dist/sdk/index.d.ts.map +1 -0
  93. package/dist/sdk/index.js +8 -0
  94. package/dist/sdk/index.js.map +1 -0
  95. package/dist/sdk/security.d.ts +43 -0
  96. package/dist/sdk/security.d.ts.map +1 -0
  97. package/dist/sdk/security.js +214 -0
  98. package/dist/sdk/security.js.map +1 -0
  99. package/dist/types.d.ts +64 -0
  100. package/dist/types.d.ts.map +1 -1
  101. package/dist/utils/connection.d.ts +126 -0
  102. package/dist/utils/connection.d.ts.map +1 -0
  103. package/dist/utils/connection.js +226 -0
  104. package/dist/utils/connection.js.map +1 -0
  105. package/dist/utils/messages.d.ts +76 -0
  106. package/dist/utils/messages.d.ts.map +1 -1
  107. package/dist/utils/messages.js +87 -1
  108. package/dist/utils/messages.js.map +1 -1
  109. package/dist/utils/output.d.ts +10 -0
  110. package/dist/utils/output.d.ts.map +1 -1
  111. package/dist/utils/output.js +31 -0
  112. package/dist/utils/output.js.map +1 -1
  113. package/dist/utils/prompt.d.ts +10 -0
  114. package/dist/utils/prompt.d.ts.map +1 -0
  115. package/dist/utils/prompt.js +22 -0
  116. package/dist/utils/prompt.js.map +1 -0
  117. package/dist/utils/sseClient.d.ts +183 -0
  118. package/dist/utils/sseClient.d.ts.map +1 -0
  119. package/dist/utils/sseClient.js +391 -0
  120. package/dist/utils/sseClient.js.map +1 -0
  121. package/package.json +3 -2
@@ -0,0 +1,214 @@
1
+ /**
2
+ * 보안 훅 모듈
3
+ *
4
+ * Linear-Coding-Agent-Harness의 security.py를 참조하여 구현
5
+ * - Bash 명령어 허용목록
6
+ * - 위험한 명령어 차단
7
+ * - 파일 시스템 접근 제어
8
+ */
9
+ /**
10
+ * 기본 허용 Bash 명령어 목록
11
+ * Linear-Coding-Agent-Harness의 security.py 참조
12
+ */
13
+ const DEFAULT_ALLOWED_BASH_COMMANDS = [
14
+ // 파일 시스템 탐색
15
+ 'ls', 'pwd', 'cd', 'find', 'tree', 'stat', 'file', 'which', 'whereis',
16
+ // 파일 읽기
17
+ 'cat', 'head', 'tail', 'less', 'more', 'grep', 'awk', 'sed', 'wc',
18
+ // 파일 조작
19
+ 'touch', 'mkdir', 'cp', 'mv', 'rm',
20
+ // Git
21
+ 'git',
22
+ // 패키지 관리
23
+ 'npm', 'npx', 'yarn', 'pnpm', 'bun', 'pip', 'pip3', 'pipx',
24
+ 'poetry', 'cargo', 'go', 'composer',
25
+ // 빌드/테스트
26
+ 'node', 'python', 'python3', 'tsc', 'tsx', 'jest', 'vitest',
27
+ 'pytest', 'make', 'cmake', 'cargo',
28
+ // 유틸리티
29
+ 'echo', 'printf', 'date', 'env', 'export', 'source', 'set',
30
+ 'true', 'false', 'test', '[', '[[',
31
+ // 텍스트 처리
32
+ 'sort', 'uniq', 'cut', 'tr', 'xargs', 'tee', 'diff',
33
+ // 압축
34
+ 'tar', 'gzip', 'gunzip', 'zip', 'unzip',
35
+ // 네트워크 (제한적)
36
+ 'curl', 'wget',
37
+ // JSON 처리
38
+ 'jq',
39
+ ];
40
+ /**
41
+ * 기본 차단 패턴
42
+ */
43
+ const DEFAULT_BLOCKED_PATTERNS = [
44
+ // 시스템 명령
45
+ 'sudo', 'su', 'chmod 777', 'chown',
46
+ // 위험한 삭제
47
+ 'rm -rf /', 'rm -rf ~', 'rm -rf /*',
48
+ // 네트워크 위험
49
+ 'nc ', 'netcat', 'nmap', 'telnet',
50
+ // 시스템 조작
51
+ 'shutdown', 'reboot', 'halt', 'poweroff',
52
+ 'mkfs', 'fdisk', 'dd if=',
53
+ // 환경 변수 유출
54
+ 'printenv', 'env | ',
55
+ // 크론/서비스
56
+ 'crontab', 'systemctl', 'service',
57
+ // SSH/원격
58
+ 'ssh ', 'scp ', 'rsync',
59
+ ];
60
+ /**
61
+ * Bash 명령어의 기본 명령어 추출
62
+ */
63
+ function extractBaseCommand(command) {
64
+ // 파이프, 리다이렉션 이전의 첫 명령어 추출
65
+ const trimmed = command.trim();
66
+ // 환경 변수 설정 건너뛰기 (예: VAR=value command)
67
+ const parts = trimmed.split(/\s+/);
68
+ for (const part of parts) {
69
+ if (!part.includes('=') && part.length > 0) {
70
+ return part;
71
+ }
72
+ }
73
+ return parts[0] || '';
74
+ }
75
+ /**
76
+ * 명령어가 허용 목록에 있는지 확인
77
+ */
78
+ function isCommandAllowed(command, allowedCommands) {
79
+ const baseCommand = extractBaseCommand(command);
80
+ return allowedCommands.includes(baseCommand);
81
+ }
82
+ /**
83
+ * 명령어가 차단 패턴과 일치하는지 확인
84
+ */
85
+ function isCommandBlocked(command, blockedPatterns) {
86
+ const lowerCommand = command.toLowerCase();
87
+ return blockedPatterns.some(pattern => lowerCommand.includes(pattern.toLowerCase()));
88
+ }
89
+ /**
90
+ * 보안 훅 생성
91
+ */
92
+ export function createSecurityHooks(config = {}, onLog) {
93
+ const { allowedBashCommands = DEFAULT_ALLOWED_BASH_COMMANDS, blockedPatterns = DEFAULT_BLOCKED_PATTERNS, enableLogging = true, } = config;
94
+ const preToolUseHook = async (input, _toolUseID, _options) => {
95
+ if (input.hook_event_name !== 'PreToolUse') {
96
+ return { continue: true };
97
+ }
98
+ const toolInput = input;
99
+ const toolName = toolInput.tool_name;
100
+ // Bash 명령어 검증
101
+ if (toolName === 'Bash') {
102
+ const command = toolInput.tool_input?.command || '';
103
+ if (enableLogging) {
104
+ onLog?.(`[SECURITY] Bash 명령어 검증: ${command.substring(0, 100)}...`);
105
+ }
106
+ // 차단 패턴 확인
107
+ if (isCommandBlocked(command, blockedPatterns)) {
108
+ onLog?.(`[SECURITY] 차단됨 (위험 패턴): ${command.substring(0, 50)}...`);
109
+ return {
110
+ continue: false,
111
+ decision: 'block',
112
+ reason: '위험한 명령어 패턴이 감지되었습니다.',
113
+ };
114
+ }
115
+ // 허용 목록 확인
116
+ if (!isCommandAllowed(command, allowedBashCommands)) {
117
+ const baseCommand = extractBaseCommand(command);
118
+ onLog?.(`[SECURITY] 차단됨 (허용 목록 외): ${baseCommand}`);
119
+ return {
120
+ continue: false,
121
+ decision: 'block',
122
+ reason: `'${baseCommand}' 명령어는 허용 목록에 없습니다.`,
123
+ };
124
+ }
125
+ if (enableLogging) {
126
+ onLog?.(`[SECURITY] 허용됨: ${extractBaseCommand(command)}`);
127
+ }
128
+ }
129
+ return { continue: true };
130
+ };
131
+ return {
132
+ PreToolUse: [
133
+ {
134
+ hooks: [preToolUseHook],
135
+ timeout: 5, // 5초 타임아웃
136
+ },
137
+ ],
138
+ };
139
+ }
140
+ /**
141
+ * canUseTool 콜백 생성
142
+ */
143
+ export function createCanUseTool(config = {}, onLog) {
144
+ const { allowedBashCommands = DEFAULT_ALLOWED_BASH_COMMANDS, blockedPatterns = DEFAULT_BLOCKED_PATTERNS, enableLogging = true, } = config;
145
+ return async (toolName, input, _options) => {
146
+ // Bash 명령어 특별 처리
147
+ if (toolName === 'Bash') {
148
+ const command = input.command || '';
149
+ // 차단 패턴 확인
150
+ if (isCommandBlocked(command, blockedPatterns)) {
151
+ if (enableLogging) {
152
+ onLog?.(`[SECURITY] canUseTool 차단: 위험 패턴 - ${command.substring(0, 50)}...`);
153
+ }
154
+ return {
155
+ behavior: 'deny',
156
+ message: '위험한 명령어 패턴이 감지되어 실행을 차단합니다.',
157
+ };
158
+ }
159
+ // 허용 목록 확인 (strict 모드에서만)
160
+ // 기본적으로는 bypassPermissions 모드이므로 여기서는 경고만
161
+ if (!isCommandAllowed(command, allowedBashCommands)) {
162
+ const baseCommand = extractBaseCommand(command);
163
+ if (enableLogging) {
164
+ onLog?.(`[SECURITY] canUseTool 경고: 비허용 명령어 - ${baseCommand}`);
165
+ }
166
+ // 허용은 하지만 로그 남김
167
+ }
168
+ }
169
+ // 기본적으로 허용
170
+ return {
171
+ behavior: 'allow',
172
+ updatedInput: input,
173
+ };
174
+ };
175
+ }
176
+ /**
177
+ * 보안 설정 프리셋: 개발 모드 (느슨한 보안)
178
+ */
179
+ export const SECURITY_PRESET_DEVELOPMENT = {
180
+ allowedBashCommands: [
181
+ ...DEFAULT_ALLOWED_BASH_COMMANDS,
182
+ // 개발 추가 명령어
183
+ 'docker', 'docker-compose',
184
+ 'kubectl', 'helm',
185
+ 'aws', 'gcloud', 'az',
186
+ ],
187
+ blockedPatterns: DEFAULT_BLOCKED_PATTERNS,
188
+ enableLogging: true,
189
+ };
190
+ /**
191
+ * 보안 설정 프리셋: 프로덕션 모드 (엄격한 보안)
192
+ */
193
+ export const SECURITY_PRESET_PRODUCTION = {
194
+ allowedBashCommands: [
195
+ // 최소한의 명령어만 허용
196
+ 'ls', 'pwd', 'cat', 'head', 'tail', 'grep', 'wc',
197
+ 'git', 'npm', 'node', 'tsc', 'jest', 'vitest',
198
+ ],
199
+ blockedPatterns: [
200
+ ...DEFAULT_BLOCKED_PATTERNS,
201
+ // 추가 차단
202
+ 'curl', 'wget', 'docker', 'kubectl',
203
+ ],
204
+ enableLogging: true,
205
+ };
206
+ /**
207
+ * 보안 설정 프리셋: 테스트 모드 (로깅 활성화)
208
+ */
209
+ export const SECURITY_PRESET_TEST = {
210
+ allowedBashCommands: DEFAULT_ALLOWED_BASH_COMMANDS,
211
+ blockedPatterns: DEFAULT_BLOCKED_PATTERNS,
212
+ enableLogging: true,
213
+ };
214
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/sdk/security.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -50,4 +50,68 @@ export interface SessionLog {
50
50
  notes: string[];
51
51
  }
52
52
  export declare const PRIORITY_ORDER: Record<FeaturePriority, number>;
53
+ /**
54
+ * 사용자 인증 정보 (저장용)
55
+ * 저장 위치: ~/.aiag/credentials
56
+ */
57
+ export interface Credentials {
58
+ serverUrl: string;
59
+ accessToken: string;
60
+ refreshToken?: string;
61
+ expiresAt: string;
62
+ userId: string;
63
+ email: string;
64
+ }
65
+ /**
66
+ * 글로벌 설정
67
+ * 저장 위치: ~/.aiag/config.json
68
+ */
69
+ export interface GlobalConfig {
70
+ defaultServer?: string;
71
+ autoSync: boolean;
72
+ syncInterval: number;
73
+ }
74
+ /**
75
+ * 디바이스 인증 요청 응답
76
+ */
77
+ export interface DeviceCodeResponse {
78
+ deviceCode: string;
79
+ userCode: string;
80
+ verificationUri: string;
81
+ expiresIn: number;
82
+ interval: number;
83
+ }
84
+ /**
85
+ * 디바이스 인증 토큰 응답
86
+ */
87
+ export interface DeviceTokenResponse {
88
+ accessToken: string;
89
+ refreshToken?: string;
90
+ expiresIn: number;
91
+ userId: string;
92
+ email: string;
93
+ }
94
+ /**
95
+ * 디바이스 인증 폴링 상태
96
+ */
97
+ export type DevicePollStatus = 'pending' | 'authorized' | 'expired' | 'denied';
98
+ /**
99
+ * 프로젝트 연결 정보
100
+ * 저장 위치: .aiag/connection.json
101
+ */
102
+ export interface ProjectConnection {
103
+ serverUrl: string;
104
+ projectId: string;
105
+ projectName: string;
106
+ connectedAt: string;
107
+ lastSyncAt: string;
108
+ }
109
+ /**
110
+ * API 에러 응답
111
+ */
112
+ export interface ApiError {
113
+ code: string;
114
+ message: string;
115
+ details?: Record<string, unknown>;
116
+ }
53
117
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,KAAK,GACL,KAAK,GACL,IAAI,GACJ,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAGD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAK1D,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * 프로젝트 연결 정보 관리 모듈
3
+ *
4
+ * .aiag/connection.json 파일 관리
5
+ *
6
+ * 저장 형식 (JSON):
7
+ * {
8
+ * "serverUrl": "https://aiag-adp.example.com",
9
+ * "projectId": "abc123",
10
+ * "projectName": "My Project",
11
+ * "connectedAt": "2025-12-21T10:00:00Z",
12
+ * "lastSyncAt": "2025-12-21T10:00:00Z"
13
+ * }
14
+ */
15
+ import type { ProjectConnection } from '../types.js';
16
+ /**
17
+ * .aiag 디렉토리 경로 반환
18
+ * @param basePath 프로젝트 루트 경로 (기본: 현재 디렉토리)
19
+ */
20
+ export declare function getAiagDir(basePath?: string): string;
21
+ /**
22
+ * connection.json 파일 경로 반환
23
+ */
24
+ export declare function getConnectionPath(basePath?: string): string;
25
+ /**
26
+ * 프로젝트가 초기화되어 있는지 확인
27
+ */
28
+ export declare function isProjectInitialized(basePath?: string): boolean;
29
+ /**
30
+ * 저장된 연결 정보 로드
31
+ * @returns ProjectConnection 또는 null (없거나 유효하지 않은 경우)
32
+ */
33
+ export declare function loadConnection(basePath?: string): ProjectConnection | null;
34
+ /**
35
+ * 연결 정보 저장
36
+ */
37
+ export declare function saveConnection(connection: ProjectConnection, basePath?: string): void;
38
+ /**
39
+ * 연결 정보 삭제
40
+ */
41
+ export declare function clearConnection(basePath?: string): void;
42
+ /**
43
+ * 연결 여부 확인
44
+ */
45
+ export declare function isConnected(basePath?: string): boolean;
46
+ /**
47
+ * lastSyncAt 업데이트
48
+ */
49
+ export declare function updateLastSyncAt(basePath?: string): boolean;
50
+ /**
51
+ * 연결 상태 요약 반환
52
+ */
53
+ export declare function getConnectionStatus(basePath?: string): {
54
+ connected: boolean;
55
+ serverUrl?: string;
56
+ projectId?: string;
57
+ projectName?: string;
58
+ lastSyncAt?: string;
59
+ };
60
+ /**
61
+ * 연결 정보 부분 업데이트
62
+ */
63
+ export declare function updateConnection(updates: Partial<ProjectConnection>, basePath?: string): boolean;
64
+ /**
65
+ * 현재 세션 정보
66
+ */
67
+ export interface CurrentSession {
68
+ id: string;
69
+ projectId: string;
70
+ startedAt: string;
71
+ agentType: 'cli' | 'night-agent';
72
+ }
73
+ /**
74
+ * current_session.json 파일 경로 반환
75
+ */
76
+ export declare function getCurrentSessionPath(basePath?: string): string;
77
+ /**
78
+ * 현재 세션 정보 로드
79
+ */
80
+ export declare function loadCurrentSession(basePath?: string): CurrentSession | null;
81
+ /**
82
+ * 현재 세션 정보 저장
83
+ */
84
+ export declare function saveCurrentSession(session: CurrentSession, basePath?: string): void;
85
+ /**
86
+ * 현재 세션 정보 삭제
87
+ */
88
+ export declare function clearCurrentSession(basePath?: string): void;
89
+ /**
90
+ * 미동기화 항목
91
+ */
92
+ export interface PendingSyncItem {
93
+ featureId: string;
94
+ action: 'create' | 'update' | 'complete';
95
+ timestamp: string;
96
+ data?: Record<string, unknown>;
97
+ }
98
+ /**
99
+ * pending_sync.json 파일 경로 반환
100
+ */
101
+ export declare function getPendingSyncPath(basePath?: string): string;
102
+ /**
103
+ * 미동기화 항목 로드
104
+ */
105
+ export declare function loadPendingSync(basePath?: string): PendingSyncItem[];
106
+ /**
107
+ * 미동기화 항목 저장
108
+ */
109
+ export declare function savePendingSync(items: PendingSyncItem[], basePath?: string): void;
110
+ /**
111
+ * 미동기화 항목 추가
112
+ */
113
+ export declare function addPendingSync(item: PendingSyncItem, basePath?: string): void;
114
+ /**
115
+ * 미동기화 항목 제거
116
+ */
117
+ export declare function removePendingSync(featureId: string, basePath?: string): void;
118
+ /**
119
+ * 모든 미동기화 항목 삭제
120
+ */
121
+ export declare function clearPendingSync(basePath?: string): void;
122
+ /**
123
+ * 미동기화 항목 개수 반환
124
+ */
125
+ export declare function getPendingSyncCount(basePath?: string): number;
126
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * 프로젝트 연결 정보 관리 모듈
3
+ *
4
+ * .aiag/connection.json 파일 관리
5
+ *
6
+ * 저장 형식 (JSON):
7
+ * {
8
+ * "serverUrl": "https://aiag-adp.example.com",
9
+ * "projectId": "abc123",
10
+ * "projectName": "My Project",
11
+ * "connectedAt": "2025-12-21T10:00:00Z",
12
+ * "lastSyncAt": "2025-12-21T10:00:00Z"
13
+ * }
14
+ */
15
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
16
+ import { join } from 'path';
17
+ /**
18
+ * .aiag 디렉토리 경로 반환
19
+ * @param basePath 프로젝트 루트 경로 (기본: 현재 디렉토리)
20
+ */
21
+ export function getAiagDir(basePath = process.cwd()) {
22
+ return join(basePath, '.aiag');
23
+ }
24
+ /**
25
+ * connection.json 파일 경로 반환
26
+ */
27
+ export function getConnectionPath(basePath = process.cwd()) {
28
+ return join(getAiagDir(basePath), 'connection.json');
29
+ }
30
+ /**
31
+ * 프로젝트가 초기화되어 있는지 확인
32
+ */
33
+ export function isProjectInitialized(basePath = process.cwd()) {
34
+ return existsSync(getAiagDir(basePath));
35
+ }
36
+ /**
37
+ * 저장된 연결 정보 로드
38
+ * @returns ProjectConnection 또는 null (없거나 유효하지 않은 경우)
39
+ */
40
+ export function loadConnection(basePath = process.cwd()) {
41
+ const connectionPath = getConnectionPath(basePath);
42
+ if (!existsSync(connectionPath)) {
43
+ return null;
44
+ }
45
+ try {
46
+ const content = readFileSync(connectionPath, 'utf-8');
47
+ const connection = JSON.parse(content);
48
+ // 필수 필드 검증
49
+ if (!connection.serverUrl ||
50
+ !connection.projectId ||
51
+ !connection.projectName ||
52
+ !connection.connectedAt) {
53
+ return null;
54
+ }
55
+ return connection;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * 연결 정보 저장
63
+ */
64
+ export function saveConnection(connection, basePath = process.cwd()) {
65
+ const connectionPath = getConnectionPath(basePath);
66
+ writeFileSync(connectionPath, JSON.stringify(connection, null, 2), 'utf-8');
67
+ }
68
+ /**
69
+ * 연결 정보 삭제
70
+ */
71
+ export function clearConnection(basePath = process.cwd()) {
72
+ const connectionPath = getConnectionPath(basePath);
73
+ if (existsSync(connectionPath)) {
74
+ unlinkSync(connectionPath);
75
+ }
76
+ }
77
+ /**
78
+ * 연결 여부 확인
79
+ */
80
+ export function isConnected(basePath = process.cwd()) {
81
+ return loadConnection(basePath) !== null;
82
+ }
83
+ /**
84
+ * lastSyncAt 업데이트
85
+ */
86
+ export function updateLastSyncAt(basePath = process.cwd()) {
87
+ const connection = loadConnection(basePath);
88
+ if (!connection) {
89
+ return false;
90
+ }
91
+ connection.lastSyncAt = new Date().toISOString();
92
+ saveConnection(connection, basePath);
93
+ return true;
94
+ }
95
+ /**
96
+ * 연결 상태 요약 반환
97
+ */
98
+ export function getConnectionStatus(basePath = process.cwd()) {
99
+ const connection = loadConnection(basePath);
100
+ if (!connection) {
101
+ return { connected: false };
102
+ }
103
+ return {
104
+ connected: true,
105
+ serverUrl: connection.serverUrl,
106
+ projectId: connection.projectId,
107
+ projectName: connection.projectName,
108
+ lastSyncAt: connection.lastSyncAt,
109
+ };
110
+ }
111
+ /**
112
+ * 연결 정보 부분 업데이트
113
+ */
114
+ export function updateConnection(updates, basePath = process.cwd()) {
115
+ const connection = loadConnection(basePath);
116
+ if (!connection) {
117
+ return false;
118
+ }
119
+ const updated = {
120
+ ...connection,
121
+ ...updates,
122
+ };
123
+ saveConnection(updated, basePath);
124
+ return true;
125
+ }
126
+ /**
127
+ * current_session.json 파일 경로 반환
128
+ */
129
+ export function getCurrentSessionPath(basePath = process.cwd()) {
130
+ return join(getAiagDir(basePath), 'current_session.json');
131
+ }
132
+ /**
133
+ * 현재 세션 정보 로드
134
+ */
135
+ export function loadCurrentSession(basePath = process.cwd()) {
136
+ const sessionPath = getCurrentSessionPath(basePath);
137
+ if (!existsSync(sessionPath)) {
138
+ return null;
139
+ }
140
+ try {
141
+ const content = readFileSync(sessionPath, 'utf-8');
142
+ return JSON.parse(content);
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ /**
149
+ * 현재 세션 정보 저장
150
+ */
151
+ export function saveCurrentSession(session, basePath = process.cwd()) {
152
+ const sessionPath = getCurrentSessionPath(basePath);
153
+ writeFileSync(sessionPath, JSON.stringify(session, null, 2), 'utf-8');
154
+ }
155
+ /**
156
+ * 현재 세션 정보 삭제
157
+ */
158
+ export function clearCurrentSession(basePath = process.cwd()) {
159
+ const sessionPath = getCurrentSessionPath(basePath);
160
+ if (existsSync(sessionPath)) {
161
+ unlinkSync(sessionPath);
162
+ }
163
+ }
164
+ /**
165
+ * pending_sync.json 파일 경로 반환
166
+ */
167
+ export function getPendingSyncPath(basePath = process.cwd()) {
168
+ return join(getAiagDir(basePath), 'pending_sync.json');
169
+ }
170
+ /**
171
+ * 미동기화 항목 로드
172
+ */
173
+ export function loadPendingSync(basePath = process.cwd()) {
174
+ const syncPath = getPendingSyncPath(basePath);
175
+ if (!existsSync(syncPath)) {
176
+ return [];
177
+ }
178
+ try {
179
+ const content = readFileSync(syncPath, 'utf-8');
180
+ return JSON.parse(content);
181
+ }
182
+ catch {
183
+ return [];
184
+ }
185
+ }
186
+ /**
187
+ * 미동기화 항목 저장
188
+ */
189
+ export function savePendingSync(items, basePath = process.cwd()) {
190
+ const syncPath = getPendingSyncPath(basePath);
191
+ writeFileSync(syncPath, JSON.stringify(items, null, 2), 'utf-8');
192
+ }
193
+ /**
194
+ * 미동기화 항목 추가
195
+ */
196
+ export function addPendingSync(item, basePath = process.cwd()) {
197
+ const items = loadPendingSync(basePath);
198
+ // 같은 featureId의 기존 항목 제거 (최신 액션으로 대체)
199
+ const filtered = items.filter((i) => i.featureId !== item.featureId);
200
+ filtered.push(item);
201
+ savePendingSync(filtered, basePath);
202
+ }
203
+ /**
204
+ * 미동기화 항목 제거
205
+ */
206
+ export function removePendingSync(featureId, basePath = process.cwd()) {
207
+ const items = loadPendingSync(basePath);
208
+ const filtered = items.filter((i) => i.featureId !== featureId);
209
+ savePendingSync(filtered, basePath);
210
+ }
211
+ /**
212
+ * 모든 미동기화 항목 삭제
213
+ */
214
+ export function clearPendingSync(basePath = process.cwd()) {
215
+ const syncPath = getPendingSyncPath(basePath);
216
+ if (existsSync(syncPath)) {
217
+ unlinkSync(syncPath);
218
+ }
219
+ }
220
+ /**
221
+ * 미동기화 항목 개수 반환
222
+ */
223
+ export function getPendingSyncCount(basePath = process.cwd()) {
224
+ return loadPendingSync(basePath).length;
225
+ }
226
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"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"}