tylersong 1.0.4 → 1.0.6
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/.github/actions/discord-notify/action.yml +119 -0
- package/.github/actions/setup-runtime/action.yml +41 -0
- package/.github/workflows/ci.yml +176 -0
- package/.github/workflows/publish.yml +320 -0
- package/README.md +89 -4
- package/bun.lock +146 -0
- package/bunfig.toml +16 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/docs/auto-deployment.md +191 -0
- package/docs/deployment.md +82 -0
- package/docs/direct-deployment.md +116 -0
- package/docs/discord-setup.md +158 -0
- package/docs/github-actions-fixes.md +142 -0
- package/docs/usage.md +112 -0
- package/docs/workflows.md +176 -0
- package/package.json +19 -4
- package/{index.js → src/index.ts} +14 -6
- package/tsconfig.json +20 -0
- package/.github/workflows/npm-publish.yml +0 -48
package/README.md
CHANGED
|
@@ -1,7 +1,92 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 📝 tylersong
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 안녕하세요! 프론트엔드 개발자 **송민성**의 자기소개 CLI 도구입니다 ✨
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/tylersong)
|
|
6
|
+
[](https://www.npmjs.com/package/tylersong)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
터미널에서 간단한 명령어로 개발자 프로필을 확인하고, GitHub 링크에 빠르게 접근할 수 있습니다.
|
|
10
|
+
|
|
11
|
+
## 🚀 빠른 시작
|
|
12
|
+
|
|
13
|
+
### 즉시 실행 (권장)
|
|
14
|
+
```bash
|
|
15
|
+
npx tylersong
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 전역 설치
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g tylersong
|
|
21
|
+
tylersong
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 💻 사용법
|
|
25
|
+
|
|
26
|
+
### 기본 실행
|
|
27
|
+
```bash
|
|
28
|
+
tylersong
|
|
29
|
+
# ✨ 저에 대해 궁금하신가요? 라는 질문에 답하면 프로필이 표시됩니다
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 명령어 옵션
|
|
33
|
+
```bash
|
|
34
|
+
tylersong --help # 도움말 보기
|
|
35
|
+
tylersong --version # 버전 정보 확인
|
|
36
|
+
tylersong --github # GitHub 프로필 바로 열기
|
|
37
|
+
tylersong -g # GitHub 프로필 바로 열기 (단축)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 🎨 스크린샷
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
╭───────────────────────────────────────────╮
|
|
44
|
+
│ 🚀 Frontend Developer Profile 🚀 │
|
|
45
|
+
╰───────────────────────────────────────────╯
|
|
46
|
+
|
|
47
|
+
👋 안녕하세요!
|
|
48
|
+
💻 프론트엔드 개발자 송민성입니다.
|
|
49
|
+
|
|
50
|
+
📌 Github: https://github.com/alstjd0051
|
|
51
|
+
✉️ E-mail: wsc7202@gmail.com
|
|
52
|
+
|
|
53
|
+
💡 더 많은 정보는 --help를 통해 확인해주세요.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 👨💻 개발자 정보
|
|
57
|
+
|
|
58
|
+
- **이름**: 송민성 (Tyler Song)
|
|
59
|
+
- **직업**: Frontend Developer
|
|
60
|
+
- **GitHub**: [@alstjd0051](https://github.com/alstjd0051)
|
|
61
|
+
- **Email**: wsc7202@gmail.com
|
|
62
|
+
|
|
63
|
+
## 🛠️ 기술 스택
|
|
64
|
+
|
|
65
|
+
이 CLI 도구는 다음 기술로 제작되었습니다:
|
|
66
|
+
- **TypeScript** - 타입 안전성
|
|
67
|
+
- **Node.js** - 크로스 플랫폼 실행
|
|
68
|
+
- **Commander.js** - CLI 인터페이스
|
|
69
|
+
- **Inquirer.js** - 대화형 프롬프트
|
|
70
|
+
- **Chalk** - 터미널 색상 및 스타일링
|
|
71
|
+
|
|
72
|
+
## 📦 패키지 정보
|
|
73
|
+
|
|
74
|
+
- **크기**: 작고 가벼운 패키지 (~20KB)
|
|
75
|
+
- **의존성**: 최소한의 검증된 의존성만 사용
|
|
76
|
+
- **호환성**: Node.js 14+ 지원
|
|
77
|
+
- **플랫폼**: Windows, macOS, Linux 모두 지원
|
|
78
|
+
|
|
79
|
+
## 🤝 피드백 및 연락
|
|
80
|
+
|
|
81
|
+
버그 리포트나 기능 제안은 언제든 환영합니다!
|
|
82
|
+
|
|
83
|
+
- **GitHub Issues**: [npm_readMe/issues](https://github.com/alstjd0051/npm_readMe/issues)
|
|
84
|
+
- **Email**: wsc7202@gmail.com
|
|
85
|
+
|
|
86
|
+
## 📄 라이센스
|
|
87
|
+
|
|
88
|
+
MIT License - 자유롭게 사용하세요!
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
**Made with ❤️ by Tyler Song**
|
package/bun.lock
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 1,
|
|
3
|
+
"workspaces": {
|
|
4
|
+
"": {
|
|
5
|
+
"name": "tylersong",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"chalk": "^5.4.1",
|
|
8
|
+
"commander": "^13.1.0",
|
|
9
|
+
"inquirer": "^12.4.2",
|
|
10
|
+
},
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@types/inquirer": "^9.0.8",
|
|
13
|
+
"@types/node": "^24.1.0",
|
|
14
|
+
"ts-node": "^10.9.2",
|
|
15
|
+
"typescript": "^5.9.2",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
"packages": {
|
|
20
|
+
"@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
|
|
21
|
+
|
|
22
|
+
"@inquirer/checkbox": ["@inquirer/checkbox@4.1.2", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ=="],
|
|
23
|
+
|
|
24
|
+
"@inquirer/confirm": ["@inquirer/confirm@5.1.6", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw=="],
|
|
25
|
+
|
|
26
|
+
"@inquirer/core": ["@inquirer/core@10.1.7", "", { "dependencies": { "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA=="],
|
|
27
|
+
|
|
28
|
+
"@inquirer/editor": ["@inquirer/editor@4.2.7", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA=="],
|
|
29
|
+
|
|
30
|
+
"@inquirer/expand": ["@inquirer/expand@4.0.9", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig=="],
|
|
31
|
+
|
|
32
|
+
"@inquirer/figures": ["@inquirer/figures@1.0.10", "", {}, "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw=="],
|
|
33
|
+
|
|
34
|
+
"@inquirer/input": ["@inquirer/input@4.1.6", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ=="],
|
|
35
|
+
|
|
36
|
+
"@inquirer/number": ["@inquirer/number@3.0.9", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w=="],
|
|
37
|
+
|
|
38
|
+
"@inquirer/password": ["@inquirer/password@4.0.9", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ=="],
|
|
39
|
+
|
|
40
|
+
"@inquirer/prompts": ["@inquirer/prompts@7.3.2", "", { "dependencies": { "@inquirer/checkbox": "^4.1.2", "@inquirer/confirm": "^5.1.6", "@inquirer/editor": "^4.2.7", "@inquirer/expand": "^4.0.9", "@inquirer/input": "^4.1.6", "@inquirer/number": "^3.0.9", "@inquirer/password": "^4.0.9", "@inquirer/rawlist": "^4.0.9", "@inquirer/search": "^3.0.9", "@inquirer/select": "^4.0.9" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ=="],
|
|
41
|
+
|
|
42
|
+
"@inquirer/rawlist": ["@inquirer/rawlist@4.0.9", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A=="],
|
|
43
|
+
|
|
44
|
+
"@inquirer/search": ["@inquirer/search@3.0.9", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA=="],
|
|
45
|
+
|
|
46
|
+
"@inquirer/select": ["@inquirer/select@4.0.9", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg=="],
|
|
47
|
+
|
|
48
|
+
"@inquirer/type": ["@inquirer/type@3.0.4", "", { "peerDependencies": { "@types/node": ">=18" } }, "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA=="],
|
|
49
|
+
|
|
50
|
+
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
|
51
|
+
|
|
52
|
+
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="],
|
|
53
|
+
|
|
54
|
+
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
|
|
55
|
+
|
|
56
|
+
"@tsconfig/node10": ["@tsconfig/node10@1.0.11", "", {}, "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="],
|
|
57
|
+
|
|
58
|
+
"@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="],
|
|
59
|
+
|
|
60
|
+
"@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="],
|
|
61
|
+
|
|
62
|
+
"@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="],
|
|
63
|
+
|
|
64
|
+
"@types/inquirer": ["@types/inquirer@9.0.8", "", { "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, "sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA=="],
|
|
65
|
+
|
|
66
|
+
"@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="],
|
|
67
|
+
|
|
68
|
+
"@types/through": ["@types/through@0.0.33", "", { "dependencies": { "@types/node": "*" } }, "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ=="],
|
|
69
|
+
|
|
70
|
+
"acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
|
|
71
|
+
|
|
72
|
+
"acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="],
|
|
73
|
+
|
|
74
|
+
"ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="],
|
|
75
|
+
|
|
76
|
+
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
|
77
|
+
|
|
78
|
+
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
|
79
|
+
|
|
80
|
+
"arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="],
|
|
81
|
+
|
|
82
|
+
"chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
|
|
83
|
+
|
|
84
|
+
"chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="],
|
|
85
|
+
|
|
86
|
+
"cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
|
|
87
|
+
|
|
88
|
+
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
|
89
|
+
|
|
90
|
+
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
|
91
|
+
|
|
92
|
+
"commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="],
|
|
93
|
+
|
|
94
|
+
"create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="],
|
|
95
|
+
|
|
96
|
+
"diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="],
|
|
97
|
+
|
|
98
|
+
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
|
99
|
+
|
|
100
|
+
"external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="],
|
|
101
|
+
|
|
102
|
+
"iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
|
|
103
|
+
|
|
104
|
+
"inquirer": ["inquirer@12.4.2", "", { "dependencies": { "@inquirer/core": "^10.1.7", "@inquirer/prompts": "^7.3.2", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "mute-stream": "^2.0.0", "run-async": "^3.0.0", "rxjs": "^7.8.1" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-reyjHcwyK2LObXgTJH4T1Dpfhwu88LNPTZmg/KenmTsy3T8lN/kZT8Oo7UwwkB9q8+ss2qjjN7GV8oFAfyz9Xg=="],
|
|
105
|
+
|
|
106
|
+
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
|
107
|
+
|
|
108
|
+
"make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="],
|
|
109
|
+
|
|
110
|
+
"mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="],
|
|
111
|
+
|
|
112
|
+
"os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="],
|
|
113
|
+
|
|
114
|
+
"run-async": ["run-async@3.0.0", "", {}, "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q=="],
|
|
115
|
+
|
|
116
|
+
"rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
|
|
117
|
+
|
|
118
|
+
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
|
119
|
+
|
|
120
|
+
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
|
121
|
+
|
|
122
|
+
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
|
123
|
+
|
|
124
|
+
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
|
125
|
+
|
|
126
|
+
"tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="],
|
|
127
|
+
|
|
128
|
+
"ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="],
|
|
129
|
+
|
|
130
|
+
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
|
131
|
+
|
|
132
|
+
"type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="],
|
|
133
|
+
|
|
134
|
+
"typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="],
|
|
135
|
+
|
|
136
|
+
"undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="],
|
|
137
|
+
|
|
138
|
+
"v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="],
|
|
139
|
+
|
|
140
|
+
"wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
|
|
141
|
+
|
|
142
|
+
"yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="],
|
|
143
|
+
|
|
144
|
+
"yoctocolors-cjs": ["yoctocolors-cjs@2.1.2", "", {}, "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA=="],
|
|
145
|
+
}
|
|
146
|
+
}
|
package/bunfig.toml
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { program } from "commander";
|
|
5
|
+
import { exec } from "child_process";
|
|
6
|
+
const openUrl = (url) => {
|
|
7
|
+
const command = process.platform === "win32"
|
|
8
|
+
? "start"
|
|
9
|
+
: process.platform === "darwin"
|
|
10
|
+
? "open"
|
|
11
|
+
: "xdg-open";
|
|
12
|
+
exec(`${command} ${url}`);
|
|
13
|
+
};
|
|
14
|
+
program.version("1.0.6");
|
|
15
|
+
program.option("-g, --github", "GitHub 프로필 열기");
|
|
16
|
+
program.parse(process.argv);
|
|
17
|
+
const options = program.opts();
|
|
18
|
+
if (Object.keys(options).length > 0) {
|
|
19
|
+
if (options.github)
|
|
20
|
+
openUrl("https://github.com/alstjd0051");
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
const main = async () => {
|
|
24
|
+
// 도움말 옵션 체크
|
|
25
|
+
if (process.argv.includes("--help")) {
|
|
26
|
+
console.log(chalk.yellow(`
|
|
27
|
+
╭───────────────────────────────╮
|
|
28
|
+
│ 사용 방법 │
|
|
29
|
+
├───────────────────────────────┤
|
|
30
|
+
│ npx tylerSong │
|
|
31
|
+
│ │
|
|
32
|
+
│ 옵션: │
|
|
33
|
+
│ -V, --version 버전 정보 │
|
|
34
|
+
│ -g, --github GitHub 열기 │
|
|
35
|
+
│ -h, --help 도움말 │
|
|
36
|
+
╰───────────────────────────────╯
|
|
37
|
+
`));
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
// 사용자 질문
|
|
41
|
+
const answer = await inquirer.prompt([
|
|
42
|
+
{
|
|
43
|
+
type: "confirm",
|
|
44
|
+
name: "showInfo",
|
|
45
|
+
message: chalk.cyan("✨ 저에 대해 궁금하신가요?"),
|
|
46
|
+
default: true,
|
|
47
|
+
},
|
|
48
|
+
]);
|
|
49
|
+
if (answer.showInfo) {
|
|
50
|
+
console.log(chalk.bold.cyan(`
|
|
51
|
+
╭───────────────────────────────────────────╮
|
|
52
|
+
│ 🚀 Frontend Developer Profile 🚀 │
|
|
53
|
+
╰───────────────────────────────────────────╯
|
|
54
|
+
|
|
55
|
+
`) +
|
|
56
|
+
chalk.green(`👋 안녕하세요!
|
|
57
|
+
💻 프론트엔드 개발자 ${chalk.bold.yellow("송민성")}입니다.
|
|
58
|
+
|
|
59
|
+
`) +
|
|
60
|
+
chalk.hex("#fef6e1")(`📌 Github: ${chalk.underline.whiteBright(`https://github.com/alstjd0051`)}
|
|
61
|
+
`) +
|
|
62
|
+
chalk.blue(`✉️ E-mail: ${chalk.underline.whiteBright(`wsc7202@gmail.com`)}
|
|
63
|
+
`) +
|
|
64
|
+
chalk.magenta(`
|
|
65
|
+
💡 더 많은 정보는 ${chalk.bold("--help")}를 통해 확인해주세요.
|
|
66
|
+
`));
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
main().catch(console.error);
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAUrC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAQ,EAAE;IACpC,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC/B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,UAAU,CAAC;IACjB,IAAI,CAAC,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEzB,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;AAEhD,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,MAAM,OAAO,GAAmB,OAAO,CAAC,IAAI,EAAE,CAAC;AAE/C,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,YAAY;IACZ,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC;;;;;;;;;;;KAWd,CAAC,CACD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,SAAS;IACT,MAAM,MAAM,GAAe,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC/C;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACtC,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;OAKf,CAAC;YACA,KAAK,CAAC,KAAK,CAAC;qBACC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;OAEtC,CAAC;YACA,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,KAAK,CAAC,SAAS,CAAC,WAAW,CAC5D,+BAA+B,CAChC;OACF,CAAC;YACA,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,SAAS,CAAC,WAAW,CACnD,mBAAmB,CACpB;OACF,CAAC;YACA,KAAK,CAAC,OAAO,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;OACjC,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# 자동 배포 시스템 가이드
|
|
2
|
+
|
|
3
|
+
## 🎯 개요
|
|
4
|
+
이 시스템은 main 브랜치에 PR이 merge될 때 자동으로 버전을 업데이트하고 NPM에 배포하는 완전 자동화된 배포 시스템입니다.
|
|
5
|
+
|
|
6
|
+
## 🚀 작동 방식
|
|
7
|
+
|
|
8
|
+
### 1. 자동 트리거
|
|
9
|
+
- **main 브랜치로의 PR merge**: CI 완료 후 자동 배포 시작
|
|
10
|
+
- **main 브랜치로의 직접 push**: 즉시 자동 배포 시작
|
|
11
|
+
- **태그 push**: 기존 태그 기반 배포 유지
|
|
12
|
+
|
|
13
|
+
### 2. 자동 버전 결정 (Semantic Versioning)
|
|
14
|
+
커밋 메시지를 분석하여 자동으로 버전 타입을 결정합니다:
|
|
15
|
+
|
|
16
|
+
#### 🔴 Major 버전 (X.0.0)
|
|
17
|
+
```bash
|
|
18
|
+
# Breaking changes
|
|
19
|
+
git commit -m "feat!: completely new API structure"
|
|
20
|
+
git commit -m "fix!: remove deprecated method"
|
|
21
|
+
git commit -m "feat: add new feature
|
|
22
|
+
|
|
23
|
+
BREAKING CHANGE: This removes the old API"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
#### 🟡 Minor 버전 (0.X.0)
|
|
27
|
+
```bash
|
|
28
|
+
# New features
|
|
29
|
+
git commit -m "feat: add user profile management"
|
|
30
|
+
git commit -m "feat(auth): implement OAuth login"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
#### 🟢 Patch 버전 (0.0.X)
|
|
34
|
+
```bash
|
|
35
|
+
# Bug fixes, docs, chores (default)
|
|
36
|
+
git commit -m "fix: resolve login redirect issue"
|
|
37
|
+
git commit -m "docs: update README"
|
|
38
|
+
git commit -m "chore: update dependencies"
|
|
39
|
+
git commit -m "style: fix code formatting"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3. 자동 실행 과정
|
|
43
|
+
1. **CI 실행**: 테스트, 빌드, 린팅
|
|
44
|
+
2. **버전 분석**: 현재 버전 vs NPM 배포 버전 비교
|
|
45
|
+
3. **자동 버전 업데이트**: 필요 시 package.json 및 소스코드 버전 업데이트
|
|
46
|
+
4. **자동 커밋**: 버전 업데이트 커밋 생성 및 푸시
|
|
47
|
+
5. **빌드 및 배포**: TypeScript 빌드 후 NPM 배포
|
|
48
|
+
6. **알림**: Discord 및 콘솔 알림
|
|
49
|
+
|
|
50
|
+
## 📋 사전 설정 요구사항
|
|
51
|
+
|
|
52
|
+
### 1. GitHub Secrets 설정
|
|
53
|
+
```bash
|
|
54
|
+
# NPM 토큰 설정 (필수)
|
|
55
|
+
NPM_TOKEN=your_npm_token_here
|
|
56
|
+
|
|
57
|
+
# Discord 알림 (선택사항)
|
|
58
|
+
DISCORD_WEBHOOK_URL=your_discord_webhook_url
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 2. NPM 토큰 생성 방법
|
|
62
|
+
1. [npmjs.com](https://www.npmjs.com)에 로그인
|
|
63
|
+
2. Profile → Access Tokens → Generate New Token
|
|
64
|
+
3. **Automation** 타입 선택
|
|
65
|
+
4. 생성된 토큰을 GitHub Repository Settings → Secrets에 `NPM_TOKEN`으로 추가
|
|
66
|
+
|
|
67
|
+
## 🎨 Conventional Commits 가이드
|
|
68
|
+
|
|
69
|
+
### 기본 형식
|
|
70
|
+
```
|
|
71
|
+
<type>[optional scope]: <description>
|
|
72
|
+
|
|
73
|
+
[optional body]
|
|
74
|
+
|
|
75
|
+
[optional footer(s)]
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 주요 타입들
|
|
79
|
+
| 타입 | 설명 | 버전 영향 |
|
|
80
|
+
|------|------|-----------|
|
|
81
|
+
| `feat` | 새로운 기능 | Minor |
|
|
82
|
+
| `fix` | 버그 수정 | Patch |
|
|
83
|
+
| `docs` | 문서 변경 | Patch |
|
|
84
|
+
| `style` | 코드 스타일 변경 | Patch |
|
|
85
|
+
| `refactor` | 코드 리팩토링 | Patch |
|
|
86
|
+
| `test` | 테스트 추가/수정 | Patch |
|
|
87
|
+
| `chore` | 빌드/설정 변경 | Patch |
|
|
88
|
+
| `!` | Breaking Change | Major |
|
|
89
|
+
|
|
90
|
+
### 실제 예시
|
|
91
|
+
```bash
|
|
92
|
+
# 새 기능 추가 (Minor 버전 증가)
|
|
93
|
+
git commit -m "feat: add interactive CLI menu"
|
|
94
|
+
|
|
95
|
+
# 버그 수정 (Patch 버전 증가)
|
|
96
|
+
git commit -m "fix: resolve command parsing error"
|
|
97
|
+
|
|
98
|
+
# Breaking Change (Major 버전 증가)
|
|
99
|
+
git commit -m "feat!: redesign CLI interface"
|
|
100
|
+
|
|
101
|
+
# 상세한 설명이 있는 커밋
|
|
102
|
+
git commit -m "feat: add color themes
|
|
103
|
+
|
|
104
|
+
- Add dark and light theme options
|
|
105
|
+
- Implement theme persistence
|
|
106
|
+
- Update help text with theme info"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 🔧 워크플로우 파일 구성
|
|
110
|
+
|
|
111
|
+
### 주요 작업들
|
|
112
|
+
1. **check-ci**: CI 상태 확인
|
|
113
|
+
2. **auto-version**: 자동 버전 업데이트 및 결정
|
|
114
|
+
3. **version-check**: 태그 기반 배포용 버전 확인
|
|
115
|
+
4. **publish**: NPM 배포 실행
|
|
116
|
+
5. **notify**: 결과 알림
|
|
117
|
+
|
|
118
|
+
### 트리거 조건
|
|
119
|
+
```yaml
|
|
120
|
+
on:
|
|
121
|
+
push:
|
|
122
|
+
branches: [main] # main 브랜치 직접 push
|
|
123
|
+
tags: ["v*"] # 태그 push
|
|
124
|
+
workflow_run:
|
|
125
|
+
workflows: ["Continuous Integration"]
|
|
126
|
+
types: [completed] # CI 완료 후
|
|
127
|
+
branches: [main]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 📊 배포 시나리오
|
|
131
|
+
|
|
132
|
+
### 시나리오 1: 첫 PR merge
|
|
133
|
+
```
|
|
134
|
+
현재 NPM: v1.0.5
|
|
135
|
+
현재 코드: v1.0.5
|
|
136
|
+
→ 자동으로 v1.0.6으로 업데이트 후 배포
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 시나리오 2: 이미 다른 버전인 경우
|
|
140
|
+
```
|
|
141
|
+
현재 NPM: v1.0.5
|
|
142
|
+
현재 코드: v1.0.6
|
|
143
|
+
→ 버전 업데이트 없이 v1.0.6 즉시 배포
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 시나리오 3: 태그 기반 배포
|
|
147
|
+
```
|
|
148
|
+
태그 push: v1.1.0
|
|
149
|
+
→ 버전 체크만 하고 즉시 배포
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 🚨 주의사항
|
|
153
|
+
|
|
154
|
+
### 1. 권한 설정
|
|
155
|
+
- GitHub Actions에 repository write 권한 필요
|
|
156
|
+
- NPM 토큰이 올바르게 설정되어야 함
|
|
157
|
+
|
|
158
|
+
### 2. 커밋 메시지 규칙
|
|
159
|
+
- Conventional Commits 형식 권장
|
|
160
|
+
- 명확하고 일관된 메시지 작성
|
|
161
|
+
|
|
162
|
+
### 3. CI/CD 최적화
|
|
163
|
+
- `[skip ci]` 태그로 무한 루프 방지
|
|
164
|
+
- 버전 업데이트 커밋은 자동으로 CI 건너뛰기
|
|
165
|
+
|
|
166
|
+
## 🎉 장점
|
|
167
|
+
|
|
168
|
+
### ✅ 완전 자동화
|
|
169
|
+
- 수동 버전 관리 불필요
|
|
170
|
+
- 실수 방지 및 일관성 보장
|
|
171
|
+
|
|
172
|
+
### ✅ Semantic Versioning 준수
|
|
173
|
+
- 커밋 메시지 기반 자동 버전 결정
|
|
174
|
+
- 표준화된 버전 관리
|
|
175
|
+
|
|
176
|
+
### ✅ 실시간 알림
|
|
177
|
+
- Discord 및 콘솔 배포 상태 알림
|
|
178
|
+
- 성공/실패 즉시 확인
|
|
179
|
+
|
|
180
|
+
## 🔍 디버깅
|
|
181
|
+
|
|
182
|
+
### 로그 확인 위치
|
|
183
|
+
- GitHub Actions → 해당 워크플로우 실행 → 각 작업 로그
|
|
184
|
+
|
|
185
|
+
### 일반적인 문제들
|
|
186
|
+
1. **NPM 토큰 오류**: Secrets 설정 확인
|
|
187
|
+
2. **버전 충돌**: NPM에서 같은 버전 이미 배포됨
|
|
188
|
+
3. **빌드 실패**: TypeScript 컴파일 오류 확인
|
|
189
|
+
4. **권한 오류**: GitHub token 권한 확인
|
|
190
|
+
|
|
191
|
+
이제 PR만 merge하면 자동으로 버전이 업데이트되고 NPM에 배포됩니다! 🚀
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# 배포 가이드
|
|
2
|
+
|
|
3
|
+
## CI/CD 파이프라인
|
|
4
|
+
|
|
5
|
+
이 프로젝트는 모듈화된 GitHub Actions를 사용한 자동 배포 시스템을 구축했습니다.
|
|
6
|
+
|
|
7
|
+
> 📖 **워크플로우 구조**: 자세한 내용은 [docs/workflows.md](./workflows.md)를 참고해주세요.
|
|
8
|
+
|
|
9
|
+
### 트리거 조건
|
|
10
|
+
|
|
11
|
+
#### 1. Pull Request
|
|
12
|
+
|
|
13
|
+
- `main` 브랜치로의 PR 시 테스트와 빌드만 실행
|
|
14
|
+
- Node.js와 Bun 두 환경에서 모두 테스트
|
|
15
|
+
|
|
16
|
+
#### 2. Main 브랜치 Push
|
|
17
|
+
|
|
18
|
+
- `main` 브랜치에 직접 push 시
|
|
19
|
+
- 버전이 변경된 경우에만 NPM에 자동 배포
|
|
20
|
+
- package.json의 버전과 NPM에 이미 배포된 버전을 비교
|
|
21
|
+
|
|
22
|
+
#### 3. 태그 Push
|
|
23
|
+
|
|
24
|
+
- `v*` 형태의 태그 push 시 무조건 NPM에 배포
|
|
25
|
+
- 예: `v1.0.5`, `v2.1.0`
|
|
26
|
+
|
|
27
|
+
### 배포 워크플로우
|
|
28
|
+
|
|
29
|
+
```mermaid
|
|
30
|
+
graph LR
|
|
31
|
+
A[Code Push] --> B{브랜치 확인}
|
|
32
|
+
B -->|main| C[버전 체크]
|
|
33
|
+
B -->|태그| F[즉시 배포]
|
|
34
|
+
C -->|변경됨| D[테스트 & 빌드]
|
|
35
|
+
C -->|동일함| E[배포 스킵]
|
|
36
|
+
D --> F[NPM 배포]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 수동 배포 방법
|
|
40
|
+
|
|
41
|
+
#### 1. 버전 업데이트 후 main 브랜치 배포
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 버전 업데이트
|
|
45
|
+
npm version patch # 또는 minor, major
|
|
46
|
+
|
|
47
|
+
# main 브랜치에 push (자동 배포됨)
|
|
48
|
+
git push origin main
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
#### 2. 태그를 통한 배포
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 버전 업데이트
|
|
55
|
+
npm version patch
|
|
56
|
+
|
|
57
|
+
# 태그와 함께 push (즉시 배포됨)
|
|
58
|
+
git push origin main --tags
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 환경 변수 설정
|
|
62
|
+
|
|
63
|
+
GitHub Repository Settings에서 다음 Secret을 설정해야 합니다:
|
|
64
|
+
|
|
65
|
+
- `NPM_TOKEN`: NPM 계정의 액세스 토큰
|
|
66
|
+
|
|
67
|
+
### 지원 런타임
|
|
68
|
+
|
|
69
|
+
- **Node.js 20.x**: 메인 런타임
|
|
70
|
+
- **Bun Latest**: 성능 테스트 및 대안 빌드
|
|
71
|
+
|
|
72
|
+
### 빌드 산출물
|
|
73
|
+
|
|
74
|
+
- TypeScript 컴파일된 JavaScript 파일들
|
|
75
|
+
- 타입 정의 파일 (.d.ts)
|
|
76
|
+
- 소스맵 파일
|
|
77
|
+
|
|
78
|
+
### 주의사항
|
|
79
|
+
|
|
80
|
+
1. **버전 관리**: package.json의 버전을 먼저 업데이트해야 배포됩니다
|
|
81
|
+
2. **테스트 통과**: 모든 테스트가 통과해야 배포가 진행됩니다
|
|
82
|
+
3. **권한**: NPM_TOKEN이 올바르게 설정되어야 합니다
|