@channeulparks/woorido-skills 1.0.0 β 1.1.1
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/README.md +9 -16
- package/bin/cli.js +70 -20
- package/package.json +3 -3
- package/templates/.claude/skills/woorido/SKILL.md +57 -7
package/README.md
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
# woorido-skills
|
|
1
|
+
# @channeulparks/woorido-skills
|
|
2
2
|
|
|
3
3
|
WooriDo AI Coding Rules for Claude, Gemini, Antigravity and other AI coding assistants.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npx woorido-skills install
|
|
8
|
+
npx @channeulparks/woorido-skills install
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
This will install:
|
|
12
12
|
- `.claude/skills/woorido/SKILL.md` - Unified coding rules
|
|
13
13
|
- `.agent/workflows/*.md` - Antigravity slash commands
|
|
14
14
|
|
|
15
|
+
## Uninstall
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @channeulparks/woorido-skills uninstall
|
|
19
|
+
```
|
|
20
|
+
|
|
15
21
|
## Usage
|
|
16
22
|
|
|
17
23
|
### Antigravity (Primary)
|
|
@@ -45,25 +51,12 @@ Skills are automatically loaded from `.claude/skills/`.
|
|
|
45
51
|
- WDS (WooriDo Design System) - CSS Modules + CSS Variables
|
|
46
52
|
- React Query (server state) + Zustand (client state)
|
|
47
53
|
- react-hook-form + zod
|
|
48
|
-
- Radix UI
|
|
54
|
+
- Radix UI + vaul + sonner + Framer Motion
|
|
49
55
|
|
|
50
56
|
### Backend
|
|
51
57
|
- Spring Boot 3.2 + Java 21 + MyBatis + Oracle
|
|
52
58
|
- Django 5.0 + DRF + Elasticsearch
|
|
53
59
|
|
|
54
|
-
## Available Workflows
|
|
55
|
-
|
|
56
|
-
| Command | Description |
|
|
57
|
-
|---------|-------------|
|
|
58
|
-
| `/component` | WDS-based React component |
|
|
59
|
-
| `/api-hook` | React Query hook |
|
|
60
|
-
| `/form` | Form with validation |
|
|
61
|
-
| `/page` | Page component |
|
|
62
|
-
| `/test` | Vitest tests |
|
|
63
|
-
| `/spring-api` | Spring Boot REST API |
|
|
64
|
-
| `/mybatis` | MyBatis mapper + XML |
|
|
65
|
-
| `/django-view` | Django REST viewset |
|
|
66
|
-
|
|
67
60
|
## License
|
|
68
61
|
|
|
69
62
|
MIT
|
package/bin/cli.js
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* WooriDo Skills CLI
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
* npx woorido-skills install
|
|
8
|
-
* npx woorido-skills
|
|
9
|
-
* npx woorido-skills list
|
|
7
|
+
* npx @channeulparks/woorido-skills install
|
|
8
|
+
* npx @channeulparks/woorido-skills uninstall
|
|
9
|
+
* npx @channeulparks/woorido-skills list
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
const fs = require('fs');
|
|
@@ -29,14 +29,14 @@ const colors = {
|
|
|
29
29
|
*/
|
|
30
30
|
function copyRecursive(src, dest, dryRun = false) {
|
|
31
31
|
const files = [];
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
function walk(srcPath, destPath) {
|
|
34
34
|
const entries = fs.readdirSync(srcPath, { withFileTypes: true });
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
for (const entry of entries) {
|
|
37
37
|
const srcFile = path.join(srcPath, entry.name);
|
|
38
38
|
const destFile = path.join(destPath, entry.name);
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
if (entry.isDirectory()) {
|
|
41
41
|
if (!dryRun && !fs.existsSync(destFile)) {
|
|
42
42
|
fs.mkdirSync(destFile, { recursive: true });
|
|
@@ -48,7 +48,7 @@ function copyRecursive(src, dest, dryRun = false) {
|
|
|
48
48
|
dest: destFile,
|
|
49
49
|
relativeDest: path.relative(TARGET_DIR, destFile),
|
|
50
50
|
});
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
if (!dryRun) {
|
|
53
53
|
const destDir = path.dirname(destFile);
|
|
54
54
|
if (!fs.existsSync(destDir)) {
|
|
@@ -59,7 +59,7 @@ function copyRecursive(src, dest, dryRun = false) {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
walk(src, dest);
|
|
64
64
|
return files;
|
|
65
65
|
}
|
|
@@ -69,25 +69,25 @@ function copyRecursive(src, dest, dryRun = false) {
|
|
|
69
69
|
*/
|
|
70
70
|
function install(options = {}) {
|
|
71
71
|
const { dryRun = false } = options;
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
console.log();
|
|
74
74
|
console.log(colors.blue('π WooriDo Skills Installer'));
|
|
75
75
|
console.log();
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
if (dryRun) {
|
|
78
78
|
console.log(colors.yellow('π Dry run mode - no files will be created'));
|
|
79
79
|
console.log();
|
|
80
80
|
}
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
const files = copyRecursive(TEMPLATES_DIR, TARGET_DIR, dryRun);
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
console.log(colors.dim('Installing files:'));
|
|
85
85
|
console.log();
|
|
86
|
-
|
|
86
|
+
|
|
87
87
|
for (const file of files) {
|
|
88
88
|
console.log(` ${colors.green('β')} ${file.relativeDest}`);
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
|
|
91
91
|
console.log();
|
|
92
92
|
console.log(colors.green(`β¨ Done! ${files.length} files installed.`));
|
|
93
93
|
console.log();
|
|
@@ -101,6 +101,49 @@ function install(options = {}) {
|
|
|
101
101
|
console.log();
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Uninstall command
|
|
106
|
+
*/
|
|
107
|
+
function uninstall(options = {}) {
|
|
108
|
+
const { dryRun = false } = options;
|
|
109
|
+
|
|
110
|
+
console.log();
|
|
111
|
+
console.log(colors.blue('ποΈ WooriDo Skills Uninstaller'));
|
|
112
|
+
console.log();
|
|
113
|
+
|
|
114
|
+
if (dryRun) {
|
|
115
|
+
console.log(colors.yellow('π Dry run mode - no files will be deleted'));
|
|
116
|
+
console.log();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const pathsToDelete = [
|
|
120
|
+
path.join(TARGET_DIR, '.claude', 'skills', 'woorido'),
|
|
121
|
+
path.join(TARGET_DIR, '.agent', 'workflows'),
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
let deletedCount = 0;
|
|
125
|
+
|
|
126
|
+
for (const targetPath of pathsToDelete) {
|
|
127
|
+
if (fs.existsSync(targetPath)) {
|
|
128
|
+
console.log(` ${colors.red('β')} Removing ${path.relative(TARGET_DIR, targetPath)}`);
|
|
129
|
+
if (!dryRun) {
|
|
130
|
+
fs.rmSync(targetPath, { recursive: true, force: true });
|
|
131
|
+
}
|
|
132
|
+
deletedCount++;
|
|
133
|
+
} else {
|
|
134
|
+
console.log(` ${colors.dim('β')} ${path.relative(TARGET_DIR, targetPath)} (not found)`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
console.log();
|
|
139
|
+
if (deletedCount > 0) {
|
|
140
|
+
console.log(colors.green(`β¨ Done! Removed ${deletedCount} directories.`));
|
|
141
|
+
} else {
|
|
142
|
+
console.log(colors.yellow('No WooriDo skills found to uninstall.'));
|
|
143
|
+
}
|
|
144
|
+
console.log();
|
|
145
|
+
}
|
|
146
|
+
|
|
104
147
|
/**
|
|
105
148
|
* List command
|
|
106
149
|
*/
|
|
@@ -108,11 +151,11 @@ function list() {
|
|
|
108
151
|
console.log();
|
|
109
152
|
console.log(colors.blue('π¦ WooriDo Skills'));
|
|
110
153
|
console.log();
|
|
111
|
-
|
|
154
|
+
|
|
112
155
|
console.log(colors.dim('Unified SKILL.md:'));
|
|
113
156
|
console.log(' .claude/skills/woorido/SKILL.md');
|
|
114
157
|
console.log();
|
|
115
|
-
|
|
158
|
+
|
|
116
159
|
console.log(colors.dim('Antigravity Workflows:'));
|
|
117
160
|
const workflows = [
|
|
118
161
|
'/component - Create WDS React component',
|
|
@@ -124,7 +167,7 @@ function list() {
|
|
|
124
167
|
'/mybatis - Create MyBatis mapper',
|
|
125
168
|
'/django-view - Create Django DRF viewset',
|
|
126
169
|
];
|
|
127
|
-
|
|
170
|
+
|
|
128
171
|
for (const wf of workflows) {
|
|
129
172
|
console.log(` ${wf}`);
|
|
130
173
|
}
|
|
@@ -140,13 +183,17 @@ function help() {
|
|
|
140
183
|
console.log();
|
|
141
184
|
console.log('Commands:');
|
|
142
185
|
console.log(' install Install skills to current directory');
|
|
143
|
-
console.log('
|
|
186
|
+
console.log(' uninstall Remove installed skills');
|
|
144
187
|
console.log(' list List available skills and workflows');
|
|
145
188
|
console.log(' help Show this help message');
|
|
146
189
|
console.log();
|
|
190
|
+
console.log('Options:');
|
|
191
|
+
console.log(' --dry-run Show what would happen without making changes');
|
|
192
|
+
console.log();
|
|
147
193
|
console.log('Examples:');
|
|
148
|
-
console.log(' npx woorido-skills install');
|
|
149
|
-
console.log(' npx woorido-skills
|
|
194
|
+
console.log(' npx @channeulparks/woorido-skills install');
|
|
195
|
+
console.log(' npx @channeulparks/woorido-skills uninstall');
|
|
196
|
+
console.log(' npx @channeulparks/woorido-skills list');
|
|
150
197
|
console.log();
|
|
151
198
|
}
|
|
152
199
|
|
|
@@ -164,6 +211,9 @@ switch (command) {
|
|
|
164
211
|
case 'install':
|
|
165
212
|
install(options);
|
|
166
213
|
break;
|
|
214
|
+
case 'uninstall':
|
|
215
|
+
uninstall(options);
|
|
216
|
+
break;
|
|
167
217
|
case 'list':
|
|
168
218
|
list();
|
|
169
219
|
break;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@channeulparks/woorido-skills",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "WooriDo AI Coding Rules for Claude, Gemini, Antigravity and other AI coding assistants",
|
|
5
5
|
"main": "bin/cli.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"templates"
|
|
12
12
|
],
|
|
13
13
|
"scripts": {
|
|
14
|
-
"test": "node bin/cli.js
|
|
14
|
+
"test": "node bin/cli.js list"
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
17
|
"ai",
|
|
@@ -32,4 +32,4 @@
|
|
|
32
32
|
"type": "git",
|
|
33
33
|
"url": "https://github.com/ParkChanNul/woorido-skills"
|
|
34
34
|
}
|
|
35
|
-
}
|
|
35
|
+
}
|
|
@@ -197,23 +197,73 @@ export function CreateChallengeForm() {
|
|
|
197
197
|
|
|
198
198
|
<!-- CSS λ³μλ‘ μ μλ WDS ν ν° μ°Έμ‘° -->
|
|
199
199
|
|
|
200
|
-
**Colors:**
|
|
200
|
+
**Colors (Primary & Grey):**
|
|
201
201
|
- `--color-orange-500` (#E9481E) - Primary brand
|
|
202
|
-
- `--color-
|
|
203
|
-
- `--color-
|
|
202
|
+
- `--color-orange-600` (#D43D16) - Hover state
|
|
203
|
+
- `--color-grey-50` ~ `--color-grey-900` - Warm grey scale
|
|
204
|
+
- `--color-success` (#16A34A) / `--color-warning` (#F59E0B) / `--color-error` (#DC2626)
|
|
205
|
+
|
|
206
|
+
**Financial Colors:**
|
|
207
|
+
- `--color-income` (#F59E0B) - μ
κΈ, μΆ©μ , μ΄μ΅ (+)
|
|
208
|
+
- `--color-expense` (#1C1917) - μ§μΆ, μΆκΈ (-)
|
|
209
|
+
- `--color-locked` (#78716C) - 보μ¦κΈ, μ κΈ΄ κΈμ‘
|
|
210
|
+
|
|
211
|
+
**Brix Colors (λΉλ μμ€ν
):**
|
|
212
|
+
- `--color-brix-honey` (#F59E0B) - 60+ π―
|
|
213
|
+
- `--color-brix-grape` (#9333EA) - 40~60 π
|
|
214
|
+
- `--color-brix-apple` (#F43F5E) - 25~40 π
|
|
215
|
+
- `--color-brix-mandarin` (#E9481E) - 12~25 π
|
|
216
|
+
- `--color-brix-tomato` (#FCA5A5) - 0~12 π
|
|
217
|
+
- `--color-brix-bitter` (#14532D) - <0 π₯
|
|
204
218
|
|
|
205
219
|
**Typography:**
|
|
206
|
-
- `--font-w1`
|
|
207
|
-
- `--font-
|
|
220
|
+
- `--font-w1` (28px/Bold) - λ§μΌν
ν€λλΌμΈ
|
|
221
|
+
- `--font-w2` (24px/SemiBold) - νλ©΄ νμ΄ν
|
|
222
|
+
- `--font-w3` (20px/SemiBold) - μΉμ
ν€λ
|
|
223
|
+
- `--font-w4` (17px/Regular) - λ³Έλ¬Έ (Default)
|
|
224
|
+
- `--font-w5` (15px/Regular) - 보쑰 본문
|
|
225
|
+
- `--font-w6` (13px/Medium) - μΊ‘μ
, λΌλ²¨
|
|
226
|
+
- `--font-w7` (11px/Medium) - μμ μΊ‘μ
|
|
227
|
+
- `--font-financial-large/medium/small` - κΈμ‘ νμ (tabular-nums)
|
|
208
228
|
|
|
209
229
|
**Shape:**
|
|
210
|
-
- `--radius-sm/md/lg
|
|
230
|
+
- `--radius-sm` (8px) / `--radius-md` (12px) / `--radius-lg` (20px) / `--radius-xl` (24px)
|
|
211
231
|
- `--shadow-sm/md/lg/xl` - Elevation
|
|
212
232
|
|
|
213
233
|
**Motion:**
|
|
214
|
-
- `--motion-duration-fast/normal/slow`
|
|
234
|
+
- `--motion-duration-fast` (150ms) / `--motion-duration-normal` (250ms) / `--motion-duration-slow` (400ms)
|
|
215
235
|
- `--motion-ease-standard/decel/accel/spring`
|
|
216
236
|
|
|
237
|
+
### 2.5 Overlay Libraries
|
|
238
|
+
|
|
239
|
+
<!-- BottomSheet, Toast, Animation λΌμ΄λΈλ¬λ¦¬ -->
|
|
240
|
+
|
|
241
|
+
| μ©λ | λΌμ΄λΈλ¬λ¦¬ | μ¬μ©λ² |
|
|
242
|
+
|------|------------|--------|
|
|
243
|
+
| BottomSheet | `vaul` | `<Drawer.Root>` |
|
|
244
|
+
| Toast | `sonner` | `toast('λ©μμ§')` |
|
|
245
|
+
| Animation | `framer-motion` | `<motion.div>` |
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
// BottomSheet μμ
|
|
249
|
+
import { Drawer } from 'vaul';
|
|
250
|
+
|
|
251
|
+
<Drawer.Root>
|
|
252
|
+
<Drawer.Trigger>Open</Drawer.Trigger>
|
|
253
|
+
<Drawer.Portal>
|
|
254
|
+
<Drawer.Overlay className={styles.overlay} />
|
|
255
|
+
<Drawer.Content className={styles.content}>
|
|
256
|
+
{/* Content */}
|
|
257
|
+
</Drawer.Content>
|
|
258
|
+
</Drawer.Portal>
|
|
259
|
+
</Drawer.Root>
|
|
260
|
+
|
|
261
|
+
// Toast μμ
|
|
262
|
+
import { toast } from 'sonner';
|
|
263
|
+
toast.success('μ μ₯λμμ΅λλ€');
|
|
264
|
+
toast.error('μ€λ₯κ° λ°μνμ΅λλ€');
|
|
265
|
+
```
|
|
266
|
+
|
|
217
267
|
---
|
|
218
268
|
|
|
219
269
|
## 3. Backend Rules (Spring Boot)
|