@blastlabs/utils 1.16.0 β 1.18.0
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 +83 -0
- package/bin/init-ai-rules.cjs +34 -7
- package/package.json +1 -1
- package/rules/changelog.md +60 -0
- package/rules/documentation.md +9 -0
- package/rules/entities-layer.md +2 -1
- package/rules/react-hooks.md +5 -2
- package/rules/shared-layer.md +2 -1
- package/rules/testing.md +4 -2
- package/rules/typescript-standards.md +3 -2
- package/rules/views-layer.md +2 -1
package/README.md
CHANGED
|
@@ -255,6 +255,89 @@ function App() {
|
|
|
255
255
|
import type { FormDevToolsProps, ApiLogEntry } from '@blastlabs/utils/components/dev';
|
|
256
256
|
```
|
|
257
257
|
|
|
258
|
+
## π CLI λꡬ
|
|
259
|
+
|
|
260
|
+
μ΄ ν¨ν€μ§λ νλ‘μ νΈ μ€μ μ μλννλ CLI λꡬλ₯Ό μ 곡ν©λλ€.
|
|
261
|
+
|
|
262
|
+
### FSD Entity Generator
|
|
263
|
+
|
|
264
|
+
Feature-Sliced Design μν€ν
μ²μ© μν°ν° μ€μΊν΄λ©μ μλμΌλ‘ μμ±ν©λλ€.
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
# entities ν΄λλ‘ μ΄λ
|
|
268
|
+
cd src/entities
|
|
269
|
+
|
|
270
|
+
# μν°ν° μμ±
|
|
271
|
+
npx blastlabs-generate-entity user
|
|
272
|
+
npx blastlabs-generate-entity my-new-entity
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**μμ±λλ ꡬ쑰:**
|
|
276
|
+
```
|
|
277
|
+
user/
|
|
278
|
+
βββ index.ts
|
|
279
|
+
βββ api/
|
|
280
|
+
β βββ get-user-list.ts
|
|
281
|
+
β βββ get-user-detail.ts
|
|
282
|
+
β βββ user-queries.ts
|
|
283
|
+
β βββ index.ts
|
|
284
|
+
β βββ mapper/
|
|
285
|
+
β β βββ map-user.ts
|
|
286
|
+
β β βββ map-user-detail.ts
|
|
287
|
+
β βββ query/
|
|
288
|
+
β βββ user-list-query.ts
|
|
289
|
+
βββ model/
|
|
290
|
+
βββ user.ts
|
|
291
|
+
βββ user-detail.ts
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**νΉμ§:**
|
|
295
|
+
- TanStack Query queryOptions ν¨ν΄ μ§μ
|
|
296
|
+
- Zod μ€ν€λ§ μλ μμ±
|
|
297
|
+
- API mapper ν¨ν΄ μ μ©
|
|
298
|
+
- TypeScript νμ
μμ μ± λ³΄μ₯
|
|
299
|
+
|
|
300
|
+
### AI Rules Installer
|
|
301
|
+
|
|
302
|
+
Cursor, Claude Codeμ© AI κ·μΉμ νλ‘μ νΈμ μ€μΉν©λλ€.
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
# νλ‘μ νΈ λ£¨νΈμμ μ€ν
|
|
306
|
+
npx blastlabs-init-ai-rules [options]
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**μ΅μ
:**
|
|
310
|
+
- `--fsd` - FSD μν€ν
μ² κ·μΉ ν¬ν¨
|
|
311
|
+
- `--all` - λͺ¨λ κ·μΉ μ€μΉ (base + fsd)
|
|
312
|
+
- `--list, -l` - μ€μΉ κ°λ₯ν κ·μΉ λͺ©λ‘ 보기
|
|
313
|
+
- `--help, -h` - λμλ§ λ³΄κΈ°
|
|
314
|
+
|
|
315
|
+
**μμ:**
|
|
316
|
+
```bash
|
|
317
|
+
# κΈ°λ³Έ κ·μΉλ§ μ€μΉ
|
|
318
|
+
npx blastlabs-init-ai-rules
|
|
319
|
+
|
|
320
|
+
# FSD μν€ν
μ² κ·μΉ ν¬ν¨
|
|
321
|
+
npx blastlabs-init-ai-rules --fsd
|
|
322
|
+
|
|
323
|
+
# λͺ¨λ κ·μΉ μ€μΉ
|
|
324
|
+
npx blastlabs-init-ai-rules --all
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**μ€μΉλλ νμΌ:**
|
|
328
|
+
```
|
|
329
|
+
.cursor/rules/*.mdc # Cursorμ© κ·μΉ
|
|
330
|
+
.claude/rules/*.md # Claude Codeμ© κ·μΉ
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**ν¬ν¨λ κ·μΉ:**
|
|
334
|
+
- TypeScript νμ€
|
|
335
|
+
- React Hooks κ°μ΄λλΌμΈ
|
|
336
|
+
- ν
μ€νΈ μμ± κ°μ΄λ
|
|
337
|
+
- λ¬Έμν κ°μ΄λλΌμΈ
|
|
338
|
+
- Git μ»€λ° μ»¨λ²€μ
|
|
339
|
+
- FSD μν€ν
μ² (μ ν)
|
|
340
|
+
|
|
258
341
|
## μ£Όμμ¬ν
|
|
259
342
|
|
|
260
343
|
- **κ°λ°μ© μ»΄ν¬λνΈ(`components/dev`)λ νλ‘λμ
νκ²½μμ μ μΈνλ κ²μ κΆμ₯ν©λλ€.**
|
package/bin/init-ai-rules.cjs
CHANGED
|
@@ -11,6 +11,7 @@ const RULE_CATEGORIES = {
|
|
|
11
11
|
"react-hooks.md",
|
|
12
12
|
"testing.md",
|
|
13
13
|
"documentation.md",
|
|
14
|
+
"changelog.md",
|
|
14
15
|
"git-commit.md",
|
|
15
16
|
],
|
|
16
17
|
// FSD μν€ν
μ² κ·μΉ
|
|
@@ -94,10 +95,13 @@ function parseFrontmatter(content) {
|
|
|
94
95
|
const body = match[2];
|
|
95
96
|
|
|
96
97
|
const frontmatter = {};
|
|
98
|
+
let currentKey = null;
|
|
99
|
+
|
|
97
100
|
for (const line of yamlBlock.split("\n")) {
|
|
101
|
+
// ν€-κ° μ νμ±
|
|
98
102
|
const kvMatch = line.match(/^(\w+):\s*(.*)$/);
|
|
99
103
|
if (kvMatch) {
|
|
100
|
-
|
|
104
|
+
currentKey = kvMatch[1];
|
|
101
105
|
let value = kvMatch[2].trim();
|
|
102
106
|
|
|
103
107
|
if (value === "true") value = true;
|
|
@@ -112,7 +116,18 @@ function parseFrontmatter(content) {
|
|
|
112
116
|
}
|
|
113
117
|
|
|
114
118
|
if (value !== undefined) {
|
|
115
|
-
frontmatter[
|
|
119
|
+
frontmatter[currentKey] = value;
|
|
120
|
+
}
|
|
121
|
+
} else if (line.startsWith(" -") && currentKey) {
|
|
122
|
+
// λ°°μ΄ κ° μ²λ¦¬ (paths λ±)
|
|
123
|
+
const arrayValueMatch = line.match(/^\s*-\s*"([^"]+)"\s*$/);
|
|
124
|
+
if (arrayValueMatch) {
|
|
125
|
+
const arrayValue = arrayValueMatch[1];
|
|
126
|
+
// νμ¬ ν€μ κ°μ΄ λ°°μ΄μ΄ μλλ©΄ λ°°μ΄λ‘ μ΄κΈ°ν
|
|
127
|
+
if (!Array.isArray(frontmatter[currentKey])) {
|
|
128
|
+
frontmatter[currentKey] = [];
|
|
129
|
+
}
|
|
130
|
+
frontmatter[currentKey].push(arrayValue);
|
|
116
131
|
}
|
|
117
132
|
}
|
|
118
133
|
}
|
|
@@ -125,9 +140,14 @@ function serializeCursorFrontmatter(frontmatter) {
|
|
|
125
140
|
if (frontmatter.description) {
|
|
126
141
|
yaml += `description: ${frontmatter.description}\n`;
|
|
127
142
|
}
|
|
128
|
-
|
|
129
|
-
|
|
143
|
+
// Cursorλ globs μ¬μ© (pathsλ₯Ό globsλ‘ λ³ν)
|
|
144
|
+
// λ°°μ΄μΈ κ²½μ° μΌνλ‘ κ΅¬λΆλ ν μ€λ‘ λ³ν
|
|
145
|
+
const globs = frontmatter.globs || frontmatter.paths;
|
|
146
|
+
if (globs) {
|
|
147
|
+
const globsStr = Array.isArray(globs) ? globs.join(",") : globs;
|
|
148
|
+
yaml += `globs: "${globsStr}"\n`;
|
|
130
149
|
}
|
|
150
|
+
// alwaysApplyλ Cursor μ μ©
|
|
131
151
|
if (frontmatter.alwaysApply !== undefined) {
|
|
132
152
|
yaml += `alwaysApply: ${frontmatter.alwaysApply}\n`;
|
|
133
153
|
}
|
|
@@ -140,9 +160,16 @@ function serializeClaudeFrontmatter(frontmatter) {
|
|
|
140
160
|
if (frontmatter.description) {
|
|
141
161
|
yaml += `description: "${frontmatter.description}"\n`;
|
|
142
162
|
}
|
|
143
|
-
//
|
|
144
|
-
if (frontmatter.
|
|
145
|
-
|
|
163
|
+
// pathsλ νμ μ μ©λμ§ μλ κ²½μ°μλ§ ν¬ν¨
|
|
164
|
+
if (frontmatter.paths && frontmatter.alwaysApply !== true) {
|
|
165
|
+
if (Array.isArray(frontmatter.paths)) {
|
|
166
|
+
yaml += "paths:\n";
|
|
167
|
+
for (const p of frontmatter.paths) {
|
|
168
|
+
yaml += ` - "${p}"\n`;
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
yaml += `paths:\n - "${frontmatter.paths}"\n`;
|
|
172
|
+
}
|
|
146
173
|
}
|
|
147
174
|
// alwaysApplyλ Claudeμμ μ¬μ©νμ§ μμΌλ―λ‘ μλ΅
|
|
148
175
|
yaml += "---\n";
|
package/package.json
CHANGED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Changelog μμ± κ·μΉ"
|
|
3
|
+
globs: "CHANGELOG.md"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Changelog Rules
|
|
8
|
+
|
|
9
|
+
## νμ κ·μΉ
|
|
10
|
+
|
|
11
|
+
- [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) νμ μ€μ
|
|
12
|
+
- Semantic Versioning μ€μ
|
|
13
|
+
- μ΅μ λ³κ²½μ¬νμ `[Unreleased]` μΉμ
μ μΆκ°
|
|
14
|
+
|
|
15
|
+
## μΉμ
ꡬ쑰
|
|
16
|
+
|
|
17
|
+
```markdown
|
|
18
|
+
# Changelog
|
|
19
|
+
|
|
20
|
+
## [Unreleased]
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- μλ‘μ΄ κΈ°λ₯
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- κΈ°μ‘΄ κΈ°λ₯μ λ³κ²½
|
|
27
|
+
|
|
28
|
+
### Deprecated
|
|
29
|
+
- κ³§ μ κ±°λ κΈ°λ₯
|
|
30
|
+
|
|
31
|
+
### Removed
|
|
32
|
+
- μ κ±°λ κΈ°λ₯
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
- λ²κ·Έ μμ
|
|
36
|
+
|
|
37
|
+
### Security
|
|
38
|
+
- 보μ ν¨μΉ
|
|
39
|
+
|
|
40
|
+
## [1.0.0] - 2024-01-01
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## λ²μ λ¦΄λ¦¬μ¦ μ
|
|
44
|
+
|
|
45
|
+
1. `[Unreleased]` λ΄μ©μ μ λ²μ μΉμ
μΌλ‘ μ΄λ
|
|
46
|
+
2. λ¦΄λ¦¬μ¦ λ μ§ μΆκ°
|
|
47
|
+
3. μλ‘μ΄ `[Unreleased]` μΉμ
μμ±
|
|
48
|
+
|
|
49
|
+
```markdown
|
|
50
|
+
## [Unreleased]
|
|
51
|
+
|
|
52
|
+
## [1.1.0] - 2024-02-01
|
|
53
|
+
### Added
|
|
54
|
+
- μ΄μ μ Unreleasedμ μλ λ΄μ©
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## μ€μ
|
|
58
|
+
|
|
59
|
+
- **Always** update CHANGELOG.md when making changes
|
|
60
|
+
- λ°°ν¬ μ λ°λμ changelog νμΈ
|
package/rules/documentation.md
CHANGED
|
@@ -15,7 +15,16 @@ alwaysApply: false
|
|
|
15
15
|
|
|
16
16
|
- κΈ°λ₯ μΆκ° μ README.md μ
λ°μ΄νΈ
|
|
17
17
|
- μ hooks μΆκ° μ κ΄λ ¨ docs/*.md μ
λ°μ΄νΈ
|
|
18
|
+
- λ³κ²½μ¬νμ λ°λμ CHANGELOG.mdμ κΈ°λ‘
|
|
19
|
+
|
|
20
|
+
## CHANGELOG μμ±
|
|
21
|
+
|
|
22
|
+
- [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) νμ μ€μ
|
|
23
|
+
- μ΅μ λ³κ²½μ¬νμ `[Unreleased]` μΉμ
μ μΆκ°
|
|
24
|
+
- μΉμ
: Added, Changed, Deprecated, Removed, Fixed, Security
|
|
25
|
+
- λ²μ λ¦΄λ¦¬μ¦ μ `[Unreleased]`λ₯Ό ν΄λΉ λ²μ μΌλ‘ μ΄λ
|
|
18
26
|
|
|
19
27
|
## νμ μ¬ν
|
|
20
28
|
|
|
21
29
|
- **Always** update documentation when adding features
|
|
30
|
+
- **Always** update CHANGELOG.md for any changes
|
package/rules/entities-layer.md
CHANGED
package/rules/react-hooks.md
CHANGED
package/rules/shared-layer.md
CHANGED
package/rules/testing.md
CHANGED