commit-ai-agent 1.0.8 → 2.0.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.
package/.env.example CHANGED
@@ -1,4 +1,2 @@
1
1
  GEMINI_API_KEY=your_gemini_api_key_here
2
2
  PORT=3000
3
- # Optional: 미설정 시 실행 디렉토리(process.cwd())를 자동 사용
4
- # DEV_ROOT=C:/dev
package/README.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  AI가 git 커밋과 현재 변경사항을 한국어로 자동 분석해주는 개발자 도구입니다.
4
4
 
5
+ ---
6
+
7
+ ## CLI AI와 무엇이 다른가요?
8
+
9
+ Claude Code나 Codex 같은 CLI AI가 있는데 왜 commit-ai-agent를 써야 할까요?
10
+
11
+ | 기능 | CLI AI (Claude Code / Codex) | commit-ai-agent |
12
+ | ---- | :--------------------------: | :-------------: |
13
+ | 커밋 분석 | 수동 명령어 입력 필요 | **자동** (git commit 직후 백그라운드 실행) |
14
+ | 분석 범위 | 현재 세션 단일 프로젝트 | 현재 프로젝트 자동 분석 |
15
+ | 상시 실행 | 세션 종료 시 중단 | **데몬 서버** — 항상 켜져 있음 |
16
+ | Secret 탐지 | 없음 | **pre-push 훅** — push 전 자격증명 자동 차단 |
17
+ | 오프라인 큐 | 없음 | 서버 꺼진 동안 커밋 → 재시작 시 **자동 처리** |
18
+ | 분석 UI | 터미널 텍스트 | **브라우저 GUI** — 검색·필터·저장 |
19
+ | AI 비용 | 구독료 or API 종량제 | Google Gemini **무료 티어** 지원 |
20
+ | 개인화 | 없음 | 프로젝트별 리포트를 `reports/`에 **자동 저장** |
21
+
22
+ > commit-ai-agent의 핵심 가치: **"커밋하면 알아서 분석된다"** — 개발자는 코드에만 집중하세요.
23
+
24
+ ---
25
+
5
26
  ## 요구 사항
6
27
 
7
28
  - [Node.js](https://nodejs.org) 18 이상
@@ -14,7 +35,7 @@ AI가 git 커밋과 현재 변경사항을 한국어로 자동 분석해주는
14
35
 
15
36
  ### 방법 A — npx (설치 없이 바로 실행)
16
37
 
17
- - 프로젝트가 모여있는 디렉토리 or 프로젝트 루트에서 명령어 실행
38
+ - 프로젝트 루트에서 명령어 실행
18
39
  - 해당 디렉토리에서 .env 파일 생성(.env.example 참고)
19
40
 
20
41
  ```bash
@@ -24,7 +45,7 @@ npx commit-ai-agent
24
45
  ### 방법 B — 전역 설치 후 명령어로 실행
25
46
 
26
47
  - 전역으로 설치하면 어느 위치에서든 `commit-ai-agent` 명령어로 실행 가능
27
- - 프로젝트가 모여있는 디렉토리 or 프로젝트 루트에서 명령어 실행
48
+ - 프로젝트 루트에서 명령어 실행
28
49
  - 해당 디렉토리에서 .env 파일 생성(.env.example 참고)
29
50
 
30
51
  ```bash
@@ -34,8 +55,6 @@ commit-ai-agent
34
55
 
35
56
  ### 방법 C — 직접 클론
36
57
 
37
- 프로젝트가 모여있는 디렉토리에 클론한 후, 해당 디렉토리에서 명령어 실행
38
-
39
58
  ```bash
40
59
  git clone https://github.com/cjy3458/commit-ai-agent.git
41
60
  cd commit-ai-agent
@@ -83,13 +102,103 @@ DEV_ROOT=C:/Users/projects => 선택 사항(미설정 시 현재 실행 디렉
83
102
 
84
103
  ---
85
104
 
105
+ ## 새 기능 사용법
106
+
107
+ ### Git Hook 자동화 — 커밋 후 자동 분석
108
+
109
+ 서버가 실행 중인 상태에서 git hook을 설치하면, `git commit` 직후 자동으로 분석이 시작됩니다.
110
+
111
+ > hook은 **현재 디렉토리(CWD)** 프로젝트에만 설치됩니다. hook을 설치할 프로젝트 안에서 명령어를 실행하세요.
112
+
113
+ #### 1. Hook 설치
114
+
115
+ ```bash
116
+ # 현재 디렉토리 프로젝트에 설치
117
+ commit-ai-agent hook install
118
+ ```
119
+
120
+ #### 2. Hook 상태 확인
121
+
122
+ ```bash
123
+ commit-ai-agent hook status
124
+ ```
125
+
126
+ ```
127
+ 훅 설치 상태:
128
+ ──────────────────────────────────────────────────
129
+ my-app post-commit: ✅ pre-push: ✅
130
+ ```
131
+
132
+ #### 3. Hook 제거
133
+
134
+ ```bash
135
+ commit-ai-agent hook remove
136
+ ```
137
+
138
+ #### 4. 동작 방식
139
+
140
+ ```
141
+ git commit
142
+
143
+ post-commit hook 실행
144
+ ├── 서버가 켜져 있음 → 즉시 분석 시작 (브라우저 UI에서 확인)
145
+ └── 서버가 꺼져 있음 → 조용히 종료 (분석 생략)
146
+ ```
147
+
148
+ > Hook은 기존 `.git/hooks/post-commit`이 있어도 안전하게 추가됩니다 (기존 내용 유지).
149
+
150
+ ---
151
+
152
+ ### Secret 유출 탐지 — push 전 자동 차단
153
+
154
+ `pre-push` hook이 설치되어 있으면 `git push` 전에 변경 파일을 자동 스캔합니다.
155
+ 실제 자격증명이 감지되면 push가 차단되고 위치와 유형을 알려줍니다.
156
+
157
+ #### 탐지 패턴
158
+
159
+ | 유형 | 심각도 |
160
+ | ---- | ------ |
161
+ | AWS Access Key (`AKIA...`) | Critical |
162
+ | Google API Key (`AIza...`) | Critical |
163
+ | GitHub Personal Token (`ghp_...`) | Critical |
164
+ | Slack Token (`xox...`) | Critical |
165
+ | Stripe Secret Key (`sk_live_...`) | Critical |
166
+ | JWT Token | High |
167
+ | Private Key PEM | Critical |
168
+ | 패스워드 직접 할당 | Medium |
169
+ | API Key 직접 할당 | Medium |
170
+
171
+ #### 차단 메시지 예시
172
+
173
+ ```
174
+ ╔══════════════════════════════════════════════════════╗
175
+ ║ ⛔ commit-ai-agent: SECRET DETECTED ║
176
+ ╚══════════════════════════════════════════════════════╝
177
+
178
+ push가 차단됐습니다. 아래 항목을 확인하세요:
179
+
180
+ 1. 파일: src/config.js:12 [CRITICAL]
181
+ 유형: Google API Key
182
+ 값: AIza****y8Xw
183
+ ```
184
+
185
+ #### 오탐(false positive)인 경우 우회
186
+
187
+ ```bash
188
+ SKIP_SECRET_SCAN=1 git push
189
+ ```
190
+
191
+ > Gemini API 키가 설정되어 있으면 AI가 오탐 여부를 자동으로 검증하여 불필요한 차단을 줄입니다.
192
+
193
+ ---
194
+
86
195
  ## 문제 해결
87
196
 
88
197
  **429 오류 (할당량 초과)**
89
198
  → Gemini 무료 티어 한도 도달. 잠시 후 재시도하거나 [유료 플랜](https://ai.google.dev)으로 업그레이드하세요.
90
199
 
91
200
  **프로젝트 목록이 안 뜸**
92
- → 기본값은 실행 디렉토리입니다. 필요 시 `DEV_ROOT`를 git 저장소가 모인 상위 폴더로 지정하세요.
201
+ → 기본값은 실행 디렉토리입니다. `DEV_ROOT` 환경변수로 프로젝트 경로를 직접 지정할 수 있습니다.
93
202
 
94
203
  **`[DEP0190] DeprecationWarning` 경고 (Node.js 22+)**
95
204
  → `shell: true` 옵션과 args 배열을 함께 전달할 때 Node.js 22 이상에서 발생하는 보안 경고입니다. v1.0.7 이상으로 업데이트하면 해결됩니다.
@@ -142,24 +251,31 @@ git checkout -b feat/my-feature
142
251
  ## 프로젝트 구조
143
252
 
144
253
  ```
145
- commit-analyzer/
254
+ commit-ai-agent/
146
255
  ├── bin/
147
- │ └── cli.js # CLI 진입점 (npx / npm install -g)
256
+ │ └── cli.js # CLI 진입점 (npx / npm install -g)
148
257
  ├── src/
149
- │ ├── server.js # Express 서버 · API 라우트 · SSE 스트리밍
150
- │ ├── analyzer.js # Gemini AI 분석 프롬프트 · 재시도 로직
151
- └── git.js # simple-git 래퍼 (커밋 조회, status diff)
152
- ├── public/ # 프론트엔드 정적 파일 (HTML · CSS · JS)
153
- ├── .env.example # 환경변수 예시
258
+ │ ├── server.js # Express 서버 · API 라우트 · SSE 스트리밍
259
+ │ ├── analyzer.js # Gemini AI 분석 프롬프트 · 재시도 로직
260
+ ├── git.js # simple-git 래퍼 (커밋 조회, status diff)
261
+ │ └── hooks/
262
+ ├── installer.js # git hook 설치·제거·상태 확인
263
+ │ ├── post-commit.js # post-commit 훅 스크립트 (자동 분석 트리거)
264
+ │ └── pre-push.js # pre-push 훅 스크립트 (Secret 탐지)
265
+ ├── public/ # 프론트엔드 정적 파일 (HTML · CSS · JS)
266
+ ├── .env.example # 환경변수 예시
154
267
  └── package.json
155
268
  ```
156
269
 
157
- | 파일 | 역할 |
158
- | ----------------- | ----------------------------------------------------- |
159
- | `bin/cli.js` | npx 실행 .env 로드, 브라우저 자동 오픈, 서버 시작 |
160
- | `src/server.js` | REST API + SSE 엔드포인트, 리포트 저장 |
161
- | `src/analyzer.js` | Gemini API 호출, 모델 폴백(2.5→2.0→lite), 지수 백오프 |
162
- | `src/git.js` | 프로젝트 목록 탐색, 커밋 diff, working status diff |
270
+ | 파일 | 역할 |
271
+ | ------------------------- | ------------------------------------------------------------- |
272
+ | `bin/cli.js` | npx 실행, hook 서브커맨드 (install / remove / status) |
273
+ | `src/server.js` | REST API + SSE 엔드포인트, 리포트 저장 |
274
+ | `src/analyzer.js` | Gemini API 호출, 모델 폴백(2.5→2.0→lite), 지수 백오프 |
275
+ | `src/git.js` | 프로젝트 목록 탐색, 커밋 diff, working status diff |
276
+ | `src/hooks/installer.js` | git hook 스크립트 설치·제거 (기존 hook 보존) |
277
+ | `src/hooks/post-commit.js`| 커밋 직후 서버 알림 (서버 없으면 조용히 종료) |
278
+ | `src/hooks/pre-push.js` | push 전 15가지 패턴으로 Secret 스캔, Gemini AI 오탐 필터링 |
163
279
 
164
280
  ---
165
281
 
package/bin/cli.js CHANGED
@@ -2,6 +2,12 @@
2
2
  /**
3
3
  * commit-ai-agent CLI 진입점
4
4
  * npx commit-ai-agent 또는 npm install -g 후 commit-ai-agent 명령으로 실행
5
+ *
6
+ * 서브커맨드:
7
+ * (없음) 웹 UI 서버 실행
8
+ * hook install 현재 디렉토리에 git hook 설치
9
+ * hook remove git hook 제거
10
+ * hook status git hook 설치 상태 확인
5
11
  */
6
12
  import dotenv from "dotenv";
7
13
  import path from "path";
@@ -11,10 +17,100 @@ import { spawn } from "child_process";
11
17
  // 사용자 현재 디렉토리의 .env 로드
12
18
  dotenv.config({ path: path.resolve(process.cwd(), ".env") });
13
19
 
14
- // 패키지 루트 경로를 환경변수로 전달 (server.js가 public/ 위치를 찾기 위함)
15
20
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
21
+ // 패키지 루트 경로를 환경변수로 전달 (server.js가 public/ 위치를 찾기 위함)
16
22
  process.env.COMMIT_ANALYZER_ROOT = path.resolve(__dirname, "..");
17
23
 
24
+ const [, , subCmd, ...subArgs] = process.argv;
25
+
26
+ // ──────────────────────────────────────────────
27
+ // hook 서브커맨드
28
+ // ──────────────────────────────────────────────
29
+ if (subCmd === "hook") {
30
+ const action = subArgs[0]; // install | remove | status
31
+ const { installHooks, removeHooks, getHookStatus } = await import(
32
+ "../src/hooks/installer.js"
33
+ );
34
+
35
+ function resolveTargets() {
36
+ return [process.cwd()];
37
+ }
38
+
39
+ if (action === "install") {
40
+ const targets = await resolveTargets();
41
+ console.log("");
42
+ for (const target of targets) {
43
+ try {
44
+ const installed = await installHooks(target);
45
+ console.log(
46
+ ` ✅ 설치됨: ${path.basename(target)} (${installed.join(", ")})`
47
+ );
48
+ } catch (err) {
49
+ console.error(` ❌ 실패: ${path.basename(target)} — ${err.message}`);
50
+ }
51
+ }
52
+ console.log("");
53
+ console.log(" 이제 커밋할 때마다 자동으로 분석됩니다.");
54
+ console.log(" push 전에 secret 유출도 자동으로 검사됩니다.");
55
+ console.log("");
56
+ process.exit(0);
57
+ }
58
+
59
+ if (action === "remove") {
60
+ const targets = await resolveTargets();
61
+ console.log("");
62
+ for (const target of targets) {
63
+ try {
64
+ const removed = await removeHooks(target);
65
+ if (removed.length > 0) {
66
+ console.log(
67
+ ` ✅ 제거됨: ${path.basename(target)} (${removed.join(", ")})`
68
+ );
69
+ } else {
70
+ console.log(` ℹ️ 훅 없음: ${path.basename(target)}`);
71
+ }
72
+ } catch (err) {
73
+ console.error(` ❌ 실패: ${path.basename(target)} — ${err.message}`);
74
+ }
75
+ }
76
+ console.log("");
77
+ process.exit(0);
78
+ }
79
+
80
+ if (action === "status") {
81
+ const targets = await resolveTargets();
82
+ console.log("");
83
+ console.log(" 훅 설치 상태:");
84
+ console.log(" " + "─".repeat(50));
85
+ for (const target of targets) {
86
+ try {
87
+ const status = await getHookStatus(target);
88
+ const pc = status.postCommit.installed ? "✅" : "❌";
89
+ const pp = status.prePush.installed ? "✅" : "❌";
90
+ console.log(
91
+ ` ${path.basename(target).padEnd(24)} post-commit: ${pc} pre-push: ${pp}`
92
+ );
93
+ } catch (err) {
94
+ console.error(` ❌ 오류: ${path.basename(target)} — ${err.message}`);
95
+ }
96
+ }
97
+ console.log("");
98
+ process.exit(0);
99
+ }
100
+
101
+ // 알 수 없는 action
102
+ console.log("");
103
+ console.log(" 사용법:");
104
+ console.log(" commit-ai-agent hook install # 현재 디렉토리에 훅 설치");
105
+ console.log(" commit-ai-agent hook remove # 훅 제거");
106
+ console.log(" commit-ai-agent hook status # 상태 확인");
107
+ console.log("");
108
+ process.exit(1);
109
+ }
110
+
111
+ // ──────────────────────────────────────────────
112
+ // 기본 동작: 웹 UI 서버 실행
113
+ // ──────────────────────────────────────────────
18
114
  const PORT = process.env.PORT || 3000;
19
115
 
20
116
  console.log("");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commit-ai-agent",
3
- "version": "1.0.8",
3
+ "version": "2.0.0",
4
4
  "description": "AI-powered git commit & working status analyzer with web UI",
5
5
  "type": "module",
6
6
  "main": "src/server.js",