vibescan-cli 0.1.0__tar.gz

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 (59) hide show
  1. vibescan_cli-0.1.0/.claude/settings.local.json +18 -0
  2. vibescan_cli-0.1.0/.gitignore +40 -0
  3. vibescan_cli-0.1.0/PKG-INFO +220 -0
  4. vibescan_cli-0.1.0/README.md +196 -0
  5. vibescan_cli-0.1.0/docs/ARCHITECTURE.md +271 -0
  6. vibescan_cli-0.1.0/docs/DIRECTORY_STRUCTURE.md +124 -0
  7. vibescan_cli-0.1.0/docs/PRD.md +384 -0
  8. vibescan_cli-0.1.0/pyproject.toml +45 -0
  9. vibescan_cli-0.1.0/src/vibescan/__init__.py +3 -0
  10. vibescan_cli-0.1.0/src/vibescan/__main__.py +5 -0
  11. vibescan_cli-0.1.0/src/vibescan/aggregator/__init__.py +0 -0
  12. vibescan_cli-0.1.0/src/vibescan/cli.py +85 -0
  13. vibescan_cli-0.1.0/src/vibescan/collector/__init__.py +4 -0
  14. vibescan_cli-0.1.0/src/vibescan/collector/context.py +19 -0
  15. vibescan_cli-0.1.0/src/vibescan/collector/file_collector.py +90 -0
  16. vibescan_cli-0.1.0/src/vibescan/collector/gitignore_parser.py +24 -0
  17. vibescan_cli-0.1.0/src/vibescan/models/__init__.py +4 -0
  18. vibescan_cli-0.1.0/src/vibescan/models/issue.py +45 -0
  19. vibescan_cli-0.1.0/src/vibescan/models/scan_result.py +27 -0
  20. vibescan_cli-0.1.0/src/vibescan/reporters/__init__.py +0 -0
  21. vibescan_cli-0.1.0/src/vibescan/reporters/console.py +89 -0
  22. vibescan_cli-0.1.0/src/vibescan/rules/__init__.py +4 -0
  23. vibescan_cli-0.1.0/src/vibescan/rules/base.py +14 -0
  24. vibescan_cli-0.1.0/src/vibescan/rules/dangerous_patterns.py +296 -0
  25. vibescan_cli-0.1.0/src/vibescan/rules/git_hygiene.py +175 -0
  26. vibescan_cli-0.1.0/src/vibescan/rules/registry.py +44 -0
  27. vibescan_cli-0.1.0/src/vibescan/rules/secret/__init__.py +0 -0
  28. vibescan_cli-0.1.0/src/vibescan/rules/secret/cicd_pipeline.py +67 -0
  29. vibescan_cli-0.1.0/src/vibescan/rules/secret/cloud_credentials.py +69 -0
  30. vibescan_cli-0.1.0/src/vibescan/rules/secret/config_hardcode.py +65 -0
  31. vibescan_cli-0.1.0/src/vibescan/rules/secret/data_files.py +84 -0
  32. vibescan_cli-0.1.0/src/vibescan/rules/secret/doc_secrets.py +69 -0
  33. vibescan_cli-0.1.0/src/vibescan/rules/secret/docker_infra.py +75 -0
  34. vibescan_cli-0.1.0/src/vibescan/rules/secret/editor_remnants.py +91 -0
  35. vibescan_cli-0.1.0/src/vibescan/rules/secret/env_exposure.py +57 -0
  36. vibescan_cli-0.1.0/src/vibescan/rules/secret/frontend_env.py +75 -0
  37. vibescan_cli-0.1.0/src/vibescan/rules/secret/hardcoded_patterns.py +108 -0
  38. vibescan_cli-0.1.0/src/vibescan/rules/secret/ide_settings.py +82 -0
  39. vibescan_cli-0.1.0/src/vibescan/rules/secret/mobile_files.py +57 -0
  40. vibescan_cli-0.1.0/src/vibescan/rules/secret/private_keys.py +67 -0
  41. vibescan_cli-0.1.0/src/vibescan/rules/secret/system_configs.py +71 -0
  42. vibescan_cli-0.1.0/src/vibescan/rules/structure.py +168 -0
  43. vibescan_cli-0.1.0/src/vibescan/templates/.gitkeep +0 -0
  44. vibescan_cli-0.1.0/tests/__init__.py +0 -0
  45. vibescan_cli-0.1.0/tests/conftest.py +44 -0
  46. vibescan_cli-0.1.0/tests/test_aggregator.py +63 -0
  47. vibescan_cli-0.1.0/tests/test_cli.py +71 -0
  48. vibescan_cli-0.1.0/tests/test_collector/__init__.py +0 -0
  49. vibescan_cli-0.1.0/tests/test_collector/test_file_collector.py +137 -0
  50. vibescan_cli-0.1.0/tests/test_collector/test_gitignore_parser.py +50 -0
  51. vibescan_cli-0.1.0/tests/test_models.py +110 -0
  52. vibescan_cli-0.1.0/tests/test_reporters.py +98 -0
  53. vibescan_cli-0.1.0/tests/test_rules/__init__.py +0 -0
  54. vibescan_cli-0.1.0/tests/test_rules/test_dangerous_patterns.py +203 -0
  55. vibescan_cli-0.1.0/tests/test_rules/test_git_hygiene.py +108 -0
  56. vibescan_cli-0.1.0/tests/test_rules/test_secret_rules.py +490 -0
  57. vibescan_cli-0.1.0/tests/test_rules/test_structure.py +150 -0
  58. vibescan_cli-0.1.0/website/index.html +505 -0
  59. vibescan_cli-0.1.0/website/vibescan-website-v3.jsx +450 -0
@@ -0,0 +1,18 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(pip install:*)",
5
+ "Bash(vibescan /tmp/test-project)",
6
+ "Bash(vibescan /tmp/leaky-project 2>&1)",
7
+ "Bash(vibescan /tmp/full-test 2>&1)",
8
+ "Bash(python -m pytest tests/ -v --tb=short 2>&1)",
9
+ "Bash(python3 -m pytest tests/ -v --tb=short 2>&1)",
10
+ "Bash(git -C /home/calme/vibescan status)",
11
+ "Bash(git -C /home/calme/vibescan log --oneline)",
12
+ "Bash(vibescan /home/calme/vibescan --min-severity medium 2>&1)",
13
+ "Bash(git -C /home/calme/vibescan log --oneline -5)",
14
+ "Bash(python3 -m pytest tests/test_rules/test_secret_rules.py::TestHardcodedPatterns::test_detects_api_key_prefixes -v --tb=short 2>&1)",
15
+ "Bash(curl -sk https://vibescan.calmee.store --resolve vibescan.calmee.store:443:127.0.0.1 2>/dev/null | head -5)"
16
+ ]
17
+ }
18
+ }
@@ -0,0 +1,40 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ *.egg
7
+ dist/
8
+ build/
9
+ *.whl
10
+ .eggs/
11
+
12
+ # Virtual environments
13
+ .venv/
14
+ venv/
15
+ env/
16
+
17
+ # Testing / Coverage
18
+ .pytest_cache/
19
+ .coverage
20
+ htmlcov/
21
+ .tox/
22
+ .mypy_cache/
23
+
24
+ # IDE
25
+ .vscode/
26
+ .idea/
27
+ *.swp
28
+ *.swo
29
+
30
+ # OS
31
+ .DS_Store
32
+ Thumbs.db
33
+
34
+ # Environment / Secrets
35
+ .env
36
+ .env.*
37
+ !.env.example
38
+
39
+ # Distribution
40
+ *.tar.gz
@@ -0,0 +1,220 @@
1
+ Metadata-Version: 2.4
2
+ Name: vibescan-cli
3
+ Version: 0.1.0
4
+ Summary: Scan your vibe-coded project for leaked secrets and security issues
5
+ Author: VibeScan Team
6
+ License: MIT
7
+ Keywords: cli,scanner,secrets,security
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Topic :: Security
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: rich>=13.0.0
19
+ Requires-Dist: typer>=0.9.0
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest-cov>=4.0; extra == 'dev'
22
+ Requires-Dist: pytest>=7.0; extra == 'dev'
23
+ Description-Content-Type: text/markdown
24
+
25
+ # 🛡️ VibeScan
26
+
27
+ **Push 전에, 코드를 점검하세요.**
28
+
29
+ VibeScan은 바이브코딩(AI 기반 코딩) 시대에 맞춘 **로컬 코드 보안 점검 도구**입니다.
30
+ 민감정보 노출, 보안 취약점, 설정 실수를 초보자도 이해할 수 있는 설명형 리포트로 제공합니다.
31
+
32
+ ```bash
33
+ pip install vibescan
34
+ vibescan scan ./my-project
35
+ ```
36
+
37
+ > **Your code never leaves your machine.** VibeScan runs entirely locally.
38
+
39
+ ---
40
+
41
+ ## 왜 VibeScan인가
42
+
43
+ AI가 만들어준 코드를 그대로 push하면 이런 일이 생깁니다.
44
+
45
+ - `.env`에 실제 API 키가 들어간 채로 GitHub에 올라감
46
+ - `docker-compose.yml`에 DB 비밀번호가 평문으로 노출
47
+ - `serviceAccountKey.json`이 프로젝트 루트에 방치
48
+ - `NEXT_PUBLIC_SECRET_KEY` 같은 환경변수가 브라우저에 노출
49
+
50
+ 기존 보안 도구는 경고 메시지가 어렵고, 수정 방법도 알려주지 않습니다.
51
+ VibeScan은 **왜 위험한지**, **어떻게 고치는지**까지 안내합니다.
52
+
53
+ ---
54
+
55
+ ## 주요 기능
56
+
57
+ ### 🔐 Secret 탐지 (14개 카테고리)
58
+
59
+ | 카테고리 | 예시 |
60
+ |---------|------|
61
+ | 환경변수 파일 | `.env`, `.env.production` 노출 |
62
+ | 설정 파일 하드코딩 | `config.py`, `application.yml`의 비밀번호 |
63
+ | 클라우드 인증 파일 | `serviceAccountKey.json`, `terraform.tfstate` |
64
+ | Docker/인프라 | `docker-compose.yml`의 평문 비밀번호 |
65
+ | CI/CD 파이프라인 | GitHub Actions yml에 시크릿 직접 입력 |
66
+ | IDE 설정 | `.npmrc`, `.vscode/launch.json`의 토큰 |
67
+ | SSH 키/인증서 | `*.pem`, `*.key`, `*.jks` |
68
+ | 코드 내 하드코딩 | `sk-`, `AKIA`, `ghp_` 패턴, DB 연결 문자열 |
69
+ | 프론트엔드 환경변수 | `NEXT_PUBLIC_`, `VITE_` + 시크릿 조합 |
70
+ | 데이터 파일 | `.sqlite`, `.sql`, Jupyter Notebook 출력 |
71
+ | 문서 내 실수 | README curl 예시에 실제 토큰 |
72
+ | 모바일 앱 파일 | `AndroidManifest.xml`, `Info.plist`의 API 키 |
73
+ | DB/시스템 설정 | `.pgpass`, `.kube/config` |
74
+ | 에디터 잔여물 | `.bash_history`, `.htaccess`, Vim swap |
75
+
76
+ ### ⚠️ 위험 코드 패턴
77
+
78
+ **Python:** `eval()`, `exec()`, `subprocess(shell=True)`, `pickle.loads()`, `DEBUG=True`, `verify=False`
79
+ **JS/TS:** `eval()`, `innerHTML`, `dangerouslySetInnerHTML`, `child_process.exec()`, `jwt.decode` without verify
80
+ **SQL:** f-string/template literal 쿼리 조합 (인젝션)
81
+
82
+ ### 📋 Git Hygiene
83
+
84
+ `.gitignore` 존재 여부, `.env*` / `*.pem` / `*.key` / `terraform.tfstate` 등의 ignore 등록 여부 검사
85
+
86
+ ### 🏗️ 프로젝트 구조
87
+
88
+ README, `.env.example`, 테스트 파일, 라이선스, 의존성 버전 고정 검사
89
+
90
+ ---
91
+
92
+ ## 사용법
93
+
94
+ ```bash
95
+ # 기본 스캔 (콘솔 출력)
96
+ vibescan scan ./project
97
+
98
+ # HTML 리포트 생성
99
+ vibescan scan ./project --html report.html
100
+
101
+ # JSON 리포트 생성 (CI/CD 연동)
102
+ vibescan scan ./project --json report.json
103
+
104
+ # MEDIUM 이상만 표시
105
+ vibescan scan ./project --min-severity medium
106
+
107
+ # 특정 규칙 제외
108
+ vibescan scan ./project --ignore-rule SEC001
109
+ ```
110
+
111
+ ---
112
+
113
+ ## 출력 예시
114
+
115
+ ```
116
+ 🔍 Scanning 147 files...
117
+
118
+ CRITICAL config.py:23 Hardcoded AWS access key detected (AKIA...)
119
+ CRITICAL docker-compose.yml:8 POSTGRES_PASSWORD in plaintext
120
+ HIGH src/api.js:45 API key hardcoded: sk-proj-...
121
+ HIGH .env not in .gitignore
122
+ MEDIUM settings.py:1 DEBUG = True (production risk)
123
+ MEDIUM app.js:12 cors({ origin: '*' }) allows all domains
124
+ LOW No README.md found
125
+
126
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
127
+ Scanned 147 files • Found 7 issues
128
+ CRITICAL: 2 HIGH: 2 MEDIUM: 2 LOW: 1
129
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
130
+ ```
131
+
132
+ ---
133
+
134
+ ## 심각도 체계
135
+
136
+ | 등급 | 기준 | 예시 |
137
+ |------|------|------|
138
+ | **CRITICAL** | 즉시 악용 가능, 금전적 피해 | AWS 키, DB 비밀번호, 서비스 계정 키 |
139
+ | **HIGH** | 보안 취약점, 공격 경로 | API 키 하드코딩, eval(), SQL 인젝션 |
140
+ | **MEDIUM** | 잠재적 위험, 모범 사례 위반 | DEBUG=True, CORS 전체 허용 |
141
+ | **LOW** | 코드 품질, 유지보수성 | README 부재, TODO 잔존 |
142
+
143
+ ---
144
+
145
+ ## 아키텍처
146
+
147
+ ```
148
+ CLI Parser → Config Loader → File Collector → Rule Engine → Aggregator → Reporter
149
+
150
+ ProjectContext
151
+ (텍스트 파일, 전체 목록,
152
+ .gitignore 패턴)
153
+ ```
154
+
155
+ - **100% 로컬** — 네트워크 통신 없음, 오프라인 동작
156
+ - **플러그인 구조** — 규칙 추가 시 새 클래스만 작성
157
+ - **안전 설계** — 심볼릭 링크 건너뛰기, 인코딩 안전 처리, 대용량 파일 보호
158
+ - **CI/CD 호환** — CRITICAL/HIGH 발견 시 exit code 1 반환
159
+
160
+ ---
161
+
162
+ ## 기술 스택
163
+
164
+ | 구분 | 선택 |
165
+ |------|------|
166
+ | 언어 | Python 3.10+ |
167
+ | CLI | typer |
168
+ | 콘솔 출력 | rich |
169
+ | 패턴 탐지 | regex (re), ast |
170
+ | HTML 리포트 | Jinja2 |
171
+ | 패키지 배포 | PyPI |
172
+ | 테스트 | pytest |
173
+
174
+ ---
175
+
176
+ ## 로드맵
177
+
178
+ - [x] PRD 작성
179
+ - [x] 아키텍처 설계
180
+ - [x] MVP 구현 (File Collector + Secret Rule + Console Reporter)
181
+ - [x] Git Hygiene / Dangerous Pattern / Structure Rule
182
+ - [x] 테스트 (196 tests passing)
183
+ - [ ] JSON / HTML Reporter
184
+ - [ ] PyPI 배포
185
+ - [ ] 소개 웹사이트
186
+ - [ ] Git History Scan
187
+ - [ ] VSCode Extension
188
+ - [ ] GitHub Actions 연동
189
+ - [ ] AI 기반 코드 설명
190
+
191
+ ---
192
+
193
+ ## 보안 원칙
194
+
195
+ ```
196
+ Your code never leaves your machine.
197
+ VibeScan runs entirely locally.
198
+ No network. No upload. No tracking.
199
+ ```
200
+
201
+ ---
202
+
203
+ ## 라이선스
204
+
205
+ MIT License
206
+
207
+ ---
208
+
209
+ ## 관련 문서
210
+
211
+ - [PRD (Product Requirements Document)](./docs/PRD.md)
212
+ - [Architecture Design](./docs/ARCHITECTURE.md)
213
+ - [Directory Structure](./docs/DIRECTORY_STRUCTURE.md)
214
+ - [탐지 규칙 문서](./docs/rules.md)
215
+
216
+ ---
217
+
218
+ ## 개발 블로그
219
+
220
+ - [VibeScan 개발기 — 바이브코더를 위한 보안 점검 도구를 만듭니다](https://calme.tistory.com)
@@ -0,0 +1,196 @@
1
+ # 🛡️ VibeScan
2
+
3
+ **Push 전에, 코드를 점검하세요.**
4
+
5
+ VibeScan은 바이브코딩(AI 기반 코딩) 시대에 맞춘 **로컬 코드 보안 점검 도구**입니다.
6
+ 민감정보 노출, 보안 취약점, 설정 실수를 초보자도 이해할 수 있는 설명형 리포트로 제공합니다.
7
+
8
+ ```bash
9
+ pip install vibescan
10
+ vibescan scan ./my-project
11
+ ```
12
+
13
+ > **Your code never leaves your machine.** VibeScan runs entirely locally.
14
+
15
+ ---
16
+
17
+ ## 왜 VibeScan인가
18
+
19
+ AI가 만들어준 코드를 그대로 push하면 이런 일이 생깁니다.
20
+
21
+ - `.env`에 실제 API 키가 들어간 채로 GitHub에 올라감
22
+ - `docker-compose.yml`에 DB 비밀번호가 평문으로 노출
23
+ - `serviceAccountKey.json`이 프로젝트 루트에 방치
24
+ - `NEXT_PUBLIC_SECRET_KEY` 같은 환경변수가 브라우저에 노출
25
+
26
+ 기존 보안 도구는 경고 메시지가 어렵고, 수정 방법도 알려주지 않습니다.
27
+ VibeScan은 **왜 위험한지**, **어떻게 고치는지**까지 안내합니다.
28
+
29
+ ---
30
+
31
+ ## 주요 기능
32
+
33
+ ### 🔐 Secret 탐지 (14개 카테고리)
34
+
35
+ | 카테고리 | 예시 |
36
+ |---------|------|
37
+ | 환경변수 파일 | `.env`, `.env.production` 노출 |
38
+ | 설정 파일 하드코딩 | `config.py`, `application.yml`의 비밀번호 |
39
+ | 클라우드 인증 파일 | `serviceAccountKey.json`, `terraform.tfstate` |
40
+ | Docker/인프라 | `docker-compose.yml`의 평문 비밀번호 |
41
+ | CI/CD 파이프라인 | GitHub Actions yml에 시크릿 직접 입력 |
42
+ | IDE 설정 | `.npmrc`, `.vscode/launch.json`의 토큰 |
43
+ | SSH 키/인증서 | `*.pem`, `*.key`, `*.jks` |
44
+ | 코드 내 하드코딩 | `sk-`, `AKIA`, `ghp_` 패턴, DB 연결 문자열 |
45
+ | 프론트엔드 환경변수 | `NEXT_PUBLIC_`, `VITE_` + 시크릿 조합 |
46
+ | 데이터 파일 | `.sqlite`, `.sql`, Jupyter Notebook 출력 |
47
+ | 문서 내 실수 | README curl 예시에 실제 토큰 |
48
+ | 모바일 앱 파일 | `AndroidManifest.xml`, `Info.plist`의 API 키 |
49
+ | DB/시스템 설정 | `.pgpass`, `.kube/config` |
50
+ | 에디터 잔여물 | `.bash_history`, `.htaccess`, Vim swap |
51
+
52
+ ### ⚠️ 위험 코드 패턴
53
+
54
+ **Python:** `eval()`, `exec()`, `subprocess(shell=True)`, `pickle.loads()`, `DEBUG=True`, `verify=False`
55
+ **JS/TS:** `eval()`, `innerHTML`, `dangerouslySetInnerHTML`, `child_process.exec()`, `jwt.decode` without verify
56
+ **SQL:** f-string/template literal 쿼리 조합 (인젝션)
57
+
58
+ ### 📋 Git Hygiene
59
+
60
+ `.gitignore` 존재 여부, `.env*` / `*.pem` / `*.key` / `terraform.tfstate` 등의 ignore 등록 여부 검사
61
+
62
+ ### 🏗️ 프로젝트 구조
63
+
64
+ README, `.env.example`, 테스트 파일, 라이선스, 의존성 버전 고정 검사
65
+
66
+ ---
67
+
68
+ ## 사용법
69
+
70
+ ```bash
71
+ # 기본 스캔 (콘솔 출력)
72
+ vibescan scan ./project
73
+
74
+ # HTML 리포트 생성
75
+ vibescan scan ./project --html report.html
76
+
77
+ # JSON 리포트 생성 (CI/CD 연동)
78
+ vibescan scan ./project --json report.json
79
+
80
+ # MEDIUM 이상만 표시
81
+ vibescan scan ./project --min-severity medium
82
+
83
+ # 특정 규칙 제외
84
+ vibescan scan ./project --ignore-rule SEC001
85
+ ```
86
+
87
+ ---
88
+
89
+ ## 출력 예시
90
+
91
+ ```
92
+ 🔍 Scanning 147 files...
93
+
94
+ CRITICAL config.py:23 Hardcoded AWS access key detected (AKIA...)
95
+ CRITICAL docker-compose.yml:8 POSTGRES_PASSWORD in plaintext
96
+ HIGH src/api.js:45 API key hardcoded: sk-proj-...
97
+ HIGH .env not in .gitignore
98
+ MEDIUM settings.py:1 DEBUG = True (production risk)
99
+ MEDIUM app.js:12 cors({ origin: '*' }) allows all domains
100
+ LOW No README.md found
101
+
102
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
103
+ Scanned 147 files • Found 7 issues
104
+ CRITICAL: 2 HIGH: 2 MEDIUM: 2 LOW: 1
105
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 심각도 체계
111
+
112
+ | 등급 | 기준 | 예시 |
113
+ |------|------|------|
114
+ | **CRITICAL** | 즉시 악용 가능, 금전적 피해 | AWS 키, DB 비밀번호, 서비스 계정 키 |
115
+ | **HIGH** | 보안 취약점, 공격 경로 | API 키 하드코딩, eval(), SQL 인젝션 |
116
+ | **MEDIUM** | 잠재적 위험, 모범 사례 위반 | DEBUG=True, CORS 전체 허용 |
117
+ | **LOW** | 코드 품질, 유지보수성 | README 부재, TODO 잔존 |
118
+
119
+ ---
120
+
121
+ ## 아키텍처
122
+
123
+ ```
124
+ CLI Parser → Config Loader → File Collector → Rule Engine → Aggregator → Reporter
125
+
126
+ ProjectContext
127
+ (텍스트 파일, 전체 목록,
128
+ .gitignore 패턴)
129
+ ```
130
+
131
+ - **100% 로컬** — 네트워크 통신 없음, 오프라인 동작
132
+ - **플러그인 구조** — 규칙 추가 시 새 클래스만 작성
133
+ - **안전 설계** — 심볼릭 링크 건너뛰기, 인코딩 안전 처리, 대용량 파일 보호
134
+ - **CI/CD 호환** — CRITICAL/HIGH 발견 시 exit code 1 반환
135
+
136
+ ---
137
+
138
+ ## 기술 스택
139
+
140
+ | 구분 | 선택 |
141
+ |------|------|
142
+ | 언어 | Python 3.10+ |
143
+ | CLI | typer |
144
+ | 콘솔 출력 | rich |
145
+ | 패턴 탐지 | regex (re), ast |
146
+ | HTML 리포트 | Jinja2 |
147
+ | 패키지 배포 | PyPI |
148
+ | 테스트 | pytest |
149
+
150
+ ---
151
+
152
+ ## 로드맵
153
+
154
+ - [x] PRD 작성
155
+ - [x] 아키텍처 설계
156
+ - [x] MVP 구현 (File Collector + Secret Rule + Console Reporter)
157
+ - [x] Git Hygiene / Dangerous Pattern / Structure Rule
158
+ - [x] 테스트 (196 tests passing)
159
+ - [ ] JSON / HTML Reporter
160
+ - [ ] PyPI 배포
161
+ - [ ] 소개 웹사이트
162
+ - [ ] Git History Scan
163
+ - [ ] VSCode Extension
164
+ - [ ] GitHub Actions 연동
165
+ - [ ] AI 기반 코드 설명
166
+
167
+ ---
168
+
169
+ ## 보안 원칙
170
+
171
+ ```
172
+ Your code never leaves your machine.
173
+ VibeScan runs entirely locally.
174
+ No network. No upload. No tracking.
175
+ ```
176
+
177
+ ---
178
+
179
+ ## 라이선스
180
+
181
+ MIT License
182
+
183
+ ---
184
+
185
+ ## 관련 문서
186
+
187
+ - [PRD (Product Requirements Document)](./docs/PRD.md)
188
+ - [Architecture Design](./docs/ARCHITECTURE.md)
189
+ - [Directory Structure](./docs/DIRECTORY_STRUCTURE.md)
190
+ - [탐지 규칙 문서](./docs/rules.md)
191
+
192
+ ---
193
+
194
+ ## 개발 블로그
195
+
196
+ - [VibeScan 개발기 — 바이브코더를 위한 보안 점검 도구를 만듭니다](https://calme.tistory.com)