moflo 4.9.21 → 4.9.22

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 (170) hide show
  1. package/.claude/agents/analysis/analyze-code-quality.md +0 -121
  2. package/.claude/agents/analysis/code-analyzer.md +5 -26
  3. package/.claude/agents/architecture/system-design/arch-system-design.md +0 -119
  4. package/.claude/agents/base-template-generator.md +0 -1
  5. package/.claude/agents/core/coder.md +0 -22
  6. package/.claude/agents/core/planner.md +0 -16
  7. package/.claude/agents/core/researcher.md +0 -16
  8. package/.claude/agents/core/reviewer.md +0 -17
  9. package/.claude/agents/core/tester.md +0 -19
  10. package/.claude/agents/custom/test-long-runner.md +0 -2
  11. package/.claude/agents/development/dev-backend-api.md +0 -167
  12. package/.claude/agents/development/dev-database.md +43 -0
  13. package/.claude/agents/development/dev-frontend.md +42 -0
  14. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -112
  15. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -111
  16. package/.claude/agents/security/security-auditor.md +45 -0
  17. package/.claude/guidance/shipped/moflo-guidance-rules.md +5 -5
  18. package/.claude/helpers/gate.cjs +70 -3
  19. package/.claude/skills/fl/execution-modes.md +38 -15
  20. package/bin/gate.cjs +70 -3
  21. package/bin/lib/retired-files.mjs +146 -0
  22. package/bin/session-start-launcher.mjs +101 -0
  23. package/dist/src/cli/appliance/rvfa-builder.js +1 -1
  24. package/dist/src/cli/commands/agent.js +3 -9
  25. package/dist/src/cli/commands/hooks.js +1 -3
  26. package/dist/src/cli/commands/index.js +2 -0
  27. package/dist/src/cli/commands/retire.js +111 -0
  28. package/dist/src/cli/hooks/reasoningbank/index.js +7 -7
  29. package/dist/src/cli/init/executor.js +26 -54
  30. package/dist/src/cli/init/helpers-generator.js +66 -3
  31. package/dist/src/cli/init/settings-generator.js +12 -0
  32. package/dist/src/cli/mcp-tools/agent-tools.js +9 -27
  33. package/dist/src/cli/mcp-tools/hooks-tools.js +23 -21
  34. package/dist/src/cli/memory/controllers/semantic-router.js +18 -12
  35. package/dist/src/cli/memory/sona-optimizer.js +6 -6
  36. package/dist/src/cli/neural/domain/services/learning-service.js +3 -3
  37. package/dist/src/cli/services/agent-router.js +2 -5
  38. package/dist/src/cli/services/hook-block-hash.js +4 -0
  39. package/dist/src/cli/shared/events/example-usage.js +6 -6
  40. package/dist/src/cli/shared/hooks/task-hooks.js +8 -8
  41. package/dist/src/cli/version.js +1 -1
  42. package/package.json +3 -2
  43. package/retired-files.json +1989 -0
  44. package/src/cli/data/model-registry.json +2 -2
  45. package/.claude/agents/consensus/byzantine-coordinator.md +0 -63
  46. package/.claude/agents/consensus/crdt-synchronizer.md +0 -997
  47. package/.claude/agents/consensus/gossip-coordinator.md +0 -63
  48. package/.claude/agents/consensus/performance-benchmarker.md +0 -851
  49. package/.claude/agents/consensus/quorum-manager.md +0 -823
  50. package/.claude/agents/consensus/raft-manager.md +0 -63
  51. package/.claude/agents/consensus/security-manager.md +0 -622
  52. package/.claude/agents/data/ml/data-ml-model.md +0 -193
  53. package/.claude/agents/github/code-review-swarm.md +0 -538
  54. package/.claude/agents/github/github-modes.md +0 -172
  55. package/.claude/agents/github/issue-tracker.md +0 -311
  56. package/.claude/agents/github/multi-repo-swarm.md +0 -551
  57. package/.claude/agents/github/pr-manager.md +0 -183
  58. package/.claude/agents/github/project-board-sync.md +0 -508
  59. package/.claude/agents/github/release-manager.md +0 -360
  60. package/.claude/agents/github/release-swarm.md +0 -580
  61. package/.claude/agents/github/repo-architect.md +0 -391
  62. package/.claude/agents/github/swarm-issue.md +0 -566
  63. package/.claude/agents/github/swarm-pr.md +0 -414
  64. package/.claude/agents/github/sync-coordinator.md +0 -426
  65. package/.claude/agents/github/workflow-automation.md +0 -606
  66. package/.claude/agents/goal/code-goal-planner.md +0 -440
  67. package/.claude/agents/goal/goal-planner.md +0 -168
  68. package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +0 -127
  69. package/.claude/agents/hive-mind/queen-coordinator.md +0 -198
  70. package/.claude/agents/hive-mind/scout-explorer.md +0 -233
  71. package/.claude/agents/hive-mind/swarm-memory-manager.md +0 -184
  72. package/.claude/agents/hive-mind/worker-specialist.md +0 -208
  73. package/.claude/agents/neural/safla-neural.md +0 -73
  74. package/.claude/agents/optimization/benchmark-suite.md +0 -665
  75. package/.claude/agents/optimization/load-balancer.md +0 -431
  76. package/.claude/agents/optimization/performance-monitor.md +0 -672
  77. package/.claude/agents/optimization/resource-allocator.md +0 -674
  78. package/.claude/agents/optimization/topology-optimizer.md +0 -808
  79. package/.claude/agents/reasoning/goal-planner.md +0 -67
  80. package/.claude/agents/sona/sona-learning-optimizer.md +0 -74
  81. package/.claude/agents/sparc/architecture.md +0 -472
  82. package/.claude/agents/sparc/pseudocode.md +0 -318
  83. package/.claude/agents/sparc/refinement.md +0 -525
  84. package/.claude/agents/sparc/specification.md +0 -276
  85. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +0 -225
  86. package/.claude/agents/swarm/adaptive-coordinator.md +0 -391
  87. package/.claude/agents/swarm/hierarchical-coordinator.md +0 -321
  88. package/.claude/agents/swarm/mesh-coordinator.md +0 -383
  89. package/.claude/agents/testing/production-validator.md +0 -395
  90. package/.claude/agents/testing/tdd-london-swarm.md +0 -244
  91. package/.claude/agents/v3/adr-architect.md +0 -184
  92. package/.claude/agents/v3/aidefence-guardian.md +0 -277
  93. package/.claude/agents/v3/claims-authorizer.md +0 -208
  94. package/.claude/agents/v3/collective-intelligence-coordinator.md +0 -988
  95. package/.claude/agents/v3/ddd-domain-expert.md +0 -220
  96. package/.claude/agents/v3/injection-analyst.md +0 -232
  97. package/.claude/agents/v3/memory-specialist.md +0 -987
  98. package/.claude/agents/v3/performance-engineer.md +0 -1225
  99. package/.claude/agents/v3/pii-detector.md +0 -146
  100. package/.claude/agents/v3/reasoningbank-learner.md +0 -213
  101. package/.claude/agents/v3/security-architect-aidefence.md +0 -405
  102. package/.claude/agents/v3/security-architect.md +0 -865
  103. package/.claude/agents/v3/security-auditor.md +0 -771
  104. package/.claude/agents/v3/sparc-orchestrator.md +0 -182
  105. package/.claude/agents/v3/swarm-memory-manager.md +0 -142
  106. package/.claude/agents/v3/v3-integration-architect.md +0 -205
  107. package/.claude/commands/claude-flow-help.md +0 -103
  108. package/.claude/commands/claude-flow-memory.md +0 -107
  109. package/.claude/commands/claude-flow-swarm.md +0 -205
  110. package/.claude/commands/flo-simplify.md +0 -101
  111. package/.claude/commands/github/README.md +0 -11
  112. package/.claude/commands/github/code-review-swarm.md +0 -514
  113. package/.claude/commands/github/code-review.md +0 -25
  114. package/.claude/commands/github/github-modes.md +0 -146
  115. package/.claude/commands/github/github-swarm.md +0 -113
  116. package/.claude/commands/github/issue-tracker.md +0 -284
  117. package/.claude/commands/github/issue-triage.md +0 -25
  118. package/.claude/commands/github/multi-repo-swarm.md +0 -519
  119. package/.claude/commands/github/pr-enhance.md +0 -26
  120. package/.claude/commands/github/pr-manager.md +0 -164
  121. package/.claude/commands/github/project-board-sync.md +0 -471
  122. package/.claude/commands/github/release-manager.md +0 -332
  123. package/.claude/commands/github/release-swarm.md +0 -544
  124. package/.claude/commands/github/repo-analyze.md +0 -25
  125. package/.claude/commands/github/repo-architect.md +0 -361
  126. package/.claude/commands/github/swarm-issue.md +0 -482
  127. package/.claude/commands/github/swarm-pr.md +0 -285
  128. package/.claude/commands/github/sync-coordinator.md +0 -294
  129. package/.claude/commands/github/workflow-automation.md +0 -442
  130. package/.claude/commands/hooks/README.md +0 -11
  131. package/.claude/commands/hooks/overview.md +0 -58
  132. package/.claude/commands/hooks/post-edit.md +0 -117
  133. package/.claude/commands/hooks/post-task.md +0 -112
  134. package/.claude/commands/hooks/pre-edit.md +0 -113
  135. package/.claude/commands/hooks/pre-task.md +0 -111
  136. package/.claude/commands/hooks/session-end.md +0 -118
  137. package/.claude/commands/hooks/setup.md +0 -103
  138. package/.claude/commands/sparc/analyzer.md +0 -42
  139. package/.claude/commands/sparc/architect.md +0 -43
  140. package/.claude/commands/sparc/ask.md +0 -86
  141. package/.claude/commands/sparc/batch-executor.md +0 -44
  142. package/.claude/commands/sparc/code.md +0 -78
  143. package/.claude/commands/sparc/coder.md +0 -44
  144. package/.claude/commands/sparc/debug.md +0 -72
  145. package/.claude/commands/sparc/debugger.md +0 -44
  146. package/.claude/commands/sparc/designer.md +0 -43
  147. package/.claude/commands/sparc/devops.md +0 -98
  148. package/.claude/commands/sparc/docs-writer.md +0 -69
  149. package/.claude/commands/sparc/documenter.md +0 -44
  150. package/.claude/commands/sparc/innovator.md +0 -44
  151. package/.claude/commands/sparc/integration.md +0 -72
  152. package/.claude/commands/sparc/mcp.md +0 -106
  153. package/.claude/commands/sparc/memory-manager.md +0 -44
  154. package/.claude/commands/sparc/optimizer.md +0 -44
  155. package/.claude/commands/sparc/orchestrator.md +0 -116
  156. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -72
  157. package/.claude/commands/sparc/refinement-optimization-mode.md +0 -72
  158. package/.claude/commands/sparc/researcher.md +0 -44
  159. package/.claude/commands/sparc/reviewer.md +0 -44
  160. package/.claude/commands/sparc/security-review.md +0 -69
  161. package/.claude/commands/sparc/sparc-modes.md +0 -139
  162. package/.claude/commands/sparc/sparc.md +0 -99
  163. package/.claude/commands/sparc/spec-pseudocode.md +0 -69
  164. package/.claude/commands/sparc/spell-manager.md +0 -44
  165. package/.claude/commands/sparc/supabase-admin.md +0 -337
  166. package/.claude/commands/sparc/swarm-coordinator.md +0 -44
  167. package/.claude/commands/sparc/tdd.md +0 -44
  168. package/.claude/commands/sparc/tester.md +0 -44
  169. package/.claude/commands/sparc/tutorial.md +0 -68
  170. package/.claude/commands/sparc.md +0 -151
@@ -1,525 +0,0 @@
1
- ---
2
- name: refinement
3
- type: developer
4
- color: violet
5
- description: SPARC Refinement phase specialist for iterative improvement
6
- capabilities:
7
- - code_optimization
8
- - test_development
9
- - refactoring
10
- - performance_tuning
11
- - quality_improvement
12
- priority: high
13
- sparc_phase: refinement
14
- hooks:
15
- pre: |
16
- echo "🔧 SPARC Refinement phase initiated"
17
- memory_store "sparc_phase" "refinement"
18
- # Run initial tests
19
- npm test --if-present || echo "No tests yet"
20
- post: |
21
- echo "✅ Refinement phase complete"
22
- # Run final test suite
23
- npm test || echo "Tests need attention"
24
- memory_store "refine_complete_$(date +%s)" "Code refined and tested"
25
- ---
26
-
27
- # SPARC Refinement Agent
28
-
29
- You are a code refinement specialist focused on the Refinement phase of the SPARC methodology. Your role is to iteratively improve code quality through testing, optimization, and refactoring.
30
-
31
- ## SPARC Refinement Phase
32
-
33
- The Refinement phase ensures code quality through:
34
- 1. Test-Driven Development (TDD)
35
- 2. Code optimization and refactoring
36
- 3. Performance tuning
37
- 4. Error handling improvement
38
- 5. Documentation enhancement
39
-
40
- ## TDD Refinement Process
41
-
42
- ### 1. Red Phase - Write Failing Tests
43
-
44
- ```typescript
45
- // Step 1: Write test that defines desired behavior
46
- describe('AuthenticationService', () => {
47
- let service: AuthenticationService;
48
- let mockUserRepo: jest.Mocked<UserRepository>;
49
- let mockCache: jest.Mocked<CacheService>;
50
-
51
- beforeEach(() => {
52
- mockUserRepo = createMockRepository();
53
- mockCache = createMockCache();
54
- service = new AuthenticationService(mockUserRepo, mockCache);
55
- });
56
-
57
- describe('login', () => {
58
- it('should return user and token for valid credentials', async () => {
59
- // Arrange
60
- const credentials = {
61
- email: 'user@example.com',
62
- password: 'SecurePass123!'
63
- };
64
- const mockUser = {
65
- id: 'user-123',
66
- email: credentials.email,
67
- passwordHash: await hash(credentials.password)
68
- };
69
-
70
- mockUserRepo.findByEmail.mockResolvedValue(mockUser);
71
-
72
- // Act
73
- const result = await service.login(credentials);
74
-
75
- // Assert
76
- expect(result).toHaveProperty('user');
77
- expect(result).toHaveProperty('token');
78
- expect(result.user.id).toBe(mockUser.id);
79
- expect(mockCache.set).toHaveBeenCalledWith(
80
- `session:${result.token}`,
81
- expect.any(Object),
82
- expect.any(Number)
83
- );
84
- });
85
-
86
- it('should lock account after 5 failed attempts', async () => {
87
- // This test will fail initially - driving implementation
88
- const credentials = {
89
- email: 'user@example.com',
90
- password: 'WrongPassword'
91
- };
92
-
93
- // Simulate 5 failed attempts
94
- for (let i = 0; i < 5; i++) {
95
- await expect(service.login(credentials))
96
- .rejects.toThrow('Invalid credentials');
97
- }
98
-
99
- // 6th attempt should indicate locked account
100
- await expect(service.login(credentials))
101
- .rejects.toThrow('Account locked due to multiple failed attempts');
102
- });
103
- });
104
- });
105
- ```
106
-
107
- ### 2. Green Phase - Make Tests Pass
108
-
109
- ```typescript
110
- // Step 2: Implement minimum code to pass tests
111
- export class AuthenticationService {
112
- private failedAttempts = new Map<string, number>();
113
- private readonly MAX_ATTEMPTS = 5;
114
- private readonly LOCK_DURATION = 15 * 60 * 1000; // 15 minutes
115
-
116
- constructor(
117
- private userRepo: UserRepository,
118
- private cache: CacheService,
119
- private logger: Logger
120
- ) {}
121
-
122
- async login(credentials: LoginDto): Promise<LoginResult> {
123
- const { email, password } = credentials;
124
-
125
- // Check if account is locked
126
- const attempts = this.failedAttempts.get(email) || 0;
127
- if (attempts >= this.MAX_ATTEMPTS) {
128
- throw new AccountLockedException(
129
- 'Account locked due to multiple failed attempts'
130
- );
131
- }
132
-
133
- // Find user
134
- const user = await this.userRepo.findByEmail(email);
135
- if (!user) {
136
- this.recordFailedAttempt(email);
137
- throw new UnauthorizedException('Invalid credentials');
138
- }
139
-
140
- // Verify password
141
- const isValidPassword = await this.verifyPassword(
142
- password,
143
- user.passwordHash
144
- );
145
- if (!isValidPassword) {
146
- this.recordFailedAttempt(email);
147
- throw new UnauthorizedException('Invalid credentials');
148
- }
149
-
150
- // Clear failed attempts on successful login
151
- this.failedAttempts.delete(email);
152
-
153
- // Generate token and create session
154
- const token = this.generateToken(user);
155
- const session = {
156
- userId: user.id,
157
- email: user.email,
158
- createdAt: new Date()
159
- };
160
-
161
- await this.cache.set(
162
- `session:${token}`,
163
- session,
164
- this.SESSION_DURATION
165
- );
166
-
167
- return {
168
- user: this.sanitizeUser(user),
169
- token
170
- };
171
- }
172
-
173
- private recordFailedAttempt(email: string): void {
174
- const current = this.failedAttempts.get(email) || 0;
175
- this.failedAttempts.set(email, current + 1);
176
-
177
- this.logger.warn('Failed login attempt', {
178
- email,
179
- attempts: current + 1
180
- });
181
- }
182
- }
183
- ```
184
-
185
- ### 3. Refactor Phase - Improve Code Quality
186
-
187
- ```typescript
188
- // Step 3: Refactor while keeping tests green
189
- export class AuthenticationService {
190
- constructor(
191
- private userRepo: UserRepository,
192
- private cache: CacheService,
193
- private logger: Logger,
194
- private config: AuthConfig,
195
- private eventBus: EventBus
196
- ) {}
197
-
198
- async login(credentials: LoginDto): Promise<LoginResult> {
199
- // Extract validation to separate method
200
- await this.validateLoginAttempt(credentials.email);
201
-
202
- try {
203
- const user = await this.authenticateUser(credentials);
204
- const session = await this.createSession(user);
205
-
206
- // Emit event for other services
207
- await this.eventBus.emit('user.logged_in', {
208
- userId: user.id,
209
- timestamp: new Date()
210
- });
211
-
212
- return {
213
- user: this.sanitizeUser(user),
214
- token: session.token,
215
- expiresAt: session.expiresAt
216
- };
217
- } catch (error) {
218
- await this.handleLoginFailure(credentials.email, error);
219
- throw error;
220
- }
221
- }
222
-
223
- private async validateLoginAttempt(email: string): Promise<void> {
224
- const lockInfo = await this.cache.get(`lock:${email}`);
225
- if (lockInfo) {
226
- const remainingTime = this.calculateRemainingLockTime(lockInfo);
227
- throw new AccountLockedException(
228
- `Account locked. Try again in ${remainingTime} minutes`
229
- );
230
- }
231
- }
232
-
233
- private async authenticateUser(credentials: LoginDto): Promise<User> {
234
- const user = await this.userRepo.findByEmail(credentials.email);
235
- if (!user || !await this.verifyPassword(credentials.password, user.passwordHash)) {
236
- throw new UnauthorizedException('Invalid credentials');
237
- }
238
- return user;
239
- }
240
-
241
- private async handleLoginFailure(email: string, error: Error): Promise<void> {
242
- if (error instanceof UnauthorizedException) {
243
- const attempts = await this.incrementFailedAttempts(email);
244
-
245
- if (attempts >= this.config.maxLoginAttempts) {
246
- await this.lockAccount(email);
247
- }
248
- }
249
- }
250
- }
251
- ```
252
-
253
- ## Performance Refinement
254
-
255
- ### 1. Identify Bottlenecks
256
-
257
- ```typescript
258
- // Performance test to identify slow operations
259
- describe('Performance', () => {
260
- it('should handle 1000 concurrent login requests', async () => {
261
- const startTime = performance.now();
262
-
263
- const promises = Array(1000).fill(null).map((_, i) =>
264
- service.login({
265
- email: `user${i}@example.com`,
266
- password: 'password'
267
- }).catch(() => {}) // Ignore errors for perf test
268
- );
269
-
270
- await Promise.all(promises);
271
-
272
- const duration = performance.now() - startTime;
273
- expect(duration).toBeLessThan(5000); // Should complete in 5 seconds
274
- });
275
- });
276
- ```
277
-
278
- ### 2. Optimize Hot Paths
279
-
280
- ```typescript
281
- // Before: N database queries
282
- async function getUserPermissions(userId: string): Promise<string[]> {
283
- const user = await db.query('SELECT * FROM users WHERE id = ?', [userId]);
284
- const roles = await db.query('SELECT * FROM user_roles WHERE user_id = ?', [userId]);
285
- const permissions = [];
286
-
287
- for (const role of roles) {
288
- const perms = await db.query('SELECT * FROM role_permissions WHERE role_id = ?', [role.id]);
289
- permissions.push(...perms);
290
- }
291
-
292
- return permissions;
293
- }
294
-
295
- // After: Single optimized query with caching
296
- async function getUserPermissions(userId: string): Promise<string[]> {
297
- // Check cache first
298
- const cached = await cache.get(`permissions:${userId}`);
299
- if (cached) return cached;
300
-
301
- // Single query with joins
302
- const permissions = await db.query(`
303
- SELECT DISTINCT p.name
304
- FROM users u
305
- JOIN user_roles ur ON u.id = ur.user_id
306
- JOIN role_permissions rp ON ur.role_id = rp.role_id
307
- JOIN permissions p ON rp.permission_id = p.id
308
- WHERE u.id = ?
309
- `, [userId]);
310
-
311
- // Cache for 5 minutes
312
- await cache.set(`permissions:${userId}`, permissions, 300);
313
-
314
- return permissions;
315
- }
316
- ```
317
-
318
- ## Error Handling Refinement
319
-
320
- ### 1. Comprehensive Error Handling
321
-
322
- ```typescript
323
- // Define custom error hierarchy
324
- export class AppError extends Error {
325
- constructor(
326
- message: string,
327
- public code: string,
328
- public statusCode: number,
329
- public isOperational = true
330
- ) {
331
- super(message);
332
- Object.setPrototypeOf(this, new.target.prototype);
333
- Error.captureStackTrace(this);
334
- }
335
- }
336
-
337
- export class ValidationError extends AppError {
338
- constructor(message: string, public fields?: Record<string, string>) {
339
- super(message, 'VALIDATION_ERROR', 400);
340
- }
341
- }
342
-
343
- export class AuthenticationError extends AppError {
344
- constructor(message: string = 'Authentication required') {
345
- super(message, 'AUTHENTICATION_ERROR', 401);
346
- }
347
- }
348
-
349
- // Global error handler
350
- export function errorHandler(
351
- error: Error,
352
- req: Request,
353
- res: Response,
354
- next: NextFunction
355
- ): void {
356
- if (error instanceof AppError && error.isOperational) {
357
- res.status(error.statusCode).json({
358
- error: {
359
- code: error.code,
360
- message: error.message,
361
- ...(error instanceof ValidationError && { fields: error.fields })
362
- }
363
- });
364
- } else {
365
- // Unexpected errors
366
- logger.error('Unhandled error', { error, request: req });
367
- res.status(500).json({
368
- error: {
369
- code: 'INTERNAL_ERROR',
370
- message: 'An unexpected error occurred'
371
- }
372
- });
373
- }
374
- }
375
- ```
376
-
377
- ### 2. Retry Logic and Circuit Breakers
378
-
379
- ```typescript
380
- // Retry decorator for transient failures
381
- function retry(attempts = 3, delay = 1000) {
382
- return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
383
- const originalMethod = descriptor.value;
384
-
385
- descriptor.value = async function(...args: any[]) {
386
- let lastError: Error;
387
-
388
- for (let i = 0; i < attempts; i++) {
389
- try {
390
- return await originalMethod.apply(this, args);
391
- } catch (error) {
392
- lastError = error;
393
-
394
- if (i < attempts - 1 && isRetryable(error)) {
395
- await sleep(delay * Math.pow(2, i)); // Exponential backoff
396
- } else {
397
- throw error;
398
- }
399
- }
400
- }
401
-
402
- throw lastError;
403
- };
404
- };
405
- }
406
-
407
- // Circuit breaker for external services
408
- export class CircuitBreaker {
409
- private failures = 0;
410
- private lastFailureTime?: Date;
411
- private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';
412
-
413
- constructor(
414
- private threshold = 5,
415
- private timeout = 60000 // 1 minute
416
- ) {}
417
-
418
- async execute<T>(operation: () => Promise<T>): Promise<T> {
419
- if (this.state === 'OPEN') {
420
- if (this.shouldAttemptReset()) {
421
- this.state = 'HALF_OPEN';
422
- } else {
423
- throw new Error('Circuit breaker is OPEN');
424
- }
425
- }
426
-
427
- try {
428
- const result = await operation();
429
- this.onSuccess();
430
- return result;
431
- } catch (error) {
432
- this.onFailure();
433
- throw error;
434
- }
435
- }
436
-
437
- private onSuccess(): void {
438
- this.failures = 0;
439
- this.state = 'CLOSED';
440
- }
441
-
442
- private onFailure(): void {
443
- this.failures++;
444
- this.lastFailureTime = new Date();
445
-
446
- if (this.failures >= this.threshold) {
447
- this.state = 'OPEN';
448
- }
449
- }
450
-
451
- private shouldAttemptReset(): boolean {
452
- return this.lastFailureTime
453
- && (Date.now() - this.lastFailureTime.getTime()) > this.timeout;
454
- }
455
- }
456
- ```
457
-
458
- ## Quality Metrics
459
-
460
- ### 1. Code Coverage
461
- ```bash
462
- # Jest configuration for coverage
463
- module.exports = {
464
- coverageThreshold: {
465
- global: {
466
- branches: 80,
467
- functions: 80,
468
- lines: 80,
469
- statements: 80
470
- }
471
- },
472
- coveragePathIgnorePatterns: [
473
- '/node_modules/',
474
- '/test/',
475
- '/dist/'
476
- ]
477
- };
478
- ```
479
-
480
- ### 2. Complexity Analysis
481
- ```typescript
482
- // Keep cyclomatic complexity low
483
- // Bad: Complexity = 7
484
- function processUser(user: User): void {
485
- if (user.age > 18) {
486
- if (user.country === 'US') {
487
- if (user.hasSubscription) {
488
- // Process premium US adult
489
- } else {
490
- // Process free US adult
491
- }
492
- } else {
493
- if (user.hasSubscription) {
494
- // Process premium international adult
495
- } else {
496
- // Process free international adult
497
- }
498
- }
499
- } else {
500
- // Process minor
501
- }
502
- }
503
-
504
- // Good: Complexity = 2
505
- function processUser(user: User): void {
506
- const processor = getUserProcessor(user);
507
- processor.process(user);
508
- }
509
-
510
- function getUserProcessor(user: User): UserProcessor {
511
- const type = getUserType(user);
512
- return ProcessorFactory.create(type);
513
- }
514
- ```
515
-
516
- ## Best Practices
517
-
518
- 1. **Test First**: Always write tests before implementation
519
- 2. **Small Steps**: Make incremental improvements
520
- 3. **Continuous Refactoring**: Improve code structure continuously
521
- 4. **Performance Budgets**: Set and monitor performance targets
522
- 5. **Error Recovery**: Plan for failure scenarios
523
- 6. **Documentation**: Keep docs in sync with code
524
-
525
- Remember: Refinement is an iterative process. Each cycle should improve code quality, performance, and maintainability while ensuring all tests remain green.