create-ai-project 1.11.2 → 1.12.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/.claude/agents/acceptance-test-generator.md +179 -245
- package/.claude/agents/code-reviewer.md +3 -9
- package/.claude/agents/design-sync.md +221 -0
- package/.claude/agents/document-reviewer.md +15 -10
- package/.claude/agents/integration-test-reviewer.md +192 -0
- package/.claude/agents/prd-creator.md +10 -6
- package/.claude/agents/quality-fixer-frontend.md +324 -0
- package/.claude/agents/quality-fixer.md +48 -62
- package/.claude/agents/requirement-analyzer.md +8 -8
- package/.claude/agents/rule-advisor.md +84 -103
- package/.claude/agents/task-decomposer.md +21 -27
- package/.claude/agents/task-executor-frontend.md +264 -0
- package/.claude/agents/task-executor.md +4 -16
- package/.claude/agents/technical-designer-frontend.md +444 -0
- package/.claude/agents/technical-designer.md +52 -27
- package/.claude/agents/work-planner.md +41 -14
- package/.claude/agents-en/acceptance-test-generator.md +13 -13
- package/.claude/agents-en/code-reviewer.md +8 -10
- package/.claude/agents-en/design-sync.md +6 -5
- package/.claude/agents-en/document-reviewer.md +8 -7
- package/.claude/agents-en/integration-test-reviewer.md +5 -4
- package/.claude/agents-en/prd-creator.md +7 -6
- package/.claude/agents-en/quality-fixer-frontend.md +3 -14
- package/.claude/agents-en/quality-fixer.md +9 -20
- package/.claude/agents-en/requirement-analyzer.md +8 -7
- package/.claude/agents-en/rule-advisor.md +57 -128
- package/.claude/agents-en/task-decomposer.md +4 -10
- package/.claude/agents-en/task-executor-frontend.md +4 -16
- package/.claude/agents-en/task-executor.md +5 -16
- package/.claude/agents-en/technical-designer-frontend.md +17 -15
- package/.claude/agents-en/technical-designer.md +13 -15
- package/.claude/agents-en/work-planner.md +9 -14
- package/.claude/agents-ja/acceptance-test-generator.md +9 -15
- package/.claude/agents-ja/code-reviewer.md +3 -11
- package/.claude/agents-ja/design-sync.md +2 -6
- package/.claude/agents-ja/document-reviewer.md +4 -9
- package/.claude/agents-ja/integration-test-reviewer.md +2 -5
- package/.claude/agents-ja/prd-creator.md +3 -7
- package/.claude/agents-ja/quality-fixer-frontend.md +2 -13
- package/.claude/agents-ja/quality-fixer.md +7 -18
- package/.claude/agents-ja/requirement-analyzer.md +5 -8
- package/.claude/agents-ja/rule-advisor.md +57 -128
- package/.claude/agents-ja/task-decomposer.md +4 -10
- package/.claude/agents-ja/task-executor-frontend.md +3 -15
- package/.claude/agents-ja/task-executor.md +3 -17
- package/.claude/agents-ja/technical-designer-frontend.md +17 -15
- package/.claude/agents-ja/technical-designer.md +13 -15
- package/.claude/agents-ja/work-planner.md +9 -14
- package/.claude/commands/build.md +7 -10
- package/.claude/commands/design.md +15 -5
- package/.claude/commands/front-build.md +103 -0
- package/.claude/commands/front-design.md +42 -0
- package/.claude/commands/front-plan.md +40 -0
- package/.claude/commands/implement.md +23 -29
- package/.claude/commands/plan.md +4 -4
- package/.claude/commands/project-inject.md +4 -4
- package/.claude/{commands-ja/refine-rule.md → commands/refine-skill.md} +25 -25
- package/.claude/{commands-ja/sync-rules.md → commands/sync-skills.md} +28 -28
- package/.claude/commands/task.md +1 -1
- package/.claude/commands-en/build.md +2 -2
- package/.claude/commands-en/design.md +1 -1
- package/.claude/commands-en/implement.md +8 -8
- package/.claude/commands-en/plan.md +3 -3
- package/.claude/commands-en/project-inject.md +4 -4
- package/.claude/commands-en/{refine-rule.md → refine-skill.md} +47 -48
- package/.claude/commands-en/{sync-rules.md → sync-skills.md} +29 -29
- package/.claude/commands-ja/build.md +2 -2
- package/.claude/commands-ja/design.md +1 -1
- package/.claude/commands-ja/implement.md +8 -8
- package/.claude/commands-ja/plan.md +3 -3
- package/.claude/commands-ja/project-inject.md +4 -4
- package/.claude/{commands/refine-rule.md → commands-ja/refine-skill.md} +25 -25
- package/.claude/{commands/sync-rules.md → commands-ja/sync-skills.md} +28 -28
- package/.claude/settings.local.json +21 -1
- package/{docs/rules/ai-development-guide.md → .claude/skills/coding-standards/SKILL.md} +94 -108
- package/{docs/rules/documentation-criteria.md → .claude/skills/documentation-criteria/SKILL.md} +19 -6
- package/.claude/skills/documentation-criteria/references/adr-template.md +64 -0
- package/.claude/skills/documentation-criteria/references/design-template.md +242 -0
- package/.claude/skills/documentation-criteria/references/plan-template.md +130 -0
- package/.claude/skills/documentation-criteria/references/prd-template.md +109 -0
- package/.claude/skills/frontend/technical-spec/SKILL.md +147 -0
- package/.claude/skills/frontend/typescript-rules/SKILL.md +315 -0
- package/.claude/skills/frontend/typescript-testing/SKILL.md +212 -0
- package/{docs/rules-ja/architecture/implementation-approach.md → .claude/skills/implementation-approach/SKILL.md} +10 -5
- package/.claude/skills/integration-e2e-testing/SKILL.md +146 -0
- package/{docs/rules-ja/project-context.md → .claude/skills/project-context/SKILL.md} +7 -3
- package/.claude/skills/subagents-orchestration-guide/SKILL.md +212 -0
- package/.claude/skills/task-analyzer/SKILL.md +142 -0
- package/.claude/skills/task-analyzer/references/skills-index.yaml +211 -0
- package/.claude/skills/technical-spec/SKILL.md +86 -0
- package/{docs/rules/typescript.md → .claude/skills/typescript-rules/SKILL.md} +22 -67
- package/.claude/skills/typescript-testing/SKILL.md +155 -0
- package/{docs/rules-en/coding-standards.md → .claude/skills-en/coding-standards/SKILL.md} +21 -108
- package/{docs/rules-en/documentation-criteria.md → .claude/skills-en/documentation-criteria/SKILL.md} +40 -42
- package/{docs/adr/template-en.md → .claude/skills-en/documentation-criteria/references/adr-template.md} +1 -1
- package/{docs/design/template-en.md → .claude/skills-en/documentation-criteria/references/design-template.md} +11 -31
- package/{docs/plans/template-en.md → .claude/skills-en/documentation-criteria/references/plan-template.md} +4 -4
- package/{docs/prd/template-en.md → .claude/skills-en/documentation-criteria/references/prd-template.md} +1 -1
- package/{docs/rules-en/frontend/technical-spec.md → .claude/skills-en/frontend/technical-spec/SKILL.md} +17 -13
- package/{docs/rules-en/frontend/typescript.md → .claude/skills-en/frontend/typescript-rules/SKILL.md} +17 -12
- package/{docs/rules-en/frontend/typescript-testing.md → .claude/skills-en/frontend/typescript-testing/SKILL.md} +11 -6
- package/{docs/rules-en/architecture/implementation-approach.md → .claude/skills-en/implementation-approach/SKILL.md} +7 -2
- package/{docs/rules-en/integration-e2e-testing.md → .claude/skills-en/integration-e2e-testing/SKILL.md} +15 -18
- package/{docs/rules-en/project-context.md → .claude/skills-en/project-context/SKILL.md} +7 -3
- package/.claude/skills-en/subagents-orchestration-guide/SKILL.md +224 -0
- package/.claude/skills-en/task-analyzer/SKILL.md +131 -0
- package/{docs/rules-en/rules-index.yaml → .claude/skills-en/task-analyzer/references/skills-index.yaml} +34 -20
- package/{docs/rules-en/technical-spec.md → .claude/skills-en/technical-spec/SKILL.md} +6 -6
- package/{docs/rules-en/typescript.md → .claude/skills-en/typescript-rules/SKILL.md} +15 -10
- package/{docs/rules-en/typescript-testing.md → .claude/skills-en/typescript-testing/SKILL.md} +10 -4
- package/{docs/rules-ja/coding-standards.md → .claude/skills-ja/coding-standards/SKILL.md} +12 -99
- package/{docs/rules-ja/documentation-criteria.md → .claude/skills-ja/documentation-criteria/SKILL.md} +18 -5
- package/.claude/skills-ja/documentation-criteria/references/adr-template.md +64 -0
- package/.claude/skills-ja/documentation-criteria/references/design-template.md +261 -0
- package/{docs/plans/template-ja.md → .claude/skills-ja/documentation-criteria/references/plan-template.md} +38 -38
- package/{docs/prd/template-ja.md → .claude/skills-ja/documentation-criteria/references/prd-template.md} +33 -33
- package/{docs/rules-ja/frontend/technical-spec.md → .claude/skills-ja/frontend/technical-spec/SKILL.md} +13 -9
- package/.claude/skills-ja/frontend/typescript-rules/SKILL.md +315 -0
- package/{docs/rules-ja/frontend/typescript-testing.md → .claude/skills-ja/frontend/typescript-testing/SKILL.md} +93 -5
- package/{docs/rules/architecture/implementation-approach.md → .claude/skills-ja/implementation-approach/SKILL.md} +10 -5
- package/{docs/rules-ja/integration-e2e-testing.md → .claude/skills-ja/integration-e2e-testing/SKILL.md} +5 -8
- package/{docs/rules/project-context.md → .claude/skills-ja/project-context/SKILL.md} +7 -3
- package/.claude/skills-ja/subagents-orchestration-guide/SKILL.md +212 -0
- package/.claude/skills-ja/task-analyzer/SKILL.md +131 -0
- package/{docs/rules-ja/rules-index.yaml → .claude/skills-ja/task-analyzer/references/skills-index.yaml} +34 -19
- package/{docs/rules-ja/technical-spec.md → .claude/skills-ja/technical-spec/SKILL.md} +6 -6
- package/{docs/rules-ja/typescript.md → .claude/skills-ja/typescript-rules/SKILL.md} +16 -11
- package/{docs/rules-ja/typescript-testing.md → .claude/skills-ja/typescript-testing/SKILL.md} +11 -5
- package/CLAUDE.en.md +6 -6
- package/CLAUDE.ja.md +6 -6
- package/CLAUDE.md +19 -28
- package/README.ja.md +39 -10
- package/README.md +39 -10
- package/package.json +1 -1
- package/scripts/set-language.js +35 -53
- package/scripts/setup-project.js +4 -1
- package/docs/adr/template-ja.md +0 -64
- package/docs/design/template-ja.md +0 -285
- package/docs/guides/en/sub-agents.md +0 -343
- package/docs/guides/ja/sub-agents.md +0 -343
- package/docs/guides/sub-agents.md +0 -306
- package/docs/plans/20250123-integration-test-improvement.md +0 -993
- package/docs/rules/rules-index.yaml +0 -137
- package/docs/rules/technical-spec.md +0 -47
- package/docs/rules/typescript-testing.md +0 -188
- package/docs/rules-ja/frontend/typescript.md +0 -131
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coding-standards
|
|
3
|
+
description: Language-agnostic coding principles for maintainability, readability, and quality. Use when implementing features, refactoring code, or reviewing code quality.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Universal Coding Standards
|
|
2
7
|
|
|
3
8
|
## Technical Anti-patterns (Red Flag Patterns)
|
|
@@ -22,8 +27,8 @@ Immediately stop and reconsider design when detecting the following patterns:
|
|
|
22
27
|
|
|
23
28
|
## Basic Principles
|
|
24
29
|
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
- **Aggressive Refactoring** - Prevent technical debt and maintain health
|
|
31
|
+
- **No Unused "Just in Case" Code** - Violates YAGNI principle (Kent Beck)
|
|
27
32
|
|
|
28
33
|
## Comment Writing Rules
|
|
29
34
|
|
|
@@ -63,16 +68,6 @@ How to handle duplicate code based on Martin Fowler's "Refactoring":
|
|
|
63
68
|
- Significant readability decrease from commonalization
|
|
64
69
|
- Simple helpers in test code
|
|
65
70
|
|
|
66
|
-
### Implementation Example
|
|
67
|
-
```typescript
|
|
68
|
-
// ❌ Immediate commonalization on 1st duplication
|
|
69
|
-
function validateUserEmail(email: string) { /* ... */ }
|
|
70
|
-
function validateContactEmail(email: string) { /* ... */ }
|
|
71
|
-
|
|
72
|
-
// ✅ Commonalize on 3rd occurrence
|
|
73
|
-
function validateEmail(email: string, context: 'user' | 'contact' | 'admin') { /* ... */ }
|
|
74
|
-
```
|
|
75
|
-
|
|
76
71
|
## Common Failure Patterns and Avoidance Methods
|
|
77
72
|
|
|
78
73
|
### Pattern 1: Error Fix Chain
|
|
@@ -95,11 +90,6 @@ function validateEmail(email: string, context: 'user' | 'contact' | 'admin') { /
|
|
|
95
90
|
**Cause**: Assuming "it should work according to official documentation" without prior investigation
|
|
96
91
|
**Avoidance**:
|
|
97
92
|
- Record certainty evaluation at the beginning of task files
|
|
98
|
-
```
|
|
99
|
-
Certainty: low (Reason: no examples of MCP connection found)
|
|
100
|
-
Exploratory implementation: true
|
|
101
|
-
Fallback: use conventional API
|
|
102
|
-
```
|
|
103
93
|
- For low certainty cases, create minimal verification code first
|
|
104
94
|
|
|
105
95
|
### Pattern 5: Insufficient Existing Code Investigation
|
|
@@ -107,9 +97,9 @@ function validateEmail(email: string, context: 'user' | 'contact' | 'admin') { /
|
|
|
107
97
|
**Cause**: Insufficient understanding of existing code before implementation
|
|
108
98
|
**Avoidance Methods**:
|
|
109
99
|
- Before implementation, always search for similar functionality (using domain, responsibility, configuration patterns as keywords)
|
|
110
|
-
- Similar functionality found
|
|
111
|
-
- Similar functionality is technical debt
|
|
112
|
-
- No similar functionality exists
|
|
100
|
+
- Similar functionality found -> Use that implementation (do not create new implementation)
|
|
101
|
+
- Similar functionality is technical debt -> Create ADR improvement proposal before implementation
|
|
102
|
+
- No similar functionality exists -> Implement new functionality following existing design philosophy
|
|
113
103
|
- Record all decisions and rationale in "Existing Codebase Analysis" section of Design Doc
|
|
114
104
|
|
|
115
105
|
## Debugging Techniques
|
|
@@ -122,8 +112,8 @@ function validateEmail(email: string, context: 'user' | 'contact' | 'admin') { /
|
|
|
122
112
|
### 2. 5 Whys - Root Cause Analysis
|
|
123
113
|
```
|
|
124
114
|
Symptom: Build error
|
|
125
|
-
Why1: Type definitions don't match
|
|
126
|
-
Why3: Dependency change
|
|
115
|
+
Why1: Type definitions don't match -> Why2: Interface was updated
|
|
116
|
+
Why3: Dependency change -> Why4: Package update impact
|
|
127
117
|
Why5: Major version upgrade with breaking changes
|
|
128
118
|
Root cause: Inappropriate version specification
|
|
129
119
|
```
|
|
@@ -134,16 +124,6 @@ To isolate problems, attempt reproduction with minimal code:
|
|
|
134
124
|
- Replace external dependencies with mocks
|
|
135
125
|
- Create minimal configuration that reproduces problem
|
|
136
126
|
|
|
137
|
-
### 4. Debug Log Output
|
|
138
|
-
```typescript
|
|
139
|
-
console.log('DEBUG:', {
|
|
140
|
-
context: 'operation-name',
|
|
141
|
-
input: { /* relevant data */ },
|
|
142
|
-
state: currentState,
|
|
143
|
-
timestamp: new Date().toISOString()
|
|
144
|
-
})
|
|
145
|
-
```
|
|
146
|
-
|
|
147
127
|
## Type Safety Fundamentals
|
|
148
128
|
|
|
149
129
|
**Type Safety Principle**: Use `unknown` type with type guards. `any` type disables type checking and causes runtime errors.
|
|
@@ -151,7 +131,7 @@ console.log('DEBUG:', {
|
|
|
151
131
|
**any Type Alternatives (Priority Order)**
|
|
152
132
|
1. **unknown Type + Type Guards**: Use for validating external input
|
|
153
133
|
2. **Generics**: When type flexibility is needed
|
|
154
|
-
3. **Union Types
|
|
134
|
+
3. **Union Types/Intersection Types**: Combinations of multiple types
|
|
155
135
|
4. **Type Assertions (Last Resort)**: Only when type is certain
|
|
156
136
|
|
|
157
137
|
**Type Guard Implementation Pattern**
|
|
@@ -161,12 +141,6 @@ function isUser(value: unknown): value is User {
|
|
|
161
141
|
}
|
|
162
142
|
```
|
|
163
143
|
|
|
164
|
-
**Modern Type Features**
|
|
165
|
-
- **satisfies Operator**: `const config = { port: 3000 } satisfies Config` - Preserves inference
|
|
166
|
-
- **const Assertion**: `const ROUTES = { HOME: '/' } as const satisfies Routes` - Immutable and type-safe
|
|
167
|
-
- **Branded Types**: `type UserId = string & { __brand: 'UserId' }` - Distinguish meaning
|
|
168
|
-
- **Template Literal Types**: `type Endpoint = \`\${HttpMethod} \${Route}\`` - Express string patterns with types
|
|
169
|
-
|
|
170
144
|
**Type Complexity Management**
|
|
171
145
|
- Field Count: Up to 20 (split by responsibility if exceeded, external API types are exceptions)
|
|
172
146
|
- Optional Ratio: Up to 30% (separate required/optional if exceeded)
|
|
@@ -181,33 +155,10 @@ function isUser(value: unknown): value is User {
|
|
|
181
155
|
- Safe Changes: Minimize the scope of changes at once
|
|
182
156
|
- Behavior Guarantee: Ensure existing behavior remains unchanged while proceeding
|
|
183
157
|
|
|
184
|
-
**Implementation Procedure**: Understand Current State
|
|
158
|
+
**Implementation Procedure**: Understand Current State -> Gradual Changes -> Behavior Verification -> Final Validation
|
|
185
159
|
|
|
186
160
|
**Priority**: Duplicate Code Removal > Large Function Division > Complex Conditional Branch Simplification > Type Safety Improvement
|
|
187
161
|
|
|
188
|
-
## Situations Requiring Technical Decisions
|
|
189
|
-
|
|
190
|
-
### Timing of Abstraction
|
|
191
|
-
- Extract patterns after writing concrete implementation 3 times
|
|
192
|
-
- Be conscious of YAGNI, implement only currently needed features
|
|
193
|
-
- Prioritize current simplicity over future extensibility
|
|
194
|
-
|
|
195
|
-
### Performance vs Readability
|
|
196
|
-
- Prioritize readability unless clear bottleneck exists
|
|
197
|
-
- Measure before optimizing (don't guess, measure)
|
|
198
|
-
- Document reason with comments when optimizing
|
|
199
|
-
|
|
200
|
-
### Granularity of Type Definitions
|
|
201
|
-
- Overly detailed types reduce maintainability
|
|
202
|
-
- Design types that appropriately express domain
|
|
203
|
-
- Use utility types to reduce duplication
|
|
204
|
-
|
|
205
|
-
## Continuous Improvement Mindset
|
|
206
|
-
|
|
207
|
-
- **Humility**: Perfect code doesn't exist, welcome feedback
|
|
208
|
-
- **Courage**: Execute necessary refactoring boldly
|
|
209
|
-
- **Transparency**: Clearly document technical decision reasoning
|
|
210
|
-
|
|
211
162
|
## Implementation Completeness Assurance
|
|
212
163
|
|
|
213
164
|
### Required Procedure for Impact Analysis
|
|
@@ -225,7 +176,7 @@ Grep -n "targetData\|SetData\|UpdateData" -o content
|
|
|
225
176
|
**Mandatory**: Read all discovered files and include necessary parts in context:
|
|
226
177
|
- Caller's purpose and context
|
|
227
178
|
- Dependency direction
|
|
228
|
-
- Data flow: generation
|
|
179
|
+
- Data flow: generation -> modification -> reference
|
|
229
180
|
|
|
230
181
|
#### 3. Identification
|
|
231
182
|
Structured impact report (mandatory):
|
|
@@ -233,36 +184,23 @@ Structured impact report (mandatory):
|
|
|
233
184
|
## Impact Analysis
|
|
234
185
|
### Direct Impact: ClassA, ClassB (with reasons)
|
|
235
186
|
### Indirect Impact: SystemX, ComponentY (with integration paths)
|
|
236
|
-
### Processing Flow: Input
|
|
187
|
+
### Processing Flow: Input -> Process1 -> Process2 -> Output
|
|
237
188
|
```
|
|
238
189
|
|
|
239
190
|
**Important**: Do not stop at search; execute all 3 stages
|
|
240
191
|
|
|
241
192
|
### Unused Code Deletion Rule
|
|
242
193
|
|
|
243
|
-
When unused code is detected
|
|
244
|
-
- Yes
|
|
245
|
-
- No
|
|
194
|
+
When unused code is detected -> Will it be used?
|
|
195
|
+
- Yes -> Implement immediately (no deferral allowed)
|
|
196
|
+
- No -> Delete immediately (remains in Git history)
|
|
246
197
|
|
|
247
198
|
Target: Code, documentation, configuration files
|
|
248
199
|
|
|
249
|
-
### Existing Code Deletion Decision Flow
|
|
250
|
-
|
|
251
|
-
```
|
|
252
|
-
In use? No → Delete immediately (remains in Git history)
|
|
253
|
-
Yes → Working? No → Delete + Reimplement
|
|
254
|
-
Yes → Fix
|
|
255
|
-
```
|
|
256
|
-
|
|
257
200
|
## Red-Green-Refactor Process (Test-First Development)
|
|
258
201
|
|
|
259
202
|
**Recommended Principle**: Always start code changes with tests
|
|
260
203
|
|
|
261
|
-
**Background**:
|
|
262
|
-
- Ensure behavior before changes, prevent regression
|
|
263
|
-
- Clarify expected behavior before implementation
|
|
264
|
-
- Ensure safety during refactoring
|
|
265
|
-
|
|
266
204
|
**Development Steps**:
|
|
267
205
|
1. **Red**: Write test for expected behavior (it fails)
|
|
268
206
|
2. **Green**: Pass test with minimal implementation
|
|
@@ -288,11 +226,11 @@ In use? No → Delete immediately (remains in Git history)
|
|
|
288
226
|
|
|
289
227
|
### Mock and Stub Usage Policy
|
|
290
228
|
|
|
291
|
-
|
|
229
|
+
**Recommended: Mock external dependencies in unit tests**
|
|
292
230
|
- Merit: Ensures test independence and reproducibility
|
|
293
231
|
- Practice: Mock DB, API, file system, and other external dependencies
|
|
294
232
|
|
|
295
|
-
|
|
233
|
+
**Avoid: Actual external connections in unit tests**
|
|
296
234
|
- Reason: Slows test speed and causes environment-dependent problems
|
|
297
235
|
|
|
298
236
|
### Test Failure Response Decision Criteria
|
|
@@ -301,33 +239,8 @@ In use? No → Delete immediately (remains in Git history)
|
|
|
301
239
|
**Fix implementation**: Valid specifications, business logic, important edge cases
|
|
302
240
|
**When in doubt**: Confirm with user
|
|
303
241
|
|
|
304
|
-
## Test Helper Utilization Rules
|
|
305
|
-
|
|
306
|
-
### Basic Principles
|
|
307
|
-
Use test helpers to reduce duplication and improve maintainability.
|
|
308
|
-
|
|
309
|
-
### Decision Criteria
|
|
310
|
-
| Mock Characteristics | Response Policy |
|
|
311
|
-
|---------------------|-----------------|
|
|
312
|
-
| **Simple and stable** | Consolidate in common helpers |
|
|
313
|
-
| **Complex or frequently changing** | Individual implementation |
|
|
314
|
-
| **Duplicated in 3+ places** | Consider consolidation |
|
|
315
|
-
| **Test-specific logic** | Individual implementation |
|
|
316
|
-
|
|
317
242
|
## Test Granularity Principles
|
|
318
243
|
|
|
319
244
|
### Core Principle: Observable Behavior Only
|
|
320
245
|
**MUST Test**: Public APIs, return values, exceptions, external calls, persisted state
|
|
321
246
|
**MUST NOT Test**: Private methods, internal state, algorithm implementation details
|
|
322
|
-
|
|
323
|
-
```typescript
|
|
324
|
-
// ✅ Test observable behavior
|
|
325
|
-
expect(calculateTotal(100, 0.1)).toBe(110)
|
|
326
|
-
|
|
327
|
-
// ❌ Test implementation details
|
|
328
|
-
expect((calculator as any).internalState).toBe(someValue)
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
## Continuity Test Scope
|
|
332
|
-
|
|
333
|
-
Limited to verifying existing feature impact when adding new features. Long-term operations and load testing are infrastructure responsibilities, not test scope.
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: documentation-criteria
|
|
3
|
+
description: Documentation creation criteria including PRD, ADR, Design Doc, and Work Plan requirements with templates. Use when creating or reviewing technical documents.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Documentation Creation Criteria
|
|
2
7
|
|
|
3
8
|
## Creation Decision Matrix
|
|
4
9
|
|
|
5
10
|
| Condition | Required Documents | Creation Order |
|
|
6
11
|
|-----------|-------------------|----------------|
|
|
7
|
-
| New Feature Addition | PRD
|
|
8
|
-
| ADR Conditions Met (see below) | ADR
|
|
9
|
-
| 6+ Files | ADR
|
|
10
|
-
| 3-5 Files | Design Doc
|
|
12
|
+
| New Feature Addition | PRD -> [ADR] -> Design Doc -> Work Plan | After PRD approval |
|
|
13
|
+
| ADR Conditions Met (see below) | ADR -> Design Doc -> Work Plan | Start immediately |
|
|
14
|
+
| 6+ Files | ADR -> Design Doc -> Work Plan (Required) | Start immediately |
|
|
15
|
+
| 3-5 Files | Design Doc -> Work Plan (Recommended) | Start immediately |
|
|
11
16
|
| 1-2 Files | None | Direct implementation |
|
|
12
17
|
|
|
13
18
|
## ADR Creation Conditions (Required if Any Apply)
|
|
@@ -17,14 +22,14 @@
|
|
|
17
22
|
- Rationale: Deep nesting has high complexity and wide impact scope
|
|
18
23
|
- **Changing/deleting types used in 3+ locations**
|
|
19
24
|
- Rationale: Multiple location impacts require careful consideration
|
|
20
|
-
- **Type responsibility changes** (e.g., DTO
|
|
25
|
+
- **Type responsibility changes** (e.g., DTO->Entity)
|
|
21
26
|
- Rationale: Conceptual model changes affect design philosophy
|
|
22
27
|
|
|
23
28
|
### 2. Data Flow Changes
|
|
24
|
-
- **Storage location changes** (DB
|
|
29
|
+
- **Storage location changes** (DB->File, Memory->Cache)
|
|
25
30
|
- **Processing order changes with 3+ steps**
|
|
26
|
-
- Example: "Input
|
|
27
|
-
- **Data passing method changes** (props
|
|
31
|
+
- Example: "Input->Validation->Save" to "Input->Save->Async Validation"
|
|
32
|
+
- **Data passing method changes** (props->Context, direct reference->events)
|
|
28
33
|
|
|
29
34
|
### 3. Architecture Changes
|
|
30
35
|
- Layer addition, responsibility changes, component relocation
|
|
@@ -52,10 +57,10 @@
|
|
|
52
57
|
- Scope boundary diagram (required)
|
|
53
58
|
|
|
54
59
|
**Excludes**:
|
|
55
|
-
- Technical implementation details (
|
|
56
|
-
- Technical selection rationale (
|
|
57
|
-
- **Implementation phases** (
|
|
58
|
-
- **Task breakdown** (
|
|
60
|
+
- Technical implementation details (->Design Doc)
|
|
61
|
+
- Technical selection rationale (->ADR)
|
|
62
|
+
- **Implementation phases** (->Work Plan)
|
|
63
|
+
- **Task breakdown** (->Work Plan)
|
|
59
64
|
|
|
60
65
|
### ADR (Architecture Decision Record)
|
|
61
66
|
|
|
@@ -69,10 +74,10 @@
|
|
|
69
74
|
- Principled implementation guidelines (e.g., "Use dependency injection")
|
|
70
75
|
|
|
71
76
|
**Excludes**:
|
|
72
|
-
- Implementation schedule, duration (
|
|
73
|
-
- Detailed implementation procedures (
|
|
74
|
-
- Specific code examples (
|
|
75
|
-
- Resource assignments (
|
|
77
|
+
- Implementation schedule, duration (->Work Plan)
|
|
78
|
+
- Detailed implementation procedures (->Design Doc)
|
|
79
|
+
- Specific code examples (->Design Doc)
|
|
80
|
+
- Resource assignments (->Work Plan)
|
|
76
81
|
|
|
77
82
|
### Design Document
|
|
78
83
|
|
|
@@ -94,25 +99,10 @@
|
|
|
94
99
|
- **Agreement checklist** (agreements with stakeholders)
|
|
95
100
|
- **Prerequisite ADRs** (including common ADRs)
|
|
96
101
|
|
|
97
|
-
**Required Structural Elements**:
|
|
98
|
-
```yaml
|
|
99
|
-
Change Impact Map:
|
|
100
|
-
Change Target: [Component/Feature]
|
|
101
|
-
Direct Impact: [Files/Functions]
|
|
102
|
-
Indirect Impact: [Data format/Processing time]
|
|
103
|
-
No Ripple Effect: [Unaffected features]
|
|
104
|
-
|
|
105
|
-
Interface Change Matrix:
|
|
106
|
-
Existing: [Method name]
|
|
107
|
-
New: [Method name]
|
|
108
|
-
Conversion Required: [Yes/No]
|
|
109
|
-
Compatibility Method: [Approach]
|
|
110
|
-
```
|
|
111
|
-
|
|
112
102
|
**Excludes**:
|
|
113
|
-
- Why that technology was chosen (
|
|
114
|
-
- When to implement, duration (
|
|
115
|
-
- Who will implement (
|
|
103
|
+
- Why that technology was chosen (->Reference ADR)
|
|
104
|
+
- When to implement, duration (->Work Plan)
|
|
105
|
+
- Who will implement (->Work Plan)
|
|
116
106
|
|
|
117
107
|
### Work Plan
|
|
118
108
|
|
|
@@ -126,8 +116,8 @@ Interface Change Matrix:
|
|
|
126
116
|
- Progress records (checkbox format)
|
|
127
117
|
|
|
128
118
|
**Excludes**:
|
|
129
|
-
- Technical rationale (
|
|
130
|
-
- Design details (
|
|
119
|
+
- Technical rationale (->ADR)
|
|
120
|
+
- Design details (->Design Doc)
|
|
131
121
|
|
|
132
122
|
**Phase Division Criteria**:
|
|
133
123
|
1. **Phase 1: Foundation Implementation** - Type definitions, interfaces, test preparation
|
|
@@ -151,15 +141,15 @@ Interface Change Matrix:
|
|
|
151
141
|
|
|
152
142
|
| Document | Path | Naming Convention | Template |
|
|
153
143
|
|----------|------|------------------|----------|
|
|
154
|
-
| PRD | `docs/prd/` | `[feature-name]-prd.md` |
|
|
155
|
-
| ADR | `docs/adr/` | `ADR-[4-digits]-[title].md` |
|
|
156
|
-
| Design Doc | `docs/design/` | `[feature-name]-design.md` |
|
|
157
|
-
| Work Plan | `docs/plans/` | `YYYYMMDD-{type}-{description}.md` |
|
|
144
|
+
| PRD | `docs/prd/` | `[feature-name]-prd.md` | See prd-template.md |
|
|
145
|
+
| ADR | `docs/adr/` | `ADR-[4-digits]-[title].md` | See adr-template.md |
|
|
146
|
+
| Design Doc | `docs/design/` | `[feature-name]-design.md` | See design-template.md |
|
|
147
|
+
| Work Plan | `docs/plans/` | `YYYYMMDD-{type}-{description}.md` | See plan-template.md |
|
|
158
148
|
|
|
159
149
|
*Note: Work plans are excluded by `.gitignore`
|
|
160
150
|
|
|
161
151
|
## ADR Status
|
|
162
|
-
`Proposed`
|
|
152
|
+
`Proposed` -> `Accepted` -> `Deprecated`/`Superseded`/`Rejected`
|
|
163
153
|
|
|
164
154
|
## AI Automation Rules
|
|
165
155
|
- 5+ files: Suggest ADR creation
|
|
@@ -181,4 +171,12 @@ Required diagrams for each document (using mermaid notation):
|
|
|
181
171
|
1. **At creation**: Identify common technical areas (logging, error handling, async processing, etc.), reference existing common ADRs
|
|
182
172
|
2. **When missing**: Consider creating necessary common ADRs
|
|
183
173
|
3. **Design Doc**: Specify common ADRs in "Prerequisite ADRs" section
|
|
184
|
-
4. **Compliance check**: Verify design aligns with common ADR decisions
|
|
174
|
+
4. **Compliance check**: Verify design aligns with common ADR decisions
|
|
175
|
+
|
|
176
|
+
## Templates
|
|
177
|
+
|
|
178
|
+
Templates are available in the `references/` directory:
|
|
179
|
+
- [Design Document template](references/design-template.md)
|
|
180
|
+
- [Product Requirements Document template](references/prd-template.md)
|
|
181
|
+
- [Work Plan template](references/plan-template.md)
|
|
182
|
+
- [Architecture Decision Record template](references/adr-template.md)
|
|
@@ -163,20 +163,19 @@ Invariants:
|
|
|
163
163
|
- [Conditions that remain unchanged before and after processing]
|
|
164
164
|
```
|
|
165
165
|
|
|
166
|
-
### State Transitions and Invariants
|
|
166
|
+
### State Transitions and Invariants
|
|
167
167
|
|
|
168
|
-
|
|
169
|
-
State Definition:
|
|
170
|
-
- Initial State: [Initial values and conditions]
|
|
171
|
-
- Possible States: [List of states]
|
|
172
|
-
|
|
173
|
-
State Transitions:
|
|
174
|
-
Current State → Event → Next State
|
|
168
|
+
[If the feature involves state management, describe state transitions and invariants here]
|
|
175
169
|
|
|
176
|
-
|
|
177
|
-
|
|
170
|
+
```
|
|
171
|
+
[State A] ---(event 1)---> [State B]
|
|
172
|
+
[State B] ---(event 2)---> [State C]
|
|
178
173
|
```
|
|
179
174
|
|
|
175
|
+
**Invariants**:
|
|
176
|
+
- [Condition that must always hold true]
|
|
177
|
+
- [Constraints on valid state transitions]
|
|
178
|
+
|
|
180
179
|
### Error Handling
|
|
181
180
|
|
|
182
181
|
[Types of errors and how to handle them]
|
|
@@ -207,11 +206,7 @@ System Invariants:
|
|
|
207
206
|
Each integration point requires E2E verification:
|
|
208
207
|
|
|
209
208
|
**Integration Point 1: [Name]**
|
|
210
|
-
- Components: [Component A]
|
|
211
|
-
- Verification: [How to verify integration works]
|
|
212
|
-
|
|
213
|
-
**Integration Point 2: [Name]**
|
|
214
|
-
- Components: [Component B] → [Component C]
|
|
209
|
+
- Components: [Component A] -> [Component B]
|
|
215
210
|
- Verification: [How to verify integration works]
|
|
216
211
|
|
|
217
212
|
### Migration Strategy
|
|
@@ -220,12 +215,6 @@ Each integration point requires E2E verification:
|
|
|
220
215
|
|
|
221
216
|
## Test Strategy
|
|
222
217
|
|
|
223
|
-
### Basic Test Design Policy
|
|
224
|
-
|
|
225
|
-
Automatically derive test cases from acceptance criteria:
|
|
226
|
-
- Create at least one test case for each acceptance criterion
|
|
227
|
-
- Implement measurable standards from acceptance criteria as assertions
|
|
228
|
-
|
|
229
218
|
### Unit Tests
|
|
230
219
|
|
|
231
220
|
[Unit testing policy and coverage goals]
|
|
@@ -242,19 +231,10 @@ Automatically derive test cases from acceptance criteria:
|
|
|
242
231
|
- Verify entire scenarios of acceptance criteria
|
|
243
232
|
- Confirm functional operation from user perspective
|
|
244
233
|
|
|
245
|
-
### Performance Tests
|
|
246
|
-
|
|
247
|
-
[Performance testing methods and standards]
|
|
248
|
-
- Verify performance standards of non-functional acceptance criteria
|
|
249
|
-
|
|
250
234
|
## Security Considerations
|
|
251
235
|
|
|
252
236
|
[Security concerns and countermeasures]
|
|
253
237
|
|
|
254
|
-
## Future Extensibility
|
|
255
|
-
|
|
256
|
-
[Considerations for future feature additions or changes]
|
|
257
|
-
|
|
258
238
|
## Alternative Solutions
|
|
259
239
|
|
|
260
240
|
### Alternative 1
|
|
@@ -278,4 +258,4 @@ Automatically derive test cases from acceptance criteria:
|
|
|
278
258
|
|
|
279
259
|
| Date | Version | Changes | Author |
|
|
280
260
|
|------|---------|---------|--------|
|
|
281
|
-
| YYYY-MM-DD | 1.0 | Initial version | [Name] |
|
|
261
|
+
| YYYY-MM-DD | 1.0 | Initial version | [Name] |
|
|
@@ -39,7 +39,7 @@ Related Issue/PR: #XXX (if any)
|
|
|
39
39
|
#### Tasks
|
|
40
40
|
- [ ] Task 1: Specific work content
|
|
41
41
|
- [ ] Task 2: Specific work content
|
|
42
|
-
- [ ] Quality check: Implement staged quality checks (refer to
|
|
42
|
+
- [ ] Quality check: Implement staged quality checks (refer to technical-spec skill)
|
|
43
43
|
- [ ] Unit tests: All related tests pass
|
|
44
44
|
|
|
45
45
|
#### Phase Completion Criteria
|
|
@@ -57,7 +57,7 @@ Related Issue/PR: #XXX (if any)
|
|
|
57
57
|
#### Tasks
|
|
58
58
|
- [ ] Task 1: Specific work content
|
|
59
59
|
- [ ] Task 2: Specific work content
|
|
60
|
-
- [ ] Quality check: Implement staged quality checks (refer to
|
|
60
|
+
- [ ] Quality check: Implement staged quality checks (refer to technical-spec skill)
|
|
61
61
|
- [ ] Integration tests: Verify overall feature functionality
|
|
62
62
|
|
|
63
63
|
#### Phase Completion Criteria
|
|
@@ -75,7 +75,7 @@ Related Issue/PR: #XXX (if any)
|
|
|
75
75
|
#### Tasks
|
|
76
76
|
- [ ] Task 1: Specific work content
|
|
77
77
|
- [ ] Task 2: Specific work content
|
|
78
|
-
- [ ] Quality check: Implement staged quality checks (refer to
|
|
78
|
+
- [ ] Quality check: Implement staged quality checks (refer to technical-spec skill)
|
|
79
79
|
- [ ] Integration tests: Verify component coordination
|
|
80
80
|
|
|
81
81
|
#### Phase Completion Criteria
|
|
@@ -99,7 +99,7 @@ Related Issue/PR: #XXX (if any)
|
|
|
99
99
|
[Copy E2E verification procedures from Design Doc]
|
|
100
100
|
|
|
101
101
|
### Quality Assurance
|
|
102
|
-
- [ ] Implement staged quality checks (details: refer to
|
|
102
|
+
- [ ] Implement staged quality checks (details: refer to technical-spec skill)
|
|
103
103
|
|
|
104
104
|
## Risks and Countermeasures
|
|
105
105
|
| Risk | Countermeasure |
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend/technical-spec
|
|
3
|
+
description: Frontend technical design rules including environment variables, architecture design, data flow, and build/testing commands.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Technical Design Rules (Frontend)
|
|
2
7
|
|
|
3
8
|
## Basic Technology Stack Policy
|
|
@@ -12,13 +17,13 @@ TypeScript-based React application implementation. Architecture patterns should
|
|
|
12
17
|
- Properly implement default value settings and mandatory checks
|
|
13
18
|
|
|
14
19
|
```typescript
|
|
15
|
-
//
|
|
20
|
+
// Build tool environment variables (public values only)
|
|
16
21
|
const config = {
|
|
17
22
|
apiUrl: import.meta.env.API_URL || 'http://localhost:3000',
|
|
18
23
|
appName: import.meta.env.APP_NAME || 'My App'
|
|
19
24
|
}
|
|
20
25
|
|
|
21
|
-
//
|
|
26
|
+
// Does not work in frontend
|
|
22
27
|
const apiUrl = process.env.API_URL
|
|
23
28
|
```
|
|
24
29
|
|
|
@@ -31,23 +36,22 @@ const apiUrl = process.env.API_URL
|
|
|
31
36
|
|
|
32
37
|
**Correct Approach for Secrets**:
|
|
33
38
|
```typescript
|
|
34
|
-
//
|
|
39
|
+
// Security risk: API key exposed in browser
|
|
35
40
|
const apiKey = import.meta.env.API_KEY
|
|
36
41
|
const response = await fetch(`https://api.example.com/data?key=${apiKey}`)
|
|
37
42
|
|
|
38
|
-
//
|
|
43
|
+
// Correct: Backend manages secrets, frontend accesses via proxy
|
|
39
44
|
const response = await fetch('/api/data') // Backend handles API key authentication
|
|
40
45
|
```
|
|
41
46
|
|
|
42
47
|
## Architecture Design
|
|
43
48
|
|
|
44
49
|
### Frontend Architecture Patterns
|
|
45
|
-
Strictly adhere to selected project patterns. Project-specific details reference `docs/rules/architecture/`.
|
|
46
50
|
|
|
47
51
|
**React Component Architecture**:
|
|
48
52
|
- **Function Components**: Mandatory, class components deprecated
|
|
49
53
|
- **Custom Hooks**: For logic reuse and dependency injection
|
|
50
|
-
- **Component Hierarchy**: Atoms
|
|
54
|
+
- **Component Hierarchy**: Atoms -> Molecules -> Organisms -> Templates -> Pages
|
|
51
55
|
- **Props-driven**: Components receive all necessary data via props
|
|
52
56
|
- **Co-location**: Place tests, styles, and related files alongside components
|
|
53
57
|
|
|
@@ -69,26 +73,26 @@ Maintain consistent data flow throughout the React application:
|
|
|
69
73
|
|
|
70
74
|
- **Unidirectional Flow**: Data flows top-down via props
|
|
71
75
|
```
|
|
72
|
-
API Response
|
|
73
|
-
User Input
|
|
76
|
+
API Response -> State -> Props -> Render -> UI
|
|
77
|
+
User Input -> Event Handler -> State Update -> Re-render
|
|
74
78
|
```
|
|
75
79
|
|
|
76
80
|
- **Immutable Updates**: Use immutable patterns for state updates
|
|
77
81
|
```typescript
|
|
78
|
-
//
|
|
82
|
+
// Immutable state update
|
|
79
83
|
setUsers(prev => [...prev, newUser])
|
|
80
84
|
|
|
81
|
-
//
|
|
85
|
+
// Mutable state update (avoid)
|
|
82
86
|
users.push(newUser)
|
|
83
87
|
setUsers(users)
|
|
84
88
|
```
|
|
85
89
|
|
|
86
90
|
### Type Safety in Data Flow
|
|
87
|
-
- **Frontend
|
|
88
|
-
- **Backend
|
|
91
|
+
- **Frontend -> Backend**: Props/State (Type Guaranteed) -> API Request (Serialization)
|
|
92
|
+
- **Backend -> Frontend**: API Response (`unknown`) -> Type Guard -> State (Type Guaranteed)
|
|
89
93
|
|
|
90
94
|
```typescript
|
|
91
|
-
//
|
|
95
|
+
// Type-safe data flow
|
|
92
96
|
async function fetchUser(id: string): Promise<User> {
|
|
93
97
|
const response = await fetch(`/api/users/${id}`)
|
|
94
98
|
const data: unknown = await response.json()
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
name: frontend/typescript-rules
|
|
3
|
+
description: React/TypeScript frontend development rules including type safety, component design, state management, and error handling.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TypeScript Development Rules (Frontend)
|
|
2
7
|
|
|
3
8
|
## Frontend-Specific Anti-patterns
|
|
4
9
|
|
|
5
|
-
In addition to universal anti-patterns in coding-standards
|
|
10
|
+
In addition to universal anti-patterns in coding-standards skill, watch for these Frontend-specific issues:
|
|
6
11
|
|
|
7
12
|
- **Prop drilling through 3+ levels** - Should use Context API or state management
|
|
8
13
|
- **Massive components (300+ lines)** - Split into smaller components
|
|
@@ -10,8 +15,8 @@ In addition to universal anti-patterns in coding-standards.md, watch for these F
|
|
|
10
15
|
## Type Safety in Frontend Implementation
|
|
11
16
|
|
|
12
17
|
**Type Safety in Data Flow**
|
|
13
|
-
- **Frontend
|
|
14
|
-
- **Backend
|
|
18
|
+
- **Frontend -> Backend**: Props/State (Type Guaranteed) -> API Request (Serialization)
|
|
19
|
+
- **Backend -> Frontend**: API Response (`unknown`) -> Type Guard -> State (Type Guaranteed)
|
|
15
20
|
|
|
16
21
|
**Frontend-Specific Type Scenarios**:
|
|
17
22
|
- **React Props/State**: TypeScript manages types, unknown unnecessary
|
|
@@ -38,7 +43,7 @@ In addition to universal anti-patterns in coding-standards.md, watch for these F
|
|
|
38
43
|
**Function Design**
|
|
39
44
|
- **0-2 parameters maximum**: Use object for 3+ parameters
|
|
40
45
|
```typescript
|
|
41
|
-
//
|
|
46
|
+
// Object parameter
|
|
42
47
|
function createUser({ name, email, role }: CreateUserParams) {}
|
|
43
48
|
```
|
|
44
49
|
|
|
@@ -65,10 +70,10 @@ In addition to universal anti-patterns in coding-standards.md, watch for these F
|
|
|
65
70
|
- Imports use absolute paths (`src/`)
|
|
66
71
|
|
|
67
72
|
**Clean Code Principles**
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
73
|
+
- Delete unused code immediately
|
|
74
|
+
- Delete debug `console.log()`
|
|
75
|
+
- No commented-out code (manage history with version control)
|
|
76
|
+
- Comments explain "why" (not "what")
|
|
72
77
|
|
|
73
78
|
## Error Handling
|
|
74
79
|
|
|
@@ -76,12 +81,12 @@ In addition to universal anti-patterns in coding-standards.md, watch for these F
|
|
|
76
81
|
|
|
77
82
|
**Fail-Fast Principle**: Fail quickly on errors to prevent continued processing in invalid states
|
|
78
83
|
```typescript
|
|
79
|
-
//
|
|
84
|
+
// Prohibited: Unconditional fallback
|
|
80
85
|
catch (error) {
|
|
81
86
|
return defaultValue // Hides error
|
|
82
87
|
}
|
|
83
88
|
|
|
84
|
-
//
|
|
89
|
+
// Required: Explicit failure
|
|
85
90
|
catch (error) {
|
|
86
91
|
logger.error('Processing failed', error)
|
|
87
92
|
throw error // Handle with Error Boundary or higher layer
|
|
@@ -128,4 +133,4 @@ Never include sensitive information (password, token, apiKey, secret, creditCard
|
|
|
128
133
|
- Component Memoization: Use React.memo for expensive components
|
|
129
134
|
- State Optimization: Minimize re-renders with proper state structure
|
|
130
135
|
- Lazy Loading: Use React.lazy and Suspense for code splitting
|
|
131
|
-
- Bundle Size: Monitor with the `build` script
|
|
136
|
+
- Bundle Size: Monitor with the `build` script and keep under 500KB
|