@lenne.tech/cli 1.2.0 → 1.3.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/build/commands/claude/install-plugin.js +339 -0
- package/package.json +1 -1
- package/build/commands/claude/install-commands.js +0 -337
- package/build/commands/claude/install-mcps.js +0 -258
- package/build/commands/claude/install-skills.js +0 -693
- package/build/lib/mcp-registry.js +0 -80
- package/build/templates/claude-commands/code-cleanup.md +0 -82
- package/build/templates/claude-commands/commit-message.md +0 -21
- package/build/templates/claude-commands/create-story.md +0 -435
- package/build/templates/claude-commands/mr-description-clipboard.md +0 -48
- package/build/templates/claude-commands/mr-description.md +0 -33
- package/build/templates/claude-commands/sec-review.md +0 -62
- package/build/templates/claude-commands/skill-optimize.md +0 -481
- package/build/templates/claude-commands/test-generate.md +0 -45
- package/build/templates/claude-skills/building-stories-with-tdd/SKILL.md +0 -265
- package/build/templates/claude-skills/building-stories-with-tdd/code-quality.md +0 -276
- package/build/templates/claude-skills/building-stories-with-tdd/database-indexes.md +0 -182
- package/build/templates/claude-skills/building-stories-with-tdd/examples.md +0 -1383
- package/build/templates/claude-skills/building-stories-with-tdd/handling-existing-tests.md +0 -197
- package/build/templates/claude-skills/building-stories-with-tdd/reference.md +0 -1427
- package/build/templates/claude-skills/building-stories-with-tdd/security-review.md +0 -307
- package/build/templates/claude-skills/building-stories-with-tdd/workflow.md +0 -1004
- package/build/templates/claude-skills/generating-nest-servers/SKILL.md +0 -303
- package/build/templates/claude-skills/generating-nest-servers/configuration.md +0 -285
- package/build/templates/claude-skills/generating-nest-servers/declare-keyword-warning.md +0 -133
- package/build/templates/claude-skills/generating-nest-servers/description-management.md +0 -226
- package/build/templates/claude-skills/generating-nest-servers/examples.md +0 -893
- package/build/templates/claude-skills/generating-nest-servers/framework-guide.md +0 -259
- package/build/templates/claude-skills/generating-nest-servers/quality-review.md +0 -864
- package/build/templates/claude-skills/generating-nest-servers/reference.md +0 -487
- package/build/templates/claude-skills/generating-nest-servers/security-rules.md +0 -371
- package/build/templates/claude-skills/generating-nest-servers/verification-checklist.md +0 -262
- package/build/templates/claude-skills/generating-nest-servers/workflow-process.md +0 -1061
- package/build/templates/claude-skills/using-lt-cli/SKILL.md +0 -284
- package/build/templates/claude-skills/using-lt-cli/examples.md +0 -546
- package/build/templates/claude-skills/using-lt-cli/reference.md +0 -513
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: nest-server-generator-declare-keyword
|
|
3
|
-
version: 1.0.0
|
|
4
|
-
description: Critical warning about using the declare keyword in TypeScript classes
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# 🚨 CRITICAL: NEVER USE `declare` KEYWORD FOR PROPERTIES
|
|
8
|
-
|
|
9
|
-
## Table of Contents
|
|
10
|
-
- [WRONG - Using `declare`](#-wrong---using-declare)
|
|
11
|
-
- [CORRECT - Without `declare`](#-correct---without-declare)
|
|
12
|
-
- [Why This Matters](#why-this-matters)
|
|
13
|
-
- [When You Might Be Tempted to Use `declare`](#when-you-might-be-tempted-to-use-declare)
|
|
14
|
-
- [Correct Approach Instead](#correct-approach-instead)
|
|
15
|
-
- [Examples](#examples)
|
|
16
|
-
- [Remember](#remember)
|
|
17
|
-
|
|
18
|
-
**⚠️ IMPORTANT RULE: DO NOT use the `declare` keyword when defining properties in classes!**
|
|
19
|
-
|
|
20
|
-
The `declare` keyword in TypeScript signals that a property is only a type declaration without a runtime value. This prevents decorators from being properly applied and overridden.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## ❌ WRONG - Using `declare`
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
export class ProductCreateInput extends ProductInput {
|
|
28
|
-
declare name: string; // ❌ WRONG - Decorator won't be applied!
|
|
29
|
-
declare price: number; // ❌ WRONG - Decorator won't be applied!
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## ✅ CORRECT - Without `declare`
|
|
36
|
-
|
|
37
|
-
```typescript
|
|
38
|
-
export class ProductCreateInput extends ProductInput {
|
|
39
|
-
@UnifiedField({ description: 'Product name' })
|
|
40
|
-
name: string; // ✅ CORRECT - Decorator works properly
|
|
41
|
-
|
|
42
|
-
@UnifiedField({ description: 'Product price' })
|
|
43
|
-
price: number; // ✅ CORRECT - Decorator works properly
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## Why This Matters
|
|
50
|
-
|
|
51
|
-
1. **Decorators require actual properties**: `@UnifiedField()`, `@Restricted()`, and other decorators need actual property declarations to attach metadata
|
|
52
|
-
2. **Override behavior**: When extending classes, using `declare` prevents decorators from being properly overridden
|
|
53
|
-
3. **Runtime behavior**: `declare` properties don't exist at runtime, breaking the decorator system
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## When You Might Be Tempted to Use `declare`
|
|
58
|
-
|
|
59
|
-
- ❌ When extending a class and wanting to change a decorator
|
|
60
|
-
- ❌ When TypeScript shows "property is declared but never used"
|
|
61
|
-
- ❌ When dealing with inheritance and property redefinition
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## Correct Approach Instead
|
|
66
|
-
|
|
67
|
-
Use the `override` keyword (when appropriate) but NEVER `declare`:
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
export class ProductCreateInput extends ProductInput {
|
|
71
|
-
// ✅ Use override when useDefineForClassFields is enabled
|
|
72
|
-
override name: string;
|
|
73
|
-
|
|
74
|
-
// ✅ Apply decorators directly - they will override parent decorators
|
|
75
|
-
@UnifiedField({ description: 'Product name', isOptional: false })
|
|
76
|
-
override price: number;
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## Examples
|
|
83
|
-
|
|
84
|
-
### ❌ WRONG - Using declare
|
|
85
|
-
|
|
86
|
-
```typescript
|
|
87
|
-
// This will BREAK decorator functionality
|
|
88
|
-
export class AddressInput extends Address {
|
|
89
|
-
declare street: string;
|
|
90
|
-
declare city: string;
|
|
91
|
-
declare zipCode: string;
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### ✅ CORRECT - Without declare
|
|
96
|
-
|
|
97
|
-
```typescript
|
|
98
|
-
// This works properly
|
|
99
|
-
export class AddressInput extends Address {
|
|
100
|
-
@UnifiedField({ description: 'Street' })
|
|
101
|
-
street: string;
|
|
102
|
-
|
|
103
|
-
@UnifiedField({ description: 'City' })
|
|
104
|
-
city: string;
|
|
105
|
-
|
|
106
|
-
@UnifiedField({ description: 'Zip code' })
|
|
107
|
-
zipCode: string;
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### ✅ CORRECT - With override
|
|
112
|
-
|
|
113
|
-
```typescript
|
|
114
|
-
// This also works when extending decorated properties
|
|
115
|
-
export class AddressInput extends Address {
|
|
116
|
-
@UnifiedField({ description: 'Street', isOptional: false })
|
|
117
|
-
override street: string;
|
|
118
|
-
|
|
119
|
-
@UnifiedField({ description: 'City', isOptional: false })
|
|
120
|
-
override city: string;
|
|
121
|
-
|
|
122
|
-
@UnifiedField({ description: 'Zip code', isOptional: true })
|
|
123
|
-
override zipCode?: string;
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## Remember
|
|
130
|
-
|
|
131
|
-
**`declare` = no decorators = broken functionality!**
|
|
132
|
-
|
|
133
|
-
Always use actual property declarations with decorators, optionally with the `override` keyword when extending classes.
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: nest-server-generator-description-management
|
|
3
|
-
version: 1.0.0
|
|
4
|
-
description: Guidelines for consistent description management across all generated components
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# 🚨 CRITICAL: Description Management
|
|
8
|
-
|
|
9
|
-
## Table of Contents
|
|
10
|
-
- [Step 1: ALWAYS Extract Descriptions from User Input](#-step-1-always-extract-descriptions-from-user-input)
|
|
11
|
-
- [Step 2: Format Descriptions Correctly](#-step-2-format-descriptions-correctly)
|
|
12
|
-
- [Step 3: Apply Descriptions EVERYWHERE (Most Critical!)](#-step-3-apply-descriptions-everywhere-most-critical)
|
|
13
|
-
- [Common Mistakes to AVOID](#-common-mistakes-to-avoid)
|
|
14
|
-
- [Verification Checklist](#-verification-checklist)
|
|
15
|
-
- [If You Forget](#-if-you-forget)
|
|
16
|
-
- [Quick Reference](#quick-reference)
|
|
17
|
-
|
|
18
|
-
**⚠️ COMMON MISTAKE:** Descriptions are often applied inconsistently or only partially. You MUST follow this process for EVERY component.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## 🔍 Step 1: ALWAYS Extract Descriptions from User Input
|
|
23
|
-
|
|
24
|
-
**BEFORE generating ANY code, scan the user's specification for description hints:**
|
|
25
|
-
|
|
26
|
-
1. **Look for comments after `//`**:
|
|
27
|
-
```
|
|
28
|
-
Module: Product
|
|
29
|
-
- name: string // Product name
|
|
30
|
-
- price: number // Produktpreis
|
|
31
|
-
- stock?: number // Current stock level
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
2. **Extract ALL comments** and store them for each property
|
|
35
|
-
3. **Identify language** (English or German)
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## 📝 Step 2: Format Descriptions Correctly
|
|
40
|
-
|
|
41
|
-
**Rule**: `"ENGLISH_DESCRIPTION (DEUTSCHE_BESCHREIBUNG)"`
|
|
42
|
-
|
|
43
|
-
### Processing Logic
|
|
44
|
-
|
|
45
|
-
| User Input | Language | Formatted Description |
|
|
46
|
-
|------------|----------|----------------------|
|
|
47
|
-
| `// Product name` | English | `'Product name'` |
|
|
48
|
-
| `// Produktname` | German | `'Product name (Produktname)'` |
|
|
49
|
-
| `// Straße` | German | `'Street (Straße)'` |
|
|
50
|
-
| `// Postleizahl` (typo) | German | `'Postal code (Postleitzahl)'` |
|
|
51
|
-
| (no comment) | - | Create meaningful English description |
|
|
52
|
-
|
|
53
|
-
### ⚠️ CRITICAL - Preserving Original Text
|
|
54
|
-
|
|
55
|
-
**1. Fix spelling errors ONLY:**
|
|
56
|
-
- ✅ Correct typos: `Postleizahl` → `Postleitzahl` (missing 't')
|
|
57
|
-
- ✅ Fix character errors: `Starße` → `Straße` (wrong character)
|
|
58
|
-
- ✅ Correct English typos: `Prodcut name` → `Product name`
|
|
59
|
-
|
|
60
|
-
**2. DO NOT change the wording:**
|
|
61
|
-
- ❌ NEVER rephrase: `Straße` → `Straßenname` (NO!)
|
|
62
|
-
- ❌ NEVER expand: `Produkt` → `Produktbezeichnung` (NO!)
|
|
63
|
-
- ❌ NEVER improve: `Name` → `Full name` (NO!)
|
|
64
|
-
- ❌ NEVER translate differently: `Name` → `Title` (NO!)
|
|
65
|
-
|
|
66
|
-
**3. Why this is critical:**
|
|
67
|
-
- User comments may be **predefined terms** from requirements
|
|
68
|
-
- External systems may **reference these exact terms**
|
|
69
|
-
- Changing wording breaks **external integrations**
|
|
70
|
-
|
|
71
|
-
### Examples
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
✅ CORRECT:
|
|
75
|
-
// Straße → 'Street (Straße)' (only translated)
|
|
76
|
-
// Starße → 'Street (Straße)' (typo fixed, then translated)
|
|
77
|
-
// Produkt → 'Product (Produkt)' (keep original word)
|
|
78
|
-
// Strasse → 'Street (Straße)' (ss→ß corrected, then translated)
|
|
79
|
-
|
|
80
|
-
❌ WRONG:
|
|
81
|
-
// Straße → 'Street name (Straßenname)' (changed wording!)
|
|
82
|
-
// Produkt → 'Product name (Produktname)' (added word!)
|
|
83
|
-
// Name → 'Full name (Vollständiger Name)' (rephrased!)
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
**Rule Summary**: Fix typos, preserve wording, translate accurately.
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## ✅ Step 3: Apply Descriptions EVERYWHERE (Most Critical!)
|
|
91
|
-
|
|
92
|
-
**🚨 YOU MUST apply the SAME description to ALL of these locations:**
|
|
93
|
-
|
|
94
|
-
### For Module Properties
|
|
95
|
-
|
|
96
|
-
**1. Model file** (`<module>.model.ts`):
|
|
97
|
-
```typescript
|
|
98
|
-
@UnifiedField({ description: 'Product name (Produktname)' })
|
|
99
|
-
name: string;
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**2. Create Input** (`<module>-create.input.ts`):
|
|
103
|
-
```typescript
|
|
104
|
-
@UnifiedField({ description: 'Product name (Produktname)' })
|
|
105
|
-
name: string;
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**3. Update Input** (`<module>.input.ts`):
|
|
109
|
-
```typescript
|
|
110
|
-
@UnifiedField({ description: 'Product name (Produktname)' })
|
|
111
|
-
name?: string;
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### For SubObject Properties
|
|
115
|
-
|
|
116
|
-
**1. Object file** (`<object>.object.ts`):
|
|
117
|
-
```typescript
|
|
118
|
-
@UnifiedField({ description: 'Street (Straße)' })
|
|
119
|
-
street: string;
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
**2. Object Create Input** (`<object>-create.input.ts`):
|
|
123
|
-
```typescript
|
|
124
|
-
@UnifiedField({ description: 'Street (Straße)' })
|
|
125
|
-
street: string;
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**3. Object Update Input** (`<object>.input.ts`):
|
|
129
|
-
```typescript
|
|
130
|
-
@UnifiedField({ description: 'Street (Straße)' })
|
|
131
|
-
street?: string;
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### For Object/Module Type Decorators
|
|
135
|
-
|
|
136
|
-
Apply descriptions to the class decorators as well:
|
|
137
|
-
|
|
138
|
-
```typescript
|
|
139
|
-
@ObjectType({ description: 'Address information (Adressinformationen)' })
|
|
140
|
-
export class Address { ... }
|
|
141
|
-
|
|
142
|
-
@InputType({ description: 'Address information (Adressinformationen)' })
|
|
143
|
-
export class AddressInput { ... }
|
|
144
|
-
|
|
145
|
-
@ObjectType({ description: 'Product entity (Produkt-Entität)' })
|
|
146
|
-
export class Product extends CoreModel { ... }
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
---
|
|
150
|
-
|
|
151
|
-
## ⛔ Common Mistakes to AVOID
|
|
152
|
-
|
|
153
|
-
1. ❌ **Partial application**: Descriptions only in Models, not in Inputs
|
|
154
|
-
2. ❌ **Inconsistent format**: German-only in some places, English-only in others
|
|
155
|
-
3. ❌ **Missing descriptions**: No descriptions when user provided comments
|
|
156
|
-
4. ❌ **Ignoring Object inputs**: Forgetting to add descriptions to SubObject Input files
|
|
157
|
-
5. ❌ **Wrong format**: Using `(ENGLISH)` instead of `ENGLISH (DEUTSCH)`
|
|
158
|
-
6. ❌ **Changing wording**: Rephrasing user's original terms
|
|
159
|
-
7. ❌ **Adding words**: Expanding user's terminology
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## ✅ Verification Checklist
|
|
164
|
-
|
|
165
|
-
After generating code, ALWAYS verify:
|
|
166
|
-
|
|
167
|
-
- [ ] All user comments/descriptions extracted from specification
|
|
168
|
-
- [ ] All descriptions follow format: `"ENGLISH (DEUTSCH)"` or `"ENGLISH"`
|
|
169
|
-
- [ ] Model properties have descriptions
|
|
170
|
-
- [ ] Create Input properties have SAME descriptions
|
|
171
|
-
- [ ] Update Input properties have SAME descriptions
|
|
172
|
-
- [ ] Object properties have descriptions
|
|
173
|
-
- [ ] Object Input properties have SAME descriptions
|
|
174
|
-
- [ ] Class-level `@ObjectType()` and `@InputType()` have descriptions
|
|
175
|
-
- [ ] NO German-only descriptions (must be translated)
|
|
176
|
-
- [ ] NO inconsistencies between files
|
|
177
|
-
- [ ] Original wording preserved (only typos fixed)
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
## 🔄 If You Forget
|
|
182
|
-
|
|
183
|
-
**If you generate code and realize descriptions are missing or inconsistent:**
|
|
184
|
-
|
|
185
|
-
1. **STOP** - Don't continue with other phases
|
|
186
|
-
2. **Go back** and add/fix ALL descriptions
|
|
187
|
-
3. **Verify** using the checklist above
|
|
188
|
-
4. **Then continue** with remaining phases
|
|
189
|
-
|
|
190
|
-
**Remember**: Descriptions are NOT optional "nice-to-have" - they are MANDATORY for:
|
|
191
|
-
- API documentation (Swagger/GraphQL)
|
|
192
|
-
- Code maintainability
|
|
193
|
-
- Developer experience
|
|
194
|
-
- Bilingual projects (German/English teams)
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Quick Reference
|
|
199
|
-
|
|
200
|
-
### Format Rules
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
English input → 'Product name'
|
|
204
|
-
German input → 'Product name (Produktname)'
|
|
205
|
-
No input → Create meaningful description
|
|
206
|
-
Typo input → Fix typo, then translate
|
|
207
|
-
Mixed input → Standardize to 'ENGLISH (DEUTSCH)'
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### Application Checklist
|
|
211
|
-
|
|
212
|
-
For **each property**:
|
|
213
|
-
- [ ] Model file
|
|
214
|
-
- [ ] Create Input file
|
|
215
|
-
- [ ] Update Input file
|
|
216
|
-
|
|
217
|
-
For **each class**:
|
|
218
|
-
- [ ] @ObjectType() decorator
|
|
219
|
-
- [ ] @InputType() decorator (if applicable)
|
|
220
|
-
|
|
221
|
-
### Remember
|
|
222
|
-
|
|
223
|
-
- **Consistency is critical** - Same description everywhere
|
|
224
|
-
- **Preserve wording** - Only fix typos, never rephrase
|
|
225
|
-
- **Bilingual format** - Always use "ENGLISH (DEUTSCH)" for German terms
|
|
226
|
-
- **Verification** - Check all files before proceeding
|