moflo 4.9.20 → 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 (240) 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-agent-rules.md +172 -0
  18. package/.claude/guidance/shipped/moflo-claude-swarm-cohesion.md +73 -265
  19. package/.claude/guidance/shipped/moflo-cli-reference.md +6 -6
  20. package/.claude/guidance/shipped/moflo-core-guidance.md +66 -184
  21. package/.claude/guidance/shipped/moflo-cross-platform.md +1 -1
  22. package/.claude/guidance/shipped/moflo-error-handling.md +3 -3
  23. package/.claude/guidance/shipped/moflo-guidance-rules.md +17 -7
  24. package/.claude/guidance/shipped/moflo-memory-strategy.md +76 -182
  25. package/.claude/guidance/shipped/moflo-memorydb-maintenance.md +6 -8
  26. package/.claude/guidance/shipped/moflo-settings-injection.md +7 -9
  27. package/.claude/guidance/shipped/moflo-source-hygiene.md +5 -5
  28. package/.claude/guidance/shipped/moflo-spell-connectors.md +3 -4
  29. package/.claude/guidance/shipped/moflo-spell-custom-steps.md +3 -4
  30. package/.claude/guidance/shipped/moflo-spell-engine.md +40 -162
  31. package/.claude/guidance/shipped/moflo-spell-runner.md +134 -0
  32. package/.claude/guidance/shipped/moflo-spell-sandboxing.md +10 -57
  33. package/.claude/guidance/shipped/moflo-spell-troubleshooting.md +149 -0
  34. package/.claude/guidance/shipped/moflo-subagents.md +43 -114
  35. package/.claude/guidance/shipped/moflo-task-icons.md +4 -4
  36. package/.claude/guidance/shipped/moflo-user-facing-language.md +3 -3
  37. package/.claude/guidance/shipped/moflo-verbose-command-filtering.md +3 -3
  38. package/.claude/guidance/shipped/moflo-yaml-reference.md +4 -5
  39. package/.claude/helpers/gate.cjs +192 -15
  40. package/.claude/helpers/prompt-hook.mjs +4 -38
  41. package/.claude/helpers/simplify-classify.cjs +32 -11
  42. package/.claude/helpers/subagent-bootstrap.json +1 -1
  43. package/.claude/helpers/subagent-start.cjs +1 -1
  44. package/.claude/skills/connector-builder/SKILL.md +42 -429
  45. package/.claude/skills/connector-builder/templates/connector.md +189 -0
  46. package/.claude/skills/connector-builder/templates/step-command.md +176 -0
  47. package/.claude/skills/eldar/SKILL.md +7 -7
  48. package/.claude/skills/fl/SKILL.md +3 -3
  49. package/.claude/skills/fl/execution-modes.md +39 -16
  50. package/.claude/skills/fl/phases.md +3 -3
  51. package/.claude/skills/{simplify → flo-simplify}/SKILL.md +11 -11
  52. package/.claude/skills/guidance/SKILL.md +17 -9
  53. package/.claude/skills/memory-patterns/SKILL.md +1 -1
  54. package/.claude/skills/publish/SKILL.md +121 -36
  55. package/.claude/skills/reset-epic/SKILL.md +2 -2
  56. package/.claude/skills/spell-builder/SKILL.md +39 -226
  57. package/.claude/skills/spell-builder/architecture.md +1 -1
  58. package/.claude/skills/spell-builder/permissions.md +107 -0
  59. package/.claude/skills/spell-builder/preflight.md +101 -0
  60. package/.claude/skills/spell-schedule/SKILL.md +2 -3
  61. package/bin/gate.cjs +192 -15
  62. package/bin/lib/retired-files.mjs +146 -0
  63. package/bin/prompt-hook.mjs +4 -38
  64. package/bin/session-start-launcher.mjs +120 -1
  65. package/bin/setup-project.mjs +63 -69
  66. package/bin/simplify-classify.cjs +32 -11
  67. package/dist/src/cli/appliance/rvfa-builder.js +1 -1
  68. package/dist/src/cli/commands/agent.js +3 -9
  69. package/dist/src/cli/commands/doctor-checks-deep.js +4 -0
  70. package/dist/src/cli/commands/hooks.js +1 -3
  71. package/dist/src/cli/commands/index.js +2 -0
  72. package/dist/src/cli/commands/retire.js +111 -0
  73. package/dist/src/cli/hooks/reasoningbank/index.js +7 -7
  74. package/dist/src/cli/init/claudemd-generator.js +30 -33
  75. package/dist/src/cli/init/executor.js +53 -69
  76. package/dist/src/cli/init/helpers-generator.js +165 -52
  77. package/dist/src/cli/init/moflo-init.js +41 -114
  78. package/dist/src/cli/init/settings-generator.js +44 -14
  79. package/dist/src/cli/mcp-tools/agent-tools.js +9 -27
  80. package/dist/src/cli/mcp-tools/hooks-tools.js +23 -21
  81. package/dist/src/cli/memory/controllers/semantic-router.js +18 -12
  82. package/dist/src/cli/memory/sona-optimizer.js +6 -6
  83. package/dist/src/cli/neural/domain/services/learning-service.js +3 -3
  84. package/dist/src/cli/services/agent-router.js +2 -5
  85. package/dist/src/cli/services/hook-block-hash.js +11 -2
  86. package/dist/src/cli/services/hook-wiring.js +86 -3
  87. package/dist/src/cli/services/subagent-bootstrap.js +1 -1
  88. package/dist/src/cli/shared/events/example-usage.js +6 -6
  89. package/dist/src/cli/shared/hooks/task-hooks.js +8 -8
  90. package/dist/src/cli/version.js +1 -1
  91. package/package.json +3 -2
  92. package/retired-files.json +1989 -0
  93. package/scripts/post-install-bootstrap.mjs +19 -0
  94. package/src/cli/data/model-registry.json +2 -2
  95. package/.claude/agents/consensus/byzantine-coordinator.md +0 -63
  96. package/.claude/agents/consensus/crdt-synchronizer.md +0 -997
  97. package/.claude/agents/consensus/gossip-coordinator.md +0 -63
  98. package/.claude/agents/consensus/performance-benchmarker.md +0 -851
  99. package/.claude/agents/consensus/quorum-manager.md +0 -823
  100. package/.claude/agents/consensus/raft-manager.md +0 -63
  101. package/.claude/agents/consensus/security-manager.md +0 -622
  102. package/.claude/agents/data/ml/data-ml-model.md +0 -193
  103. package/.claude/agents/github/code-review-swarm.md +0 -538
  104. package/.claude/agents/github/github-modes.md +0 -172
  105. package/.claude/agents/github/issue-tracker.md +0 -311
  106. package/.claude/agents/github/multi-repo-swarm.md +0 -551
  107. package/.claude/agents/github/pr-manager.md +0 -183
  108. package/.claude/agents/github/project-board-sync.md +0 -508
  109. package/.claude/agents/github/release-manager.md +0 -360
  110. package/.claude/agents/github/release-swarm.md +0 -580
  111. package/.claude/agents/github/repo-architect.md +0 -391
  112. package/.claude/agents/github/swarm-issue.md +0 -566
  113. package/.claude/agents/github/swarm-pr.md +0 -414
  114. package/.claude/agents/github/sync-coordinator.md +0 -426
  115. package/.claude/agents/github/workflow-automation.md +0 -606
  116. package/.claude/agents/goal/code-goal-planner.md +0 -440
  117. package/.claude/agents/goal/goal-planner.md +0 -168
  118. package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +0 -127
  119. package/.claude/agents/hive-mind/queen-coordinator.md +0 -198
  120. package/.claude/agents/hive-mind/scout-explorer.md +0 -233
  121. package/.claude/agents/hive-mind/swarm-memory-manager.md +0 -184
  122. package/.claude/agents/hive-mind/worker-specialist.md +0 -208
  123. package/.claude/agents/neural/safla-neural.md +0 -73
  124. package/.claude/agents/optimization/benchmark-suite.md +0 -665
  125. package/.claude/agents/optimization/load-balancer.md +0 -431
  126. package/.claude/agents/optimization/performance-monitor.md +0 -672
  127. package/.claude/agents/optimization/resource-allocator.md +0 -674
  128. package/.claude/agents/optimization/topology-optimizer.md +0 -808
  129. package/.claude/agents/reasoning/goal-planner.md +0 -67
  130. package/.claude/agents/sona/sona-learning-optimizer.md +0 -74
  131. package/.claude/agents/sparc/architecture.md +0 -472
  132. package/.claude/agents/sparc/pseudocode.md +0 -318
  133. package/.claude/agents/sparc/refinement.md +0 -525
  134. package/.claude/agents/sparc/specification.md +0 -276
  135. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +0 -225
  136. package/.claude/agents/swarm/adaptive-coordinator.md +0 -391
  137. package/.claude/agents/swarm/hierarchical-coordinator.md +0 -321
  138. package/.claude/agents/swarm/mesh-coordinator.md +0 -383
  139. package/.claude/agents/testing/production-validator.md +0 -395
  140. package/.claude/agents/testing/tdd-london-swarm.md +0 -244
  141. package/.claude/agents/v3/adr-architect.md +0 -184
  142. package/.claude/agents/v3/aidefence-guardian.md +0 -277
  143. package/.claude/agents/v3/claims-authorizer.md +0 -208
  144. package/.claude/agents/v3/collective-intelligence-coordinator.md +0 -988
  145. package/.claude/agents/v3/ddd-domain-expert.md +0 -220
  146. package/.claude/agents/v3/injection-analyst.md +0 -232
  147. package/.claude/agents/v3/memory-specialist.md +0 -987
  148. package/.claude/agents/v3/performance-engineer.md +0 -1225
  149. package/.claude/agents/v3/pii-detector.md +0 -146
  150. package/.claude/agents/v3/reasoningbank-learner.md +0 -213
  151. package/.claude/agents/v3/security-architect-aidefence.md +0 -405
  152. package/.claude/agents/v3/security-architect.md +0 -865
  153. package/.claude/agents/v3/security-auditor.md +0 -771
  154. package/.claude/agents/v3/sparc-orchestrator.md +0 -182
  155. package/.claude/agents/v3/swarm-memory-manager.md +0 -142
  156. package/.claude/agents/v3/v3-integration-architect.md +0 -205
  157. package/.claude/commands/claude-flow-help.md +0 -103
  158. package/.claude/commands/claude-flow-memory.md +0 -107
  159. package/.claude/commands/claude-flow-swarm.md +0 -205
  160. package/.claude/commands/github/README.md +0 -11
  161. package/.claude/commands/github/code-review-swarm.md +0 -514
  162. package/.claude/commands/github/code-review.md +0 -25
  163. package/.claude/commands/github/github-modes.md +0 -146
  164. package/.claude/commands/github/github-swarm.md +0 -113
  165. package/.claude/commands/github/issue-tracker.md +0 -284
  166. package/.claude/commands/github/issue-triage.md +0 -25
  167. package/.claude/commands/github/multi-repo-swarm.md +0 -519
  168. package/.claude/commands/github/pr-enhance.md +0 -26
  169. package/.claude/commands/github/pr-manager.md +0 -164
  170. package/.claude/commands/github/project-board-sync.md +0 -471
  171. package/.claude/commands/github/release-manager.md +0 -332
  172. package/.claude/commands/github/release-swarm.md +0 -544
  173. package/.claude/commands/github/repo-analyze.md +0 -25
  174. package/.claude/commands/github/repo-architect.md +0 -361
  175. package/.claude/commands/github/swarm-issue.md +0 -482
  176. package/.claude/commands/github/swarm-pr.md +0 -285
  177. package/.claude/commands/github/sync-coordinator.md +0 -294
  178. package/.claude/commands/github/workflow-automation.md +0 -442
  179. package/.claude/commands/hooks/README.md +0 -11
  180. package/.claude/commands/hooks/overview.md +0 -58
  181. package/.claude/commands/hooks/post-edit.md +0 -117
  182. package/.claude/commands/hooks/post-task.md +0 -112
  183. package/.claude/commands/hooks/pre-edit.md +0 -113
  184. package/.claude/commands/hooks/pre-task.md +0 -111
  185. package/.claude/commands/hooks/session-end.md +0 -118
  186. package/.claude/commands/hooks/setup.md +0 -103
  187. package/.claude/commands/simplify.md +0 -101
  188. package/.claude/commands/sparc/analyzer.md +0 -42
  189. package/.claude/commands/sparc/architect.md +0 -43
  190. package/.claude/commands/sparc/ask.md +0 -86
  191. package/.claude/commands/sparc/batch-executor.md +0 -44
  192. package/.claude/commands/sparc/code.md +0 -78
  193. package/.claude/commands/sparc/coder.md +0 -44
  194. package/.claude/commands/sparc/debug.md +0 -72
  195. package/.claude/commands/sparc/debugger.md +0 -44
  196. package/.claude/commands/sparc/designer.md +0 -43
  197. package/.claude/commands/sparc/devops.md +0 -98
  198. package/.claude/commands/sparc/docs-writer.md +0 -69
  199. package/.claude/commands/sparc/documenter.md +0 -44
  200. package/.claude/commands/sparc/innovator.md +0 -44
  201. package/.claude/commands/sparc/integration.md +0 -72
  202. package/.claude/commands/sparc/mcp.md +0 -106
  203. package/.claude/commands/sparc/memory-manager.md +0 -44
  204. package/.claude/commands/sparc/optimizer.md +0 -44
  205. package/.claude/commands/sparc/orchestrator.md +0 -116
  206. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -72
  207. package/.claude/commands/sparc/refinement-optimization-mode.md +0 -72
  208. package/.claude/commands/sparc/researcher.md +0 -44
  209. package/.claude/commands/sparc/reviewer.md +0 -44
  210. package/.claude/commands/sparc/security-review.md +0 -69
  211. package/.claude/commands/sparc/sparc-modes.md +0 -139
  212. package/.claude/commands/sparc/sparc.md +0 -99
  213. package/.claude/commands/sparc/spec-pseudocode.md +0 -69
  214. package/.claude/commands/sparc/spell-manager.md +0 -44
  215. package/.claude/commands/sparc/supabase-admin.md +0 -337
  216. package/.claude/commands/sparc/swarm-coordinator.md +0 -44
  217. package/.claude/commands/sparc/tdd.md +0 -44
  218. package/.claude/commands/sparc/tester.md +0 -44
  219. package/.claude/commands/sparc/tutorial.md +0 -68
  220. package/.claude/commands/sparc.md +0 -151
  221. package/.claude/guidance/shipped/moflo-session-start.md +0 -154
  222. package/.claude/guidance/shipped/moflo-spell-engine-architecture.md +0 -145
  223. package/.claude/skills/browser/SKILL.md +0 -204
  224. package/.claude/skills/github-code-review/SKILL.md +0 -1140
  225. package/.claude/skills/github-multi-repo/SKILL.md +0 -866
  226. package/.claude/skills/github-project-management/SKILL.md +0 -1272
  227. package/.claude/skills/github-release-management/SKILL.md +0 -1074
  228. package/.claude/skills/github-workflow-automation/SKILL.md +0 -1060
  229. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -712
  230. package/.claude/skills/hooks-automation/SKILL.md +0 -1193
  231. package/.claude/skills/pair-programming/SKILL.md +0 -1202
  232. package/.claude/skills/performance-analysis/SKILL.md +0 -563
  233. package/.claude/skills/skill-builder/SKILL.md +0 -910
  234. package/.claude/skills/sparc-methodology/SKILL.md +0 -904
  235. package/.claude/skills/stream-chain/SKILL.md +0 -563
  236. package/.claude/skills/swarm-advanced/SKILL.md +0 -811
  237. package/.claude/skills/swarm-orchestration/SKILL.md +0 -179
  238. package/.claude/skills/verification-quality/SKILL.md +0 -649
  239. package/.claude/skills/worker-benchmarks/skill.md +0 -135
  240. package/.claude/skills/worker-integration/skill.md +0 -154
@@ -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.