@su-record/vibe 2.7.14 → 2.7.15
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/.env.example +37 -37
- package/CLAUDE.md +134 -126
- package/LICENSE +21 -21
- package/README.md +449 -449
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/docs/api-documenter.md +99 -99
- package/agents/docs/changelog-writer.md +93 -93
- package/agents/e2e-tester.md +294 -294
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/junior-mentor.md +141 -141
- package/agents/planning/requirements-analyst.md +84 -84
- package/agents/planning/ux-advisor.md +83 -83
- package/agents/qa/acceptance-tester.md +86 -86
- package/agents/qa/edge-case-finder.md +93 -93
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +94 -94
- package/agents/ui/ui-dataviz-advisor.md +69 -69
- package/agents/ui/ui-design-system-gen.md +57 -57
- package/agents/ui/ui-industry-analyzer.md +49 -49
- package/agents/ui/ui-layout-architect.md +65 -65
- package/agents/ui/ui-stack-implementer.md +68 -68
- package/agents/ui/ux-compliance-reviewer.md +81 -81
- package/agents/ui-previewer.md +258 -258
- package/commands/vibe.analyze.md +11 -13
- package/commands/vibe.review.md +43 -1
- package/commands/vibe.run.md +2124 -2078
- package/commands/vibe.spec.md +9 -4
- package/commands/vibe.spec.review.md +569 -565
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +33 -8
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/info.js +54 -54
- package/dist/cli/commands/init.js +5 -5
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/skills.js +5 -5
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -51
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +16 -16
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/cursor-agents.js +32 -32
- package/dist/cli/postinstall/cursor-rules.js +83 -83
- package/dist/cli/postinstall/cursor-skills.js +743 -743
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/infra/lib/DeepInit.js +24 -24
- package/dist/infra/lib/IterationTracker.js +11 -11
- package/dist/infra/lib/PythonParser.js +108 -108
- package/dist/infra/lib/ReviewRace.js +96 -96
- package/dist/infra/lib/SkillFrontmatter.js +28 -28
- package/dist/infra/lib/SkillQualityGate.js +9 -9
- package/dist/infra/lib/SkillRepository.js +159 -159
- package/dist/infra/lib/UltraQA.js +99 -99
- package/dist/infra/lib/autonomy/AuditStore.js +41 -41
- package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
- package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
- package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
- package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
- package/dist/infra/lib/embedding/VectorStore.js +22 -22
- package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
- package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js +4 -4
- package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/infra/lib/memory/MemorySearch.js +57 -57
- package/dist/infra/lib/memory/MemoryStorage.js +181 -181
- package/dist/infra/lib/memory/ObservationStore.js +28 -28
- package/dist/infra/lib/memory/ReflectionStore.js +30 -30
- package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
- package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
- package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
- package/dist/infra/orchestrator/AgentManager.js +12 -12
- package/dist/infra/orchestrator/AgentRegistry.js +65 -65
- package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
- package/dist/infra/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/dist/tools/semantic/astGrep.test.js +6 -6
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/hooks/gemini-hooks.json +73 -73
- package/hooks/hooks.json +137 -137
- package/hooks/scripts/code-check.js +77 -70
- package/hooks/scripts/context-save.js +212 -212
- package/hooks/scripts/hud-status.js +291 -291
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +475 -475
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pre-tool-guard.js +125 -125
- package/hooks/scripts/prompt-dispatcher.js +185 -185
- package/hooks/scripts/sentinel-guard.js +104 -104
- package/hooks/scripts/session-start.js +106 -106
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +100 -100
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +121 -121
- package/skills/agents-md/SKILL.md +120 -120
- package/skills/arch-guard/SKILL.md +180 -180
- package/skills/brand-assets/SKILL.md +146 -146
- package/skills/capability-loop/SKILL.md +167 -167
- package/skills/characterization-test/SKILL.md +206 -206
- package/skills/commerce-patterns/SKILL.md +59 -59
- package/skills/commit-push-pr/SKILL.md +75 -75
- package/skills/context7-usage/SKILL.md +105 -105
- package/skills/core-capabilities/SKILL.md +48 -48
- package/skills/e2e-commerce/SKILL.md +57 -57
- package/skills/exec-plan/SKILL.md +147 -147
- package/skills/frontend-design/SKILL.md +73 -73
- package/skills/git-worktree/SKILL.md +72 -72
- package/skills/handoff/SKILL.md +109 -109
- package/skills/parallel-research/SKILL.md +87 -87
- package/skills/priority-todos/SKILL.md +63 -63
- package/skills/seo-checklist/SKILL.md +57 -57
- package/skills/techdebt/SKILL.md +122 -122
- package/skills/tool-fallback/SKILL.md +103 -103
- package/skills/typescript-advanced-types/SKILL.md +66 -66
- package/skills/ui-ux-pro-max/SKILL.md +206 -206
- package/skills/vercel-react-best-practices/SKILL.md +59 -59
- package/skills/video-production/SKILL.md +51 -51
- package/vibe/config.json +29 -29
- package/vibe/constitution.md +227 -227
- package/vibe/rules/principles/communication-guide.md +98 -98
- package/vibe/rules/principles/development-philosophy.md +52 -52
- package/vibe/rules/principles/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/performance.md +236 -236
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/git-workflow.md +237 -237
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/rules/standards/security.md +305 -305
- package/vibe/rules/writing/document-style.md +74 -74
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/spec-template.md +221 -221
- package/vibe/ui-ux-data/charts.csv +26 -26
- package/vibe/ui-ux-data/colors.csv +97 -97
- package/vibe/ui-ux-data/icons.csv +101 -101
- package/vibe/ui-ux-data/landing.csv +31 -31
- package/vibe/ui-ux-data/products.csv +96 -96
- package/vibe/ui-ux-data/react-performance.csv +45 -45
- package/vibe/ui-ux-data/stacks/astro.csv +54 -54
- package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
- package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
- package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
- package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
- package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
- package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
- package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
- package/vibe/ui-ux-data/stacks/react.csv +54 -54
- package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
- package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
- package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
- package/vibe/ui-ux-data/stacks/vue.csv +50 -50
- package/vibe/ui-ux-data/styles.csv +68 -68
- package/vibe/ui-ux-data/typography.csv +57 -57
- package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
- package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
- package/vibe/ui-ux-data/version.json +31 -31
- package/vibe/ui-ux-data/web-interface.csv +31 -31
|
@@ -1,291 +1,291 @@
|
|
|
1
|
-
# Code Structure Automation Rules
|
|
2
|
-
|
|
3
|
-
## Component Structure (Strict Order)
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
// 1. Import statements
|
|
7
|
-
import React, { useState, useEffect } from 'react';
|
|
8
|
-
|
|
9
|
-
// 2. Type/Interface definitions
|
|
10
|
-
interface Props {
|
|
11
|
-
userId: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// 3. Component definition
|
|
15
|
-
function UserProfile({ userId }: Props) {
|
|
16
|
-
// 4. State & Refs
|
|
17
|
-
const [user, setUser] = useState<User | null>(null);
|
|
18
|
-
const inputRef = useRef<HTMLInputElement>(null);
|
|
19
|
-
|
|
20
|
-
// 5. Custom Hooks
|
|
21
|
-
const { isAuthenticated } = useAuth();
|
|
22
|
-
const { data, loading } = useUserData(userId);
|
|
23
|
-
|
|
24
|
-
// 6. Event Handlers
|
|
25
|
-
const handleSubmit = (e: FormEvent) => {
|
|
26
|
-
e.preventDefault();
|
|
27
|
-
// ...
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// 7. Effects
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
// ...
|
|
33
|
-
}, [userId]);
|
|
34
|
-
|
|
35
|
-
// 8. Early returns
|
|
36
|
-
if (loading) return <Spinner />;
|
|
37
|
-
if (!user) return <NotFound />;
|
|
38
|
-
|
|
39
|
-
// 9. Main return JSX
|
|
40
|
-
return (
|
|
41
|
-
<div>
|
|
42
|
-
{/* ... */}
|
|
43
|
-
</div>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Function Separation Criteria
|
|
49
|
-
|
|
50
|
-
### 1. Function Length Criteria
|
|
51
|
-
|
|
52
|
-
```typescript
|
|
53
|
-
// ❌ Over 20 lines - needs separation
|
|
54
|
-
function processUserData(user: User) {
|
|
55
|
-
// 30 lines of complex logic
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ✅ Separate by single responsibility
|
|
59
|
-
function processUserData(user: User) {
|
|
60
|
-
const validated = validateUser(user);
|
|
61
|
-
const transformed = transformUserData(validated);
|
|
62
|
-
return saveUserData(transformed);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function validateUser(user: User) { /* ... */ }
|
|
66
|
-
function transformUserData(user: User) { /* ... */ }
|
|
67
|
-
function saveUserData(user: User) { /* ... */ }
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### 2. Component JSX Length Criteria
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
// ❌ JSX over 50 lines - needs separation
|
|
74
|
-
function Dashboard() {
|
|
75
|
-
return (
|
|
76
|
-
<div>
|
|
77
|
-
{/* 60 lines of complex JSX */}
|
|
78
|
-
</div>
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// ✅ Extract sub-components
|
|
83
|
-
function Dashboard() {
|
|
84
|
-
return (
|
|
85
|
-
<div>
|
|
86
|
-
<DashboardHeader />
|
|
87
|
-
<DashboardContent />
|
|
88
|
-
<DashboardFooter />
|
|
89
|
-
</div>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function DashboardHeader() { /* ... */ }
|
|
94
|
-
function DashboardContent() { /* ... */ }
|
|
95
|
-
function DashboardFooter() { /* ... */ }
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### 3. Nesting Depth Criteria
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
// ❌ Nesting over 3 levels
|
|
102
|
-
function processData(data: Data) {
|
|
103
|
-
if (data) {
|
|
104
|
-
if (data.isValid) {
|
|
105
|
-
if (data.user) {
|
|
106
|
-
if (data.user.isActive) {
|
|
107
|
-
// Too deep nesting
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// ✅ Flatten with early returns
|
|
115
|
-
function processData(data: Data) {
|
|
116
|
-
if (!data) return null;
|
|
117
|
-
if (!data.isValid) return null;
|
|
118
|
-
if (!data.user) return null;
|
|
119
|
-
if (!data.user.isActive) return null;
|
|
120
|
-
|
|
121
|
-
// Execute logic
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### 4. Cyclomatic Complexity > 10
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
// ❌ High complexity (15)
|
|
129
|
-
function calculatePrice(item: Item) {
|
|
130
|
-
let price = item.basePrice;
|
|
131
|
-
if (item.discount) price *= 0.9;
|
|
132
|
-
if (item.bulk) price *= 0.8;
|
|
133
|
-
if (item.seasonal) price *= 0.95;
|
|
134
|
-
if (item.member) price *= 0.85;
|
|
135
|
-
if (item.firstTime) price *= 0.9;
|
|
136
|
-
// ... more conditions
|
|
137
|
-
return price;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// ✅ Reduced complexity (3)
|
|
141
|
-
function calculatePrice(item: Item) {
|
|
142
|
-
const basePrice = item.basePrice;
|
|
143
|
-
const discounts = getApplicableDiscounts(item);
|
|
144
|
-
return applyDiscounts(basePrice, discounts);
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### 5. Cognitive Complexity > 15
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
// ❌ High cognitive complexity
|
|
152
|
-
function processOrder(order: Order) {
|
|
153
|
-
if (order.isPremium) {
|
|
154
|
-
for (let item of order.items) {
|
|
155
|
-
if (item.category === 'electronics') {
|
|
156
|
-
if (item.price > 1000) {
|
|
157
|
-
// Nested complex logic
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// ✅ Reduced cognitive complexity
|
|
165
|
-
function processOrder(order: Order) {
|
|
166
|
-
if (!order.isPremium) return;
|
|
167
|
-
|
|
168
|
-
const electronics = filterElectronics(order.items);
|
|
169
|
-
const expensive = filterExpensive(electronics);
|
|
170
|
-
|
|
171
|
-
processItems(expensive);
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## File Structure Standard
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
// 📁 user-profile.component.tsx
|
|
179
|
-
|
|
180
|
-
// 1. Imports
|
|
181
|
-
import { ... } from 'react';
|
|
182
|
-
import { ... } from '@/lib';
|
|
183
|
-
|
|
184
|
-
// 2. Types
|
|
185
|
-
interface UserProfileProps { }
|
|
186
|
-
type UserRole = 'admin' | 'user';
|
|
187
|
-
|
|
188
|
-
// 3. Constants
|
|
189
|
-
const MAX_BIO_LENGTH = 500;
|
|
190
|
-
const DEFAULT_AVATAR = '/avatar.png';
|
|
191
|
-
|
|
192
|
-
// 4. Helper Functions (internal only)
|
|
193
|
-
function formatUserName(name: string) { }
|
|
194
|
-
|
|
195
|
-
// 5. Main Component
|
|
196
|
-
export function UserProfile() { }
|
|
197
|
-
|
|
198
|
-
// 6. Sub Components (not exported)
|
|
199
|
-
function ProfileHeader() { }
|
|
200
|
-
function ProfileContent() { }
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
## Module Organization Principles
|
|
204
|
-
|
|
205
|
-
### 1. Cohesion
|
|
206
|
-
|
|
207
|
-
```typescript
|
|
208
|
-
// ✅ High cohesion - only related functions
|
|
209
|
-
// 📁 user.service.ts
|
|
210
|
-
export class UserService {
|
|
211
|
-
getUser(id: string) { }
|
|
212
|
-
updateUser(id: string, data: User) { }
|
|
213
|
-
deleteUser(id: string) { }
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// ❌ Low cohesion - unrelated functions mixed
|
|
217
|
-
// 📁 utils.ts (anti-pattern)
|
|
218
|
-
export class Utils {
|
|
219
|
-
validateEmail(email: string) { }
|
|
220
|
-
formatCurrency(amount: number) { }
|
|
221
|
-
uploadFile(file: File) { }
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### 2. Coupling
|
|
226
|
-
|
|
227
|
-
```typescript
|
|
228
|
-
// ✅ Loose coupling - depends on interface
|
|
229
|
-
interface Storage {
|
|
230
|
-
save(key: string, value: unknown): void;
|
|
231
|
-
load(key: string): unknown;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
class UserService {
|
|
235
|
-
constructor(private storage: Storage) { }
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// ❌ Tight coupling - depends on implementation directly
|
|
239
|
-
class UserService {
|
|
240
|
-
private storage = new LocalStorage(); // Direct dependency
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
## Function Parameter Limit
|
|
245
|
-
|
|
246
|
-
```typescript
|
|
247
|
-
// ❌ Over 5 parameters
|
|
248
|
-
function createUser(
|
|
249
|
-
name: string,
|
|
250
|
-
email: string,
|
|
251
|
-
age: number,
|
|
252
|
-
address: string,
|
|
253
|
-
phone: string,
|
|
254
|
-
role: string
|
|
255
|
-
) { }
|
|
256
|
-
|
|
257
|
-
// ✅ Group into object
|
|
258
|
-
interface CreateUserParams {
|
|
259
|
-
name: string;
|
|
260
|
-
email: string;
|
|
261
|
-
age: number;
|
|
262
|
-
address: string;
|
|
263
|
-
phone: string;
|
|
264
|
-
role: string;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function createUser(params: CreateUserParams) { }
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
## Preventing Circular Dependencies
|
|
271
|
-
|
|
272
|
-
```typescript
|
|
273
|
-
// ❌ Circular dependency
|
|
274
|
-
// fileA.ts
|
|
275
|
-
import { funcB } from './fileB';
|
|
276
|
-
export function funcA() { funcB(); }
|
|
277
|
-
|
|
278
|
-
// fileB.ts
|
|
279
|
-
import { funcA } from './fileA'; // Circular!
|
|
280
|
-
export function funcB() { funcA(); }
|
|
281
|
-
|
|
282
|
-
// ✅ Separate common module
|
|
283
|
-
// shared.ts
|
|
284
|
-
export function sharedFunc() { }
|
|
285
|
-
|
|
286
|
-
// fileA.ts
|
|
287
|
-
import { sharedFunc } from './shared';
|
|
288
|
-
|
|
289
|
-
// fileB.ts
|
|
290
|
-
import { sharedFunc } from './shared';
|
|
291
|
-
```
|
|
1
|
+
# Code Structure Automation Rules
|
|
2
|
+
|
|
3
|
+
## Component Structure (Strict Order)
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// 1. Import statements
|
|
7
|
+
import React, { useState, useEffect } from 'react';
|
|
8
|
+
|
|
9
|
+
// 2. Type/Interface definitions
|
|
10
|
+
interface Props {
|
|
11
|
+
userId: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 3. Component definition
|
|
15
|
+
function UserProfile({ userId }: Props) {
|
|
16
|
+
// 4. State & Refs
|
|
17
|
+
const [user, setUser] = useState<User | null>(null);
|
|
18
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
|
19
|
+
|
|
20
|
+
// 5. Custom Hooks
|
|
21
|
+
const { isAuthenticated } = useAuth();
|
|
22
|
+
const { data, loading } = useUserData(userId);
|
|
23
|
+
|
|
24
|
+
// 6. Event Handlers
|
|
25
|
+
const handleSubmit = (e: FormEvent) => {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
// ...
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// 7. Effects
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
// ...
|
|
33
|
+
}, [userId]);
|
|
34
|
+
|
|
35
|
+
// 8. Early returns
|
|
36
|
+
if (loading) return <Spinner />;
|
|
37
|
+
if (!user) return <NotFound />;
|
|
38
|
+
|
|
39
|
+
// 9. Main return JSX
|
|
40
|
+
return (
|
|
41
|
+
<div>
|
|
42
|
+
{/* ... */}
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Function Separation Criteria
|
|
49
|
+
|
|
50
|
+
### 1. Function Length Criteria
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// ❌ Over 20 lines - needs separation
|
|
54
|
+
function processUserData(user: User) {
|
|
55
|
+
// 30 lines of complex logic
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ✅ Separate by single responsibility
|
|
59
|
+
function processUserData(user: User) {
|
|
60
|
+
const validated = validateUser(user);
|
|
61
|
+
const transformed = transformUserData(validated);
|
|
62
|
+
return saveUserData(transformed);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function validateUser(user: User) { /* ... */ }
|
|
66
|
+
function transformUserData(user: User) { /* ... */ }
|
|
67
|
+
function saveUserData(user: User) { /* ... */ }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2. Component JSX Length Criteria
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// ❌ JSX over 50 lines - needs separation
|
|
74
|
+
function Dashboard() {
|
|
75
|
+
return (
|
|
76
|
+
<div>
|
|
77
|
+
{/* 60 lines of complex JSX */}
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ✅ Extract sub-components
|
|
83
|
+
function Dashboard() {
|
|
84
|
+
return (
|
|
85
|
+
<div>
|
|
86
|
+
<DashboardHeader />
|
|
87
|
+
<DashboardContent />
|
|
88
|
+
<DashboardFooter />
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function DashboardHeader() { /* ... */ }
|
|
94
|
+
function DashboardContent() { /* ... */ }
|
|
95
|
+
function DashboardFooter() { /* ... */ }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 3. Nesting Depth Criteria
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// ❌ Nesting over 3 levels
|
|
102
|
+
function processData(data: Data) {
|
|
103
|
+
if (data) {
|
|
104
|
+
if (data.isValid) {
|
|
105
|
+
if (data.user) {
|
|
106
|
+
if (data.user.isActive) {
|
|
107
|
+
// Too deep nesting
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ✅ Flatten with early returns
|
|
115
|
+
function processData(data: Data) {
|
|
116
|
+
if (!data) return null;
|
|
117
|
+
if (!data.isValid) return null;
|
|
118
|
+
if (!data.user) return null;
|
|
119
|
+
if (!data.user.isActive) return null;
|
|
120
|
+
|
|
121
|
+
// Execute logic
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 4. Cyclomatic Complexity > 10
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// ❌ High complexity (15)
|
|
129
|
+
function calculatePrice(item: Item) {
|
|
130
|
+
let price = item.basePrice;
|
|
131
|
+
if (item.discount) price *= 0.9;
|
|
132
|
+
if (item.bulk) price *= 0.8;
|
|
133
|
+
if (item.seasonal) price *= 0.95;
|
|
134
|
+
if (item.member) price *= 0.85;
|
|
135
|
+
if (item.firstTime) price *= 0.9;
|
|
136
|
+
// ... more conditions
|
|
137
|
+
return price;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ✅ Reduced complexity (3)
|
|
141
|
+
function calculatePrice(item: Item) {
|
|
142
|
+
const basePrice = item.basePrice;
|
|
143
|
+
const discounts = getApplicableDiscounts(item);
|
|
144
|
+
return applyDiscounts(basePrice, discounts);
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 5. Cognitive Complexity > 15
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
// ❌ High cognitive complexity
|
|
152
|
+
function processOrder(order: Order) {
|
|
153
|
+
if (order.isPremium) {
|
|
154
|
+
for (let item of order.items) {
|
|
155
|
+
if (item.category === 'electronics') {
|
|
156
|
+
if (item.price > 1000) {
|
|
157
|
+
// Nested complex logic
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ✅ Reduced cognitive complexity
|
|
165
|
+
function processOrder(order: Order) {
|
|
166
|
+
if (!order.isPremium) return;
|
|
167
|
+
|
|
168
|
+
const electronics = filterElectronics(order.items);
|
|
169
|
+
const expensive = filterExpensive(electronics);
|
|
170
|
+
|
|
171
|
+
processItems(expensive);
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## File Structure Standard
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// 📁 user-profile.component.tsx
|
|
179
|
+
|
|
180
|
+
// 1. Imports
|
|
181
|
+
import { ... } from 'react';
|
|
182
|
+
import { ... } from '@/lib';
|
|
183
|
+
|
|
184
|
+
// 2. Types
|
|
185
|
+
interface UserProfileProps { }
|
|
186
|
+
type UserRole = 'admin' | 'user';
|
|
187
|
+
|
|
188
|
+
// 3. Constants
|
|
189
|
+
const MAX_BIO_LENGTH = 500;
|
|
190
|
+
const DEFAULT_AVATAR = '/avatar.png';
|
|
191
|
+
|
|
192
|
+
// 4. Helper Functions (internal only)
|
|
193
|
+
function formatUserName(name: string) { }
|
|
194
|
+
|
|
195
|
+
// 5. Main Component
|
|
196
|
+
export function UserProfile() { }
|
|
197
|
+
|
|
198
|
+
// 6. Sub Components (not exported)
|
|
199
|
+
function ProfileHeader() { }
|
|
200
|
+
function ProfileContent() { }
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Module Organization Principles
|
|
204
|
+
|
|
205
|
+
### 1. Cohesion
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
// ✅ High cohesion - only related functions
|
|
209
|
+
// 📁 user.service.ts
|
|
210
|
+
export class UserService {
|
|
211
|
+
getUser(id: string) { }
|
|
212
|
+
updateUser(id: string, data: User) { }
|
|
213
|
+
deleteUser(id: string) { }
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ❌ Low cohesion - unrelated functions mixed
|
|
217
|
+
// 📁 utils.ts (anti-pattern)
|
|
218
|
+
export class Utils {
|
|
219
|
+
validateEmail(email: string) { }
|
|
220
|
+
formatCurrency(amount: number) { }
|
|
221
|
+
uploadFile(file: File) { }
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 2. Coupling
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
// ✅ Loose coupling - depends on interface
|
|
229
|
+
interface Storage {
|
|
230
|
+
save(key: string, value: unknown): void;
|
|
231
|
+
load(key: string): unknown;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
class UserService {
|
|
235
|
+
constructor(private storage: Storage) { }
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ❌ Tight coupling - depends on implementation directly
|
|
239
|
+
class UserService {
|
|
240
|
+
private storage = new LocalStorage(); // Direct dependency
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Function Parameter Limit
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
// ❌ Over 5 parameters
|
|
248
|
+
function createUser(
|
|
249
|
+
name: string,
|
|
250
|
+
email: string,
|
|
251
|
+
age: number,
|
|
252
|
+
address: string,
|
|
253
|
+
phone: string,
|
|
254
|
+
role: string
|
|
255
|
+
) { }
|
|
256
|
+
|
|
257
|
+
// ✅ Group into object
|
|
258
|
+
interface CreateUserParams {
|
|
259
|
+
name: string;
|
|
260
|
+
email: string;
|
|
261
|
+
age: number;
|
|
262
|
+
address: string;
|
|
263
|
+
phone: string;
|
|
264
|
+
role: string;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function createUser(params: CreateUserParams) { }
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Preventing Circular Dependencies
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
// ❌ Circular dependency
|
|
274
|
+
// fileA.ts
|
|
275
|
+
import { funcB } from './fileB';
|
|
276
|
+
export function funcA() { funcB(); }
|
|
277
|
+
|
|
278
|
+
// fileB.ts
|
|
279
|
+
import { funcA } from './fileA'; // Circular!
|
|
280
|
+
export function funcB() { funcA(); }
|
|
281
|
+
|
|
282
|
+
// ✅ Separate common module
|
|
283
|
+
// shared.ts
|
|
284
|
+
export function sharedFunc() { }
|
|
285
|
+
|
|
286
|
+
// fileA.ts
|
|
287
|
+
import { sharedFunc } from './shared';
|
|
288
|
+
|
|
289
|
+
// fileB.ts
|
|
290
|
+
import { sharedFunc } from './shared';
|
|
291
|
+
```
|