@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 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 install --dry-run
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(' install --dry-run Show files without installing');
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 list');
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.0.0",
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 install --dry-run"
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-grey-*` - Warm grey scale
203
- - `--color-success/warning/error` - Status
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` ~ `--font-w7` - Text scale
207
- - `--font-financial-*` - Money display
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/xl/full` - Border radius
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)