@su-record/vibe 2.7.16 → 2.7.18

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.
Files changed (249) hide show
  1. package/.env.example +37 -37
  2. package/CLAUDE.md +153 -134
  3. package/LICENSE +21 -21
  4. package/README.md +449 -449
  5. package/agents/architect-low.md +41 -41
  6. package/agents/architect-medium.md +59 -59
  7. package/agents/architect.md +80 -80
  8. package/agents/build-error-resolver.md +115 -115
  9. package/agents/compounder.md +261 -261
  10. package/agents/diagrammer.md +178 -178
  11. package/agents/docs/api-documenter.md +99 -99
  12. package/agents/docs/changelog-writer.md +93 -93
  13. package/agents/e2e-tester.md +294 -294
  14. package/agents/explorer-low.md +42 -42
  15. package/agents/explorer-medium.md +59 -59
  16. package/agents/explorer.md +48 -48
  17. package/agents/implementer-low.md +43 -43
  18. package/agents/implementer-medium.md +52 -52
  19. package/agents/implementer.md +54 -54
  20. package/agents/junior-mentor.md +141 -141
  21. package/agents/planning/requirements-analyst.md +84 -84
  22. package/agents/planning/ux-advisor.md +83 -83
  23. package/agents/qa/acceptance-tester.md +86 -86
  24. package/agents/qa/edge-case-finder.md +93 -93
  25. package/agents/refactor-cleaner.md +143 -143
  26. package/agents/research/best-practices-agent.md +199 -199
  27. package/agents/research/codebase-patterns-agent.md +157 -157
  28. package/agents/research/framework-docs-agent.md +188 -188
  29. package/agents/research/security-advisory-agent.md +213 -213
  30. package/agents/review/architecture-reviewer.md +107 -107
  31. package/agents/review/complexity-reviewer.md +116 -116
  32. package/agents/review/data-integrity-reviewer.md +88 -88
  33. package/agents/review/git-history-reviewer.md +103 -103
  34. package/agents/review/performance-reviewer.md +86 -86
  35. package/agents/review/python-reviewer.md +150 -150
  36. package/agents/review/rails-reviewer.md +139 -139
  37. package/agents/review/react-reviewer.md +144 -144
  38. package/agents/review/security-reviewer.md +80 -80
  39. package/agents/review/simplicity-reviewer.md +140 -140
  40. package/agents/review/test-coverage-reviewer.md +116 -116
  41. package/agents/review/typescript-reviewer.md +127 -127
  42. package/agents/searcher.md +54 -54
  43. package/agents/simplifier.md +120 -120
  44. package/agents/tester.md +49 -49
  45. package/agents/ui/ui-a11y-auditor.md +93 -93
  46. package/agents/ui/ui-antipattern-detector.md +94 -94
  47. package/agents/ui/ui-dataviz-advisor.md +69 -69
  48. package/agents/ui/ui-design-system-gen.md +57 -57
  49. package/agents/ui/ui-industry-analyzer.md +49 -49
  50. package/agents/ui/ui-layout-architect.md +65 -65
  51. package/agents/ui/ui-stack-implementer.md +68 -68
  52. package/agents/ui/ux-compliance-reviewer.md +81 -81
  53. package/agents/ui-previewer.md +258 -258
  54. package/commands/vibe.analyze.md +379 -379
  55. package/commands/vibe.review.md +607 -607
  56. package/commands/vibe.run.md +2124 -2124
  57. package/commands/vibe.spec.md +1195 -1195
  58. package/commands/vibe.spec.review.md +569 -569
  59. package/commands/vibe.utils.md +413 -413
  60. package/commands/vibe.verify.md +484 -484
  61. package/dist/cli/collaborator.js +52 -52
  62. package/dist/cli/commands/evolution.js +12 -12
  63. package/dist/cli/commands/info.js +51 -51
  64. package/dist/cli/commands/init.js +5 -5
  65. package/dist/cli/commands/remove.js +14 -14
  66. package/dist/cli/commands/sentinel.js +27 -27
  67. package/dist/cli/commands/skills.js +5 -5
  68. package/dist/cli/commands/slack.js +10 -10
  69. package/dist/cli/commands/telegram.js +12 -12
  70. package/dist/cli/commands/upgrade.d.ts +3 -3
  71. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  72. package/dist/cli/commands/upgrade.js +24 -3
  73. package/dist/cli/commands/upgrade.js.map +1 -1
  74. package/dist/cli/detect.js +32 -32
  75. package/dist/cli/index.js +51 -51
  76. package/dist/cli/llm/claude-commands.js +16 -16
  77. package/dist/cli/llm/config.js +18 -18
  78. package/dist/cli/llm/gemini-commands.js +16 -16
  79. package/dist/cli/llm/gpt-commands.js +19 -19
  80. package/dist/cli/llm/help.js +21 -21
  81. package/dist/cli/postinstall/cursor-agents.js +32 -32
  82. package/dist/cli/postinstall/cursor-rules.js +83 -83
  83. package/dist/cli/postinstall/cursor-skills.js +743 -743
  84. package/dist/cli/setup/Provisioner.js +42 -42
  85. package/dist/infra/lib/DeepInit.js +24 -24
  86. package/dist/infra/lib/IterationTracker.js +11 -11
  87. package/dist/infra/lib/PythonParser.js +108 -108
  88. package/dist/infra/lib/ReviewRace.js +96 -96
  89. package/dist/infra/lib/SkillFrontmatter.js +28 -28
  90. package/dist/infra/lib/SkillQualityGate.js +9 -9
  91. package/dist/infra/lib/SkillRepository.js +159 -159
  92. package/dist/infra/lib/UltraQA.js +99 -99
  93. package/dist/infra/lib/autonomy/AuditStore.js +41 -41
  94. package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
  95. package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
  96. package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
  97. package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
  98. package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
  99. package/dist/infra/lib/embedding/VectorStore.js +22 -22
  100. package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
  101. package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
  102. package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
  103. package/dist/infra/lib/evolution/InsightStore.js +90 -90
  104. package/dist/infra/lib/evolution/RollbackManager.js +5 -5
  105. package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
  106. package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
  107. package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
  108. package/dist/infra/lib/evolution/UsageTracker.js +28 -28
  109. package/dist/infra/lib/gemini/orchestration.js +5 -5
  110. package/dist/infra/lib/gpt/orchestration.js +4 -4
  111. package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
  112. package/dist/infra/lib/memory/MemorySearch.js +57 -57
  113. package/dist/infra/lib/memory/MemoryStorage.js +181 -181
  114. package/dist/infra/lib/memory/ObservationStore.js +28 -28
  115. package/dist/infra/lib/memory/ReflectionStore.js +30 -30
  116. package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
  117. package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
  118. package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
  119. package/dist/infra/lib/telemetry/SkillTelemetry.d.ts +52 -0
  120. package/dist/infra/lib/telemetry/SkillTelemetry.d.ts.map +1 -0
  121. package/dist/infra/lib/telemetry/SkillTelemetry.js +117 -0
  122. package/dist/infra/lib/telemetry/SkillTelemetry.js.map +1 -0
  123. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts +2 -0
  124. package/dist/infra/lib/telemetry/SkillTelemetry.test.d.ts.map +1 -0
  125. package/dist/infra/lib/telemetry/SkillTelemetry.test.js +91 -0
  126. package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +1 -0
  127. package/dist/infra/orchestrator/AgentManager.js +12 -12
  128. package/dist/infra/orchestrator/AgentRegistry.js +65 -65
  129. package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
  130. package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
  131. package/dist/infra/orchestrator/parallelResearch.js +24 -24
  132. package/dist/test-helpers/index.d.ts +36 -0
  133. package/dist/test-helpers/index.d.ts.map +1 -0
  134. package/dist/test-helpers/index.js +85 -0
  135. package/dist/test-helpers/index.js.map +1 -0
  136. package/dist/test-helpers/index.test.d.ts +2 -0
  137. package/dist/test-helpers/index.test.d.ts.map +1 -0
  138. package/dist/test-helpers/index.test.js +92 -0
  139. package/dist/test-helpers/index.test.js.map +1 -0
  140. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  141. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  142. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  143. package/dist/tools/memory/getMemoryGraph.js +12 -12
  144. package/dist/tools/memory/getSessionContext.js +9 -9
  145. package/dist/tools/memory/linkMemories.js +14 -14
  146. package/dist/tools/memory/listMemories.js +4 -4
  147. package/dist/tools/memory/recallMemory.js +4 -4
  148. package/dist/tools/memory/saveMemory.js +4 -4
  149. package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
  150. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  151. package/dist/tools/semantic/astGrep.test.js +6 -6
  152. package/dist/tools/spec/prdParser.test.js +171 -171
  153. package/dist/tools/spec/specGenerator.js +169 -169
  154. package/dist/tools/spec/traceabilityMatrix.js +64 -64
  155. package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
  156. package/hooks/gemini-hooks.json +73 -73
  157. package/hooks/hooks.json +137 -137
  158. package/hooks/scripts/code-check.js +77 -77
  159. package/hooks/scripts/context-save.js +212 -212
  160. package/hooks/scripts/hud-status.js +291 -291
  161. package/hooks/scripts/keyword-detector.js +214 -214
  162. package/hooks/scripts/llm-orchestrate.js +475 -475
  163. package/hooks/scripts/post-edit.js +32 -32
  164. package/hooks/scripts/pre-tool-guard.js +125 -125
  165. package/hooks/scripts/prompt-dispatcher.js +185 -185
  166. package/hooks/scripts/sentinel-guard.js +104 -104
  167. package/hooks/scripts/session-start.js +106 -106
  168. package/hooks/scripts/stop-notify.js +209 -209
  169. package/hooks/scripts/utils.js +100 -100
  170. package/languages/csharp-unity.md +515 -515
  171. package/languages/gdscript-godot.md +470 -470
  172. package/languages/ruby-rails.md +489 -489
  173. package/languages/typescript-angular.md +433 -433
  174. package/languages/typescript-astro.md +416 -416
  175. package/languages/typescript-electron.md +406 -406
  176. package/languages/typescript-nestjs.md +524 -524
  177. package/languages/typescript-svelte.md +407 -407
  178. package/languages/typescript-tauri.md +365 -365
  179. package/package.json +123 -121
  180. package/skills/agents-md/SKILL.md +120 -120
  181. package/skills/arch-guard/SKILL.md +180 -180
  182. package/skills/brand-assets/SKILL.md +146 -146
  183. package/skills/capability-loop/SKILL.md +167 -167
  184. package/skills/characterization-test/SKILL.md +206 -206
  185. package/skills/commerce-patterns/SKILL.md +63 -63
  186. package/skills/commit-push-pr/SKILL.md +75 -75
  187. package/skills/context7-usage/SKILL.md +105 -105
  188. package/skills/core-capabilities/SKILL.md +13 -13
  189. package/skills/e2e-commerce/SKILL.md +61 -61
  190. package/skills/exec-plan/SKILL.md +147 -147
  191. package/skills/frontend-design/SKILL.md +12 -12
  192. package/skills/git-worktree/SKILL.md +72 -72
  193. package/skills/handoff/SKILL.md +109 -109
  194. package/skills/parallel-research/SKILL.md +87 -87
  195. package/skills/priority-todos/SKILL.md +63 -63
  196. package/skills/seo-checklist/SKILL.md +57 -57
  197. package/skills/techdebt/SKILL.md +122 -122
  198. package/skills/tool-fallback/SKILL.md +103 -103
  199. package/skills/typescript-advanced-types/SKILL.md +66 -66
  200. package/skills/ui-ux-pro-max/SKILL.md +221 -221
  201. package/skills/vercel-react-best-practices/SKILL.md +59 -59
  202. package/skills/video-production/SKILL.md +51 -51
  203. package/vibe/config.json +29 -29
  204. package/vibe/constitution.md +227 -227
  205. package/vibe/rules/principles/communication-guide.md +98 -98
  206. package/vibe/rules/principles/development-philosophy.md +52 -52
  207. package/vibe/rules/principles/quick-start.md +102 -102
  208. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  209. package/vibe/rules/quality/checklist.md +276 -276
  210. package/vibe/rules/quality/performance.md +236 -236
  211. package/vibe/rules/quality/testing-strategy.md +440 -440
  212. package/vibe/rules/standards/anti-patterns.md +541 -541
  213. package/vibe/rules/standards/code-structure.md +291 -291
  214. package/vibe/rules/standards/complexity-metrics.md +313 -313
  215. package/vibe/rules/standards/git-workflow.md +237 -237
  216. package/vibe/rules/standards/naming-conventions.md +198 -198
  217. package/vibe/rules/standards/security.md +305 -305
  218. package/vibe/rules/writing/document-style.md +74 -74
  219. package/vibe/setup.sh +31 -31
  220. package/vibe/templates/constitution-template.md +252 -252
  221. package/vibe/templates/contract-backend-template.md +526 -526
  222. package/vibe/templates/contract-frontend-template.md +599 -599
  223. package/vibe/templates/feature-template.md +96 -96
  224. package/vibe/templates/spec-template.md +221 -221
  225. package/vibe/ui-ux-data/charts.csv +26 -26
  226. package/vibe/ui-ux-data/colors.csv +97 -97
  227. package/vibe/ui-ux-data/icons.csv +101 -101
  228. package/vibe/ui-ux-data/landing.csv +31 -31
  229. package/vibe/ui-ux-data/products.csv +96 -96
  230. package/vibe/ui-ux-data/react-performance.csv +45 -45
  231. package/vibe/ui-ux-data/stacks/astro.csv +54 -54
  232. package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
  233. package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
  234. package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
  235. package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
  236. package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
  237. package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
  238. package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
  239. package/vibe/ui-ux-data/stacks/react.csv +54 -54
  240. package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
  241. package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
  242. package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
  243. package/vibe/ui-ux-data/stacks/vue.csv +50 -50
  244. package/vibe/ui-ux-data/styles.csv +68 -68
  245. package/vibe/ui-ux-data/typography.csv +57 -57
  246. package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
  247. package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
  248. package/vibe/ui-ux-data/version.json +31 -31
  249. package/vibe/ui-ux-data/web-interface.csv +31 -31
@@ -1,313 +1,313 @@
1
- # Software Engineering Complexity Measurement
2
-
3
- ## 4.1 Complexity Metrics
4
-
5
- ### Cyclomatic Complexity
6
-
7
- **Definition**: Number of independent execution paths in code
8
-
9
- **Target**: ≤ 10
10
-
11
- ```typescript
12
- // ❌ High cyclomatic complexity (6)
13
- function processUser(user) {
14
- if (user.isActive) { // +1
15
- if (user.hasPermission) { // +1
16
- if (user.email) { // +1
17
- if (user.verified) { // +1
18
- return processData();
19
- }
20
- }
21
- }
22
- }
23
- return null;
24
- }
25
-
26
- // ✅ Low cyclomatic complexity (4) - Using early returns
27
- function processUser(user) {
28
- if (!user.isActive) return null; // +1
29
- if (!user.hasPermission) return null; // +1
30
- if (!user.email) return null; // +1
31
- if (!user.verified) return null; // +1
32
-
33
- return processData();
34
- }
35
- ```
36
-
37
- ### Cognitive Complexity
38
-
39
- **Definition**: Mental effort required to understand code
40
-
41
- **Target**: ≤ 15
42
-
43
- ```typescript
44
- // ❌ High cognitive complexity
45
- function calculateDiscount(user, items) {
46
- let discount = 0;
47
- if (user.isPremium) { // +1
48
- for (let item of items) { // +1 (nesting)
49
- if (item.category === 'electronics') { // +2 (nested if)
50
- discount += item.price * 0.1;
51
- } else if (item.category === 'books') { // +1
52
- discount += item.price * 0.05;
53
- }
54
- }
55
- }
56
- return discount;
57
- }
58
-
59
- // ✅ Low cognitive complexity - Function separation
60
- function calculateDiscount(user, items) {
61
- if (!user.isPremium) return 0; // +1
62
- return items.reduce((total, item) => total + getItemDiscount(item), 0);
63
- }
64
-
65
- function getItemDiscount(item) {
66
- const discountRates = {
67
- electronics: 0.1,
68
- books: 0.05,
69
- };
70
- return item.price * (discountRates[item.category] || 0);
71
- }
72
- ```
73
-
74
- ### Halstead Metrics
75
-
76
- **Measurements**:
77
-
78
- - **Operators**: Operators (=, +, -, *, if, for, etc.)
79
- - **Operands**: Operands (variables, constants, function names)
80
- - **Vocabulary**: Unique operators + unique operands
81
- - **Length**: Total token count
82
- - **Difficulty**: Code comprehension difficulty
83
- - **Effort**: Mental effort required to write code
84
-
85
- ```typescript
86
- // Halstead metrics measurement example
87
- function calculateArea(radius: number): number {
88
- const pi = 3.14159;
89
- return pi * radius * radius;
90
- }
91
-
92
- /*
93
- Operators: =, *, const, function, :, return (6)
94
- Operands: calculateArea, radius, number, pi, 3.14159 (5)
95
- Vocabulary: 6 + 5 = 11
96
- Length: Total token count
97
- Difficulty: Calculated from Vocabulary and operand repetition
98
- Effort: Difficulty × Volume
99
- */
100
- ```
101
-
102
- ## 4.2 Coupling & Cohesion
103
-
104
- ### Loose Coupling
105
-
106
- **Goal**: Minimize dependencies between modules
107
-
108
- ```typescript
109
- // ❌ Tight coupling - Direct dependencies
110
- class UserService {
111
- constructor() {
112
- this.database = new PostgreSQLDatabase(); // Direct dependency
113
- this.emailService = new SendGridEmail(); // Direct dependency
114
- }
115
- }
116
-
117
- // ✅ Loose coupling - Dependency injection
118
- interface IDatabase {
119
- save(data: unknown): Promise<void>;
120
- load(id: string): Promise<unknown>;
121
- }
122
-
123
- interface IEmailService {
124
- send(to: string, message: string): Promise<void>;
125
- }
126
-
127
- class UserService {
128
- constructor(
129
- private database: IDatabase,
130
- private emailService: IEmailService
131
- ) {}
132
- }
133
-
134
- // Usage
135
- const userService = new UserService(
136
- new PostgreSQLDatabase(),
137
- new SendGridEmail()
138
- );
139
- ```
140
-
141
- ### High Cohesion
142
-
143
- **Goal**: Group only related functions together
144
-
145
- ```typescript
146
- // ❌ Low cohesion - Unrelated functions
147
- class Utils {
148
- validateEmail(email: string) { /* */ }
149
- formatCurrency(amount: number) { /* */ }
150
- sendNotification(message: string) { /* */ }
151
- calculateTax(income: number) { /* */ }
152
- }
153
-
154
- // ✅ High cohesion - Only related functions
155
- class EmailValidator {
156
- validateFormat(email: string) { /* */ }
157
- validateDomain(email: string) { /* */ }
158
- validateMX(email: string) { /* */ }
159
- }
160
-
161
- class CurrencyFormatter {
162
- formatKRW(amount: number) { /* */ }
163
- formatUSD(amount: number) { /* */ }
164
- parseAmount(formatted: string) { /* */ }
165
- }
166
-
167
- class TaxCalculator {
168
- calculateIncomeTax(income: number) { /* */ }
169
- calculateVAT(amount: number) { /* */ }
170
- calculateTotal(income: number) { /* */ }
171
- }
172
- ```
173
-
174
- ## Complexity Reduction Strategies
175
-
176
- ### 1. Early Return Pattern
177
-
178
- ```typescript
179
- // ❌ Nested if statements
180
- function processOrder(order: Order) {
181
- if (order) {
182
- if (order.isValid) {
183
- if (order.items.length > 0) {
184
- if (order.user.isActive) {
185
- return processItems(order.items);
186
- }
187
- }
188
- }
189
- }
190
- return null;
191
- }
192
-
193
- // ✅ Early return
194
- function processOrder(order: Order) {
195
- if (!order) return null;
196
- if (!order.isValid) return null;
197
- if (order.items.length === 0) return null;
198
- if (!order.user.isActive) return null;
199
-
200
- return processItems(order.items);
201
- }
202
- ```
203
-
204
- ### 2. Strategy Pattern
205
-
206
- ```typescript
207
- // ❌ Complex if-else chain
208
- function calculateShipping(type: string, weight: number) {
209
- if (type === 'express') {
210
- return weight * 5 + 10;
211
- } else if (type === 'standard') {
212
- return weight * 3 + 5;
213
- } else if (type === 'economy') {
214
- return weight * 2;
215
- }
216
- return 0;
217
- }
218
-
219
- // ✅ Strategy pattern
220
- interface ShippingStrategy {
221
- calculate(weight: number): number;
222
- }
223
-
224
- class ExpressShipping implements ShippingStrategy {
225
- calculate(weight: number) {
226
- return weight * 5 + 10;
227
- }
228
- }
229
-
230
- class StandardShipping implements ShippingStrategy {
231
- calculate(weight: number) {
232
- return weight * 3 + 5;
233
- }
234
- }
235
-
236
- const strategies: Record<string, ShippingStrategy> = {
237
- express: new ExpressShipping(),
238
- standard: new StandardShipping(),
239
- };
240
-
241
- function calculateShipping(type: string, weight: number) {
242
- const strategy = strategies[type];
243
- return strategy ? strategy.calculate(weight) : 0;
244
- }
245
- ```
246
-
247
- ### 3. Extract Function
248
-
249
- ```typescript
250
- // ❌ Long function
251
- function processUserRegistration(userData: UserData) {
252
- // 20 lines: Email validation
253
- // 15 lines: Password hashing
254
- // 10 lines: Database save
255
- // 5 lines: Welcome email
256
- }
257
-
258
- // ✅ Extract functions
259
- function processUserRegistration(userData: UserData) {
260
- validateEmail(userData.email);
261
- const hashedPassword = hashPassword(userData.password);
262
- const user = saveToDatabase({ ...userData, password: hashedPassword });
263
- sendWelcomeEmail(user.email);
264
- return user;
265
- }
266
-
267
- function validateEmail(email: string) { /* ... */ }
268
- function hashPassword(password: string) { /* ... */ }
269
- function saveToDatabase(data: UserData) { /* ... */ }
270
- function sendWelcomeEmail(email: string) { /* ... */ }
271
- ```
272
-
273
- ## Measurement Tools
274
-
275
- ### TypeScript/JavaScript
276
-
277
- ```bash
278
- # ESLint (complexity measurement plugin)
279
- npm install eslint-plugin-complexity
280
-
281
- # .eslintrc.js
282
- {
283
- "rules": {
284
- "complexity": ["error", 10],
285
- "max-depth": ["error", 3],
286
- "max-lines-per-function": ["error", 20]
287
- }
288
- }
289
- ```
290
-
291
- ### Python
292
-
293
- ```bash
294
- # Radon (complexity measurement tool)
295
- pip install radon
296
-
297
- # Cyclomatic Complexity
298
- radon cc app/ -a -nc
299
-
300
- # Maintainability Index
301
- radon mi app/
302
- ```
303
-
304
- ## Target Metrics Summary
305
-
306
- | Metric | Target | Description |
307
- |--------|--------|-------------|
308
- | Cyclomatic Complexity | ≤ 10 | Independent execution paths |
309
- | Cognitive Complexity | ≤ 15 | Easy to understand |
310
- | Function Length | ≤ 20 lines | Short, focused functions |
311
- | Nesting Depth | ≤ 3 levels | Flat structure |
312
- | Parameters | ≤ 5 | Function parameter limit |
313
- | Dependencies | ≤ 7 | Module dependency limit |
1
+ # Software Engineering Complexity Measurement
2
+
3
+ ## 4.1 Complexity Metrics
4
+
5
+ ### Cyclomatic Complexity
6
+
7
+ **Definition**: Number of independent execution paths in code
8
+
9
+ **Target**: ≤ 10
10
+
11
+ ```typescript
12
+ // ❌ High cyclomatic complexity (6)
13
+ function processUser(user) {
14
+ if (user.isActive) { // +1
15
+ if (user.hasPermission) { // +1
16
+ if (user.email) { // +1
17
+ if (user.verified) { // +1
18
+ return processData();
19
+ }
20
+ }
21
+ }
22
+ }
23
+ return null;
24
+ }
25
+
26
+ // ✅ Low cyclomatic complexity (4) - Using early returns
27
+ function processUser(user) {
28
+ if (!user.isActive) return null; // +1
29
+ if (!user.hasPermission) return null; // +1
30
+ if (!user.email) return null; // +1
31
+ if (!user.verified) return null; // +1
32
+
33
+ return processData();
34
+ }
35
+ ```
36
+
37
+ ### Cognitive Complexity
38
+
39
+ **Definition**: Mental effort required to understand code
40
+
41
+ **Target**: ≤ 15
42
+
43
+ ```typescript
44
+ // ❌ High cognitive complexity
45
+ function calculateDiscount(user, items) {
46
+ let discount = 0;
47
+ if (user.isPremium) { // +1
48
+ for (let item of items) { // +1 (nesting)
49
+ if (item.category === 'electronics') { // +2 (nested if)
50
+ discount += item.price * 0.1;
51
+ } else if (item.category === 'books') { // +1
52
+ discount += item.price * 0.05;
53
+ }
54
+ }
55
+ }
56
+ return discount;
57
+ }
58
+
59
+ // ✅ Low cognitive complexity - Function separation
60
+ function calculateDiscount(user, items) {
61
+ if (!user.isPremium) return 0; // +1
62
+ return items.reduce((total, item) => total + getItemDiscount(item), 0);
63
+ }
64
+
65
+ function getItemDiscount(item) {
66
+ const discountRates = {
67
+ electronics: 0.1,
68
+ books: 0.05,
69
+ };
70
+ return item.price * (discountRates[item.category] || 0);
71
+ }
72
+ ```
73
+
74
+ ### Halstead Metrics
75
+
76
+ **Measurements**:
77
+
78
+ - **Operators**: Operators (=, +, -, *, if, for, etc.)
79
+ - **Operands**: Operands (variables, constants, function names)
80
+ - **Vocabulary**: Unique operators + unique operands
81
+ - **Length**: Total token count
82
+ - **Difficulty**: Code comprehension difficulty
83
+ - **Effort**: Mental effort required to write code
84
+
85
+ ```typescript
86
+ // Halstead metrics measurement example
87
+ function calculateArea(radius: number): number {
88
+ const pi = 3.14159;
89
+ return pi * radius * radius;
90
+ }
91
+
92
+ /*
93
+ Operators: =, *, const, function, :, return (6)
94
+ Operands: calculateArea, radius, number, pi, 3.14159 (5)
95
+ Vocabulary: 6 + 5 = 11
96
+ Length: Total token count
97
+ Difficulty: Calculated from Vocabulary and operand repetition
98
+ Effort: Difficulty × Volume
99
+ */
100
+ ```
101
+
102
+ ## 4.2 Coupling & Cohesion
103
+
104
+ ### Loose Coupling
105
+
106
+ **Goal**: Minimize dependencies between modules
107
+
108
+ ```typescript
109
+ // ❌ Tight coupling - Direct dependencies
110
+ class UserService {
111
+ constructor() {
112
+ this.database = new PostgreSQLDatabase(); // Direct dependency
113
+ this.emailService = new SendGridEmail(); // Direct dependency
114
+ }
115
+ }
116
+
117
+ // ✅ Loose coupling - Dependency injection
118
+ interface IDatabase {
119
+ save(data: unknown): Promise<void>;
120
+ load(id: string): Promise<unknown>;
121
+ }
122
+
123
+ interface IEmailService {
124
+ send(to: string, message: string): Promise<void>;
125
+ }
126
+
127
+ class UserService {
128
+ constructor(
129
+ private database: IDatabase,
130
+ private emailService: IEmailService
131
+ ) {}
132
+ }
133
+
134
+ // Usage
135
+ const userService = new UserService(
136
+ new PostgreSQLDatabase(),
137
+ new SendGridEmail()
138
+ );
139
+ ```
140
+
141
+ ### High Cohesion
142
+
143
+ **Goal**: Group only related functions together
144
+
145
+ ```typescript
146
+ // ❌ Low cohesion - Unrelated functions
147
+ class Utils {
148
+ validateEmail(email: string) { /* */ }
149
+ formatCurrency(amount: number) { /* */ }
150
+ sendNotification(message: string) { /* */ }
151
+ calculateTax(income: number) { /* */ }
152
+ }
153
+
154
+ // ✅ High cohesion - Only related functions
155
+ class EmailValidator {
156
+ validateFormat(email: string) { /* */ }
157
+ validateDomain(email: string) { /* */ }
158
+ validateMX(email: string) { /* */ }
159
+ }
160
+
161
+ class CurrencyFormatter {
162
+ formatKRW(amount: number) { /* */ }
163
+ formatUSD(amount: number) { /* */ }
164
+ parseAmount(formatted: string) { /* */ }
165
+ }
166
+
167
+ class TaxCalculator {
168
+ calculateIncomeTax(income: number) { /* */ }
169
+ calculateVAT(amount: number) { /* */ }
170
+ calculateTotal(income: number) { /* */ }
171
+ }
172
+ ```
173
+
174
+ ## Complexity Reduction Strategies
175
+
176
+ ### 1. Early Return Pattern
177
+
178
+ ```typescript
179
+ // ❌ Nested if statements
180
+ function processOrder(order: Order) {
181
+ if (order) {
182
+ if (order.isValid) {
183
+ if (order.items.length > 0) {
184
+ if (order.user.isActive) {
185
+ return processItems(order.items);
186
+ }
187
+ }
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+
193
+ // ✅ Early return
194
+ function processOrder(order: Order) {
195
+ if (!order) return null;
196
+ if (!order.isValid) return null;
197
+ if (order.items.length === 0) return null;
198
+ if (!order.user.isActive) return null;
199
+
200
+ return processItems(order.items);
201
+ }
202
+ ```
203
+
204
+ ### 2. Strategy Pattern
205
+
206
+ ```typescript
207
+ // ❌ Complex if-else chain
208
+ function calculateShipping(type: string, weight: number) {
209
+ if (type === 'express') {
210
+ return weight * 5 + 10;
211
+ } else if (type === 'standard') {
212
+ return weight * 3 + 5;
213
+ } else if (type === 'economy') {
214
+ return weight * 2;
215
+ }
216
+ return 0;
217
+ }
218
+
219
+ // ✅ Strategy pattern
220
+ interface ShippingStrategy {
221
+ calculate(weight: number): number;
222
+ }
223
+
224
+ class ExpressShipping implements ShippingStrategy {
225
+ calculate(weight: number) {
226
+ return weight * 5 + 10;
227
+ }
228
+ }
229
+
230
+ class StandardShipping implements ShippingStrategy {
231
+ calculate(weight: number) {
232
+ return weight * 3 + 5;
233
+ }
234
+ }
235
+
236
+ const strategies: Record<string, ShippingStrategy> = {
237
+ express: new ExpressShipping(),
238
+ standard: new StandardShipping(),
239
+ };
240
+
241
+ function calculateShipping(type: string, weight: number) {
242
+ const strategy = strategies[type];
243
+ return strategy ? strategy.calculate(weight) : 0;
244
+ }
245
+ ```
246
+
247
+ ### 3. Extract Function
248
+
249
+ ```typescript
250
+ // ❌ Long function
251
+ function processUserRegistration(userData: UserData) {
252
+ // 20 lines: Email validation
253
+ // 15 lines: Password hashing
254
+ // 10 lines: Database save
255
+ // 5 lines: Welcome email
256
+ }
257
+
258
+ // ✅ Extract functions
259
+ function processUserRegistration(userData: UserData) {
260
+ validateEmail(userData.email);
261
+ const hashedPassword = hashPassword(userData.password);
262
+ const user = saveToDatabase({ ...userData, password: hashedPassword });
263
+ sendWelcomeEmail(user.email);
264
+ return user;
265
+ }
266
+
267
+ function validateEmail(email: string) { /* ... */ }
268
+ function hashPassword(password: string) { /* ... */ }
269
+ function saveToDatabase(data: UserData) { /* ... */ }
270
+ function sendWelcomeEmail(email: string) { /* ... */ }
271
+ ```
272
+
273
+ ## Measurement Tools
274
+
275
+ ### TypeScript/JavaScript
276
+
277
+ ```bash
278
+ # ESLint (complexity measurement plugin)
279
+ npm install eslint-plugin-complexity
280
+
281
+ # .eslintrc.js
282
+ {
283
+ "rules": {
284
+ "complexity": ["error", 10],
285
+ "max-depth": ["error", 3],
286
+ "max-lines-per-function": ["error", 20]
287
+ }
288
+ }
289
+ ```
290
+
291
+ ### Python
292
+
293
+ ```bash
294
+ # Radon (complexity measurement tool)
295
+ pip install radon
296
+
297
+ # Cyclomatic Complexity
298
+ radon cc app/ -a -nc
299
+
300
+ # Maintainability Index
301
+ radon mi app/
302
+ ```
303
+
304
+ ## Target Metrics Summary
305
+
306
+ | Metric | Target | Description |
307
+ |--------|--------|-------------|
308
+ | Cyclomatic Complexity | ≤ 10 | Independent execution paths |
309
+ | Cognitive Complexity | ≤ 15 | Easy to understand |
310
+ | Function Length | ≤ 20 lines | Short, focused functions |
311
+ | Nesting Depth | ≤ 3 levels | Flat structure |
312
+ | Parameters | ≤ 5 | Function parameter limit |
313
+ | Dependencies | ≤ 7 | Module dependency limit |