Skip to content

Commit bec501a

Browse files
committed
feat: Implement Packmate configuration loader and package manager detection
- Added to load configurations from and . - Introduced to identify available package managers (npm, yarn, pnpm) and handle lock files. - Created for installing and uninstalling packages using the detected package manager. - Developed for managing user interactions regarding package updates and unused packages. - Implemented to analyze and identify unused packages in the project. - Added to check for package updates and manage versioning. - Created to capture warnings during command execution.
1 parent 8de4d6d commit bec501a

File tree

12 files changed

+4590
-2494
lines changed

12 files changed

+4590
-2494
lines changed

โ€ŽREADME.ko.mdโ€Ž

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
<h1 align="center">
2+
<br>
3+
<img src="https://github.com/ljlm0402/packmate/raw/images/logo.png" alt="Project Logo" width="800" />
4+
<br>
5+
<br>
6+
PackMate
7+
<br>
8+
</h1>
9+
10+
<h4 align="center">โ™ป๏ธ ์Šค๋งˆํŠธํ•˜๊ณ  ์นœ๊ทผํ•œ ์˜์กด์„ฑ ์—…๋ฐ์ดํŠธ ๋ฐ ์ •๋ฆฌ CLI ๋„๊ตฌ</h4>
11+
12+
<p align ="center">
13+
<a href="https://nodei.co/npm/packmate" target="_blank">
14+
<img src="https://nodei.co/npm/packmate.png" alt="npm Info" />
15+
</a>
16+
17+
</p>
18+
19+
<p align="center">
20+
<a href="http://npm.im/packmate" target="_blank">
21+
<img src="https://img.shields.io/npm/v/packmate.svg" alt="npm Version" />
22+
</a>
23+
<a href="http://npm.im/packmate" target="_blank">
24+
<img src="https://img.shields.io/github/v/release/ljlm0402/packmate" alt="npm Release Version" />
25+
</a>
26+
<a href="http://npm.im/packmate" target="_blank">
27+
<img src="https://img.shields.io/npm/dm/packmate.svg" alt="npm Downloads" />
28+
</a>
29+
<a href="http://npm.im/packmate" target="_blank">
30+
<img src="https://img.shields.io/npm/l/packmate.svg" alt="npm Package License" />
31+
</a>
32+
</p>
33+
34+
<p align="center">
35+
<a href="https://github.com/ljlm0402/packmate/stargazers" target="_blank">
36+
<img src="https://img.shields.io/github/stars/ljlm0402/packmate" alt="github Stars" />
37+
</a>
38+
<a href="https://github.com/ljlm0402/packmate/network/members" target="_blank">
39+
<img src="https://img.shields.io/github/forks/ljlm0402/packmate" alt="github Forks" />
40+
</a>
41+
<a href="https://github.com/ljlm0402/packmate/stargazers" target="_blank">
42+
<img src="https://img.shields.io/github/contributors/ljlm0402/packmate" alt="github Contributors" />
43+
</a>
44+
<a href="https://github.com/ljlm0402/packmate/issues" target="_blank">
45+
<img src="https://img.shields.io/github/issues/ljlm0402/packmate" alt="github Issues" />
46+
</a>
47+
</p>
48+
49+
<br />
50+
51+
---
52+
53+
[English](./README.md) | **ํ•œ๊ตญ์–ด**
54+
55+
Packmate๋Š” Node.js ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌ, ์—…๋ฐ์ดํŠธ ๋ฐ ์ •๋ฆฌํ•˜๋Š” ํ˜„๋Œ€์ ์ธ CLI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
56+
**npm**, **pnpm**, **yarn**์„ ์ง€์›ํ•˜๋ฉฐ, ์ง๊ด€์ ์ธ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ UI์™€ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
57+
58+
## ๐Ÿค– ์™œ Packmate์ธ๊ฐ€์š”?
59+
60+
- **โšก ์„ฑ๋Šฅ**: 3๋‹จ๊ณ„ ์บ์‹ฑ ์‹œ์Šคํ…œ์œผ๋กœ 6๋ฐฐ ๋” ๋น ๋ฆ„ (๋ฉ”๋ชจ๋ฆฌ + ๋””์Šคํฌ + ๋„คํŠธ์›Œํฌ)
61+
- **๐ŸŽฏ ์ •ํ™•์„ฑ**: ๊ฐœ๋ฐœ ๋„๊ตฌ ์ธํ…”๋ฆฌ์ „์Šค๋กœ 90% ์ด์ƒ์˜ ๋ฏธ์‚ฌ์šฉ ํŒจํ‚ค์ง€ ํƒ์ง€
62+
- **๐Ÿ›ก๏ธ ์•ˆ์ „์„ฑ**: ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์Šค๋งˆํŠธ ํด๋ฐฑ, ๋ฏธ์‚ฌ์šฉ ํŒจํ‚ค์ง€๋Š” ์—…๋ฐ์ดํŠธ ์ œ์™ธ
63+
- **๐ŸŽจ ๋ช…๋ฃŒ์„ฑ**: ๊ทธ๋ฃน๋ณ„ UI ์„ธ์…˜ (Patch/Minor/Major) ๋ฐ ์ƒ‰์ƒ ์ฝ”๋”ฉ ์—…๋ฐ์ดํŠธ
64+
- **๐Ÿ”ง ์œ ์—ฐ์„ฑ**: `packmate.config.json`์„ ํ†ตํ•œ ์™„์ „ํ•œ ์„ค์ • ์ง€์›
65+
- **๐ŸŒ ํ˜„๋Œ€์ **: ๊น”๋”ํ•˜๊ณ  ์ „๋ฌธ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ง๊ด€์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ
66+
67+
## ๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ
68+
69+
### ์„ฑ๋Šฅ ๋ฐ ์ตœ์ ํ™”
70+
- **3๋‹จ๊ณ„ ์บ์‹ฑ ์‹œ์Šคํ…œ**: ๋ฉ”๋ชจ๋ฆฌ โ†’ ๋””์Šคํฌ (1์‹œ๊ฐ„ TTL) โ†’ ๋„คํŠธ์›Œํฌ
71+
- ์ฒซ ์‹คํ–‰: ํ‘œ์ค€ ์†๋„
72+
- ๋‘ ๋ฒˆ์งธ ์‹คํ–‰: ์บ์‹œ๋œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ **6๋ฐฐ ๋น ๋ฆ„**
73+
- **๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ**: ํŒŒ์ผ ์Šค์บ”์„ ์œ„ํ•œ ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU ํ™œ์šฉ (**2-4๋ฐฐ ๋น ๋ฆ„**)
74+
- **์ ์‘ํ˜• ๋™์‹œ์„ฑ**: CPU ์ฝ”์–ด ๊ธฐ๋ฐ˜ ๋™์  ์š”์ฒญ ์ œํ•œ (8-16 ๋™์‹œ ์š”์ฒญ)
75+
76+
### ์Šค๋งˆํŠธ ํƒ์ง€
77+
- **ํ–ฅ์ƒ๋œ ๋ฏธ์‚ฌ์šฉ ํŒจํ‚ค์ง€ ํƒ์ง€** (90% ์ด์ƒ ์ •ํ™•๋„):
78+
- ๋™์  import ํƒ์ง€: `import('module')`
79+
- ์กฐ๊ฑด๋ถ€ require ํƒ์ง€: `try-catch`, `if` ๋ธ”๋ก
80+
- DevDependencies ์ธํ…”๋ฆฌ์ „์Šค: ๋นŒ๋“œ ๋„๊ตฌ, ๋ฆฐํ„ฐ, ํƒ€์ž… ์ •์˜ ์ธ์‹
81+
- ๊ต์ฐจ ๊ฒ€์ฆ: precinct + depcheck๋กœ ๋†’์€ ์‹ ๋ขฐ๋„
82+
- **์—…๋ฐ์ดํŠธ ํƒ์ง€**:
83+
- Patch/Minor/Major๋ณ„ ๊ทธ๋ฃนํ™” ๋ฐ ์ƒ‰์ƒ ์ฝ”๋”ฉ
84+
- ๋ฏธ์‚ฌ์šฉ ํŒจํ‚ค์ง€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ์ œ์•ˆ์—์„œ ์ œ์™ธ
85+
- Semver ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ๋น„๊ต
86+
- **์„ค์น˜ ํƒ์ง€**: ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ์„ค์น˜๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€ ์ฐพ๊ธฐ
87+
88+
### ๋›ฐ์–ด๋‚œ UI/UX
89+
- **๊ทธ๋ฃน๋ณ„ UI ์„ธ์…˜**:
90+
- ๐Ÿ”น **Patch ์—…๋ฐ์ดํŠธ** (๋…น์ƒ‰): ๋ฒ„๊ทธ ์ˆ˜์ •, ์•ˆ์ „ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ
91+
- ๐Ÿ”ธ **Minor ์—…๋ฐ์ดํŠธ** (๋…ธ๋ž€์ƒ‰): ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ, ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ์œ ์ง€
92+
- ๐Ÿ”ถ **Major ์—…๋ฐ์ดํŠธ** (๋นจ๊ฐ„์ƒ‰): ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ, ๊ฒ€ํ†  ํ•„์š”
93+
- ๐Ÿ—‘๏ธ **๋ฏธ์‚ฌ์šฉ ํŒจํ‚ค์ง€**: ๋†’์Œ/์ค‘๊ฐ„ ์‹ ๋ขฐ๋„ ๋ ˆ๋ฒจ
94+
- ๐Ÿ“ฅ **๋ฏธ์„ค์น˜ ํŒจํ‚ค์ง€**: ๋ˆ„๋ฝ๋œ ์„ ์–ธ ์˜์กด์„ฑ
95+
- โœ… **์ตœ์‹  ๋ฒ„์ „**: ์ •๋ณด ํ‘œ์‹œ ๋ชฉ๋ก (์„ ํƒ ๋ถˆ๊ฐ€)
96+
- **์•ˆ์ „ ๊ธฐ๋Šฅ**:
97+
- Major ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•œ ํ™•์ธ ํ”„๋กฌํ”„ํŠธ
98+
- ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ ๊ฒฝ๊ณ 
99+
- ๋ช…ํ™•ํ•œ ์ž‘์—… ์š”์•ฝ
100+
- **์‹œ๊ฐ์  ๊ฐœ์„ **:
101+
- ์ƒ‰์ƒ ์ฝ”๋”ฉ๋œ ๋ฒ„์ „ ๋ณ€๊ฒฝ
102+
- ๊ธด ์ž‘์—…์„ ์œ„ํ•œ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„
103+
- ๊ณ ์ •๋œ ์ฝ˜์†” ๋ฐ•์Šค ์ •๋ ฌ
104+
105+
### ์„ค์ • ๋ฐ ์œ ์—ฐ์„ฑ
106+
- **์Šค๋งˆํŠธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ํƒ์ง€**:
107+
- ๋ฝ ํŒŒ์ผ์—์„œ ์ž๋™ ํƒ์ง€ (pnpm-lock.yaml, yarn.lock, package-lock.json)
108+
- ์„ค์น˜ ์ƒํƒœ ํ™•์ธ
109+
- ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋งค๋‹ˆ์ €๋กœ ์ž๋™ ํด๋ฐฑ ๋ฐ ์œ ์šฉํ•œ ํŒ ์ œ๊ณต
110+
- **์„ค์ • ์˜ต์…˜**:
111+
- ์ปค์Šคํ…€ ๋ฌด์‹œ ํŒจํ„ด (glob ์ง€์›)
112+
- ๋ถ„์„ ๋ชจ๋“œ (conservative/moderate/aggressive)
113+
- UI ์ปค์Šคํ„ฐ๋งˆ์ด์ง• (๊ธฐ๋ณธ ์„ ํƒ, ์ƒ‰์ƒ ์Šคํ‚ด)
114+
- ์บ์‹œ ์„ค์ • (๊ธฐ๊ฐ„, ์œ„์น˜)
115+
116+
## ๐Ÿ’พ ์„ค์น˜
117+
118+
```sh
119+
npm install -g packmate
120+
# ๋˜๋Š”
121+
pnpm add -g packmate
122+
# ๋˜๋Š”
123+
yarn global add packmate
124+
```
125+
126+
์ฆ‰์‹œ ์‹คํ–‰:
127+
128+
```sh
129+
npx packmate
130+
```
131+
132+
## ๐Ÿ“ ์‚ฌ์šฉ๋ฒ•
133+
134+
ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰ํ•˜์„ธ์š”:
135+
136+
```sh
137+
packmate
138+
```
139+
140+
**์ผ๋ฐ˜์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ ์˜ˆ์‹œ:**
141+
142+
```sh
143+
โ”Œ ๐Ÿ“ฆ Packmate: Dependency Updates & Cleanup
144+
โ”‚
145+
โ—‡ Info โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
146+
โ”‚ Package Manager: npm โ”‚
147+
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
148+
โ”‚
149+
Progress |โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 17/17 (100%)
150+
โ—‡ โœ… Found 3 packages with available updates
151+
โ—‡ โœ… Unused package analysis complete
152+
โ—‡ โœ… Found 0 not installed packages
153+
154+
๐Ÿ“Š Analysis Results:
155+
Updates available: 3
156+
Unused: 1
157+
Not installed: 0
158+
Up-to-date: 13
159+
160+
๐Ÿ”ถ Major Updates (3)
161+
โš ๏ธ Breaking changes possible - Review carefully
162+
โ”‚
163+
โ—‡ Select major updates (caution required):
164+
โ”‚ โ—ผ globby 13.2.2 โ†’ 15.0.0 [MAJOR]
165+
โ”‚ โ—ป p-retry 6.2.1 โ†’ 7.1.0 [MAJOR]
166+
โ”‚ โ—ป precinct 10.0.1 โ†’ 12.2.0 [MAJOR]
167+
โ”‚
168+
โš ๏ธ Proceed with 1 major update(s)? Breaking changes may be included.
169+
โ”‚ Yes
170+
โ”‚
171+
๐Ÿ—‘๏ธ Unused Packages (High Confidence: 1)
172+
Safe to remove
173+
โ”‚
174+
โ—‡ Select packages to remove:
175+
โ”‚ none
176+
โ”‚
177+
โ—‡ Show already up-to-date packages (13)?
178+
โ”‚ No
179+
โ”‚
180+
โ—‡ Actions โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
181+
โ”‚ ๐Ÿ“ Actions to execute: โ”‚
182+
โ”‚ - update: globby@15.0.0 โ”‚
183+
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
184+
โ”‚
185+
> npm install globby@15.0.0
186+
โœ”๏ธ Package update completed: globby@15.0.0
187+
188+
โœ… Complete:
189+
Updated: 1
190+
Removed: 0
191+
Installed: 0
192+
โ”‚
193+
โ”” Packmate complete! ๐ŸŽ‰
194+
```
195+
196+
## โš™๏ธ ์š”๊ตฌ์‚ฌํ•ญ
197+
198+
- Node.js v16 ์ด์ƒ (v18+ ๊ถŒ์žฅ)
199+
- npm, yarn, pnpm ์ง€์›
200+
- Mac, Linux, Windows์—์„œ ์ž‘๋™
201+
202+
## ๐Ÿ”‘ CLI ์˜ต์…˜
203+
204+
์ถ”๊ฐ€ ์˜ต์…˜ ์—†์ด ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ packmate๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
205+
๋ชจ๋“  ์„ ํƒ(์—…๋ฐ์ดํŠธ, ์ œ๊ฑฐ, ์„ค์น˜)์€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
206+
207+
## โš™๏ธ ์„ค์ •
208+
209+
Packmate๋Š” `packmate.config.json` ๋˜๋Š” `package.json`์˜ `packmate` ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
210+
211+
### `packmate.config.json` ์˜ˆ์‹œ:
212+
213+
```json
214+
{
215+
"ignorePatterns": ["@types/*", "eslint-*"],
216+
"analysisMode": {
217+
"unused": "moderate",
218+
"devDeps": true
219+
},
220+
"ui": {
221+
"groupSessions": true,
222+
"colorScheme": "auto",
223+
"defaultChecked": {
224+
"updateAvailable": true,
225+
"unused": false,
226+
"notInstalled": true,
227+
"latest": false
228+
}
229+
},
230+
"detection": {
231+
"dynamicImport": true,
232+
"conditionalRequire": true,
233+
"ignoreUnused": [
234+
"eslint",
235+
"prettier",
236+
"jest",
237+
"webpack"
238+
]
239+
}
240+
}
241+
```
242+
243+
### ์„ค์ • ์˜ต์…˜:
244+
245+
- **ignorePatterns**: ํŒจํ‚ค์ง€ ๋ฌด์‹œ๋ฅผ ์œ„ํ•œ glob ํŒจํ„ด ๋ฐฐ์—ด (์˜ˆ: `["@types/*"]`)
246+
- **analysisMode.unused**: ํƒ์ง€ ๋ชจ๋“œ - `"conservative"` | `"moderate"` | `"aggressive"`
247+
- **analysisMode.devDeps**: devDependencies๋ฅผ ๋ณ„๋„๋กœ ๋ถ„์„ํ• ์ง€ ์—ฌ๋ถ€
248+
- **ui.groupSessions**: ๊ทธ๋ฃน๋ณ„ UI ์„ธ์…˜ ํ™œ์„ฑํ™” (Patch/Minor/Major)
249+
- **ui.defaultChecked**: ๊ฐ ํŒจํ‚ค์ง€ ์œ ํ˜•์˜ ๊ธฐ๋ณธ ์„ ํƒ ์ƒํƒœ
250+
- **detection.dynamicImport**: ๋™์  import ํƒ์ง€ ํ™œ์„ฑํ™”
251+
- **detection.conditionalRequire**: ์กฐ๊ฑด๋ถ€ require ํƒ์ง€ ํ™œ์„ฑํ™”
252+
- **detection.ignoreUnused**: ๋ฏธ์‚ฌ์šฉ ํƒ์ง€์—์„œ ํ•ญ์ƒ ๋ฌด์‹œํ•  ํŒจํ‚ค์ง€ ๋ชฉ๋ก
253+
254+
### ์บ์‹œ ๊ด€๋ฆฌ
255+
256+
Packmate๋Š” ๋” ๋น ๋ฅธ ํ›„์† ์‹คํ–‰์„ ์œ„ํ•ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์‘๋‹ต์„ ์ž๋™์œผ๋กœ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
257+
258+
```bash
259+
# Windows
260+
del /q %TEMP%\packmate-cache\*
261+
262+
# Linux/Mac
263+
rm -rf /tmp/packmate-cache/*
264+
```
265+
266+
์บ์‹œ ์œ„์น˜:
267+
- Windows: `C:\Users\<user>\AppData\Local\Temp\packmate-cache`
268+
- Linux/Mac: `/tmp/packmate-cache`
269+
270+
## ๐Ÿง‘โ€๐Ÿ’ป ๊ธฐ์—ฌํ•˜๊ธฐ
271+
272+
PR๊ณผ ์ด์Šˆ๋Š” ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!
273+
274+
- ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”.
275+
- ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” [Conventional Commits](https://www.conventionalcommits.org/ko/v1.0.0/)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
276+
- ๋ฒ„๊ทธ๋‚˜ ์ œ์•ˆ ์‚ฌํ•ญ์€ [GitHub Issues](https://github.com/ljlm0402/packmate/issues)๋ฅผ ํ†ตํ•ด ์ œ์ถœํ•˜์„ธ์š”.
277+
278+
## ๐Ÿ“„ ๋ผ์ด์„ ์Šค
279+
280+
MIT ยฉ [AGUMON (ljlm0402)](mailto:ljlm0402@gmail.com)
281+
282+
## ๐ŸŒŽ ๋งํฌ
283+
284+
- [GitHub](https://github.com/ljlm0402/packmate)
285+
- [npm](https://www.npmjs.com/package/packmate)

0 commit comments

Comments
ย (0)