mcp-quickbase 2.0.1

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 (135) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/LICENSE +21 -0
  3. package/README.md +301 -0
  4. package/dist/client/quickbase.d.ts +28 -0
  5. package/dist/client/quickbase.js +235 -0
  6. package/dist/client/quickbase.js.map +1 -0
  7. package/dist/mcp/index.d.ts +4 -0
  8. package/dist/mcp/index.js +21 -0
  9. package/dist/mcp/index.js.map +1 -0
  10. package/dist/mcp/server.d.ts +19 -0
  11. package/dist/mcp/server.js +102 -0
  12. package/dist/mcp/server.js.map +1 -0
  13. package/dist/mcp-stdio-server.d.ts +2 -0
  14. package/dist/mcp-stdio-server.js +168 -0
  15. package/dist/mcp-stdio-server.js.map +1 -0
  16. package/dist/server.d.ts +2 -0
  17. package/dist/server.js +318 -0
  18. package/dist/server.js.map +1 -0
  19. package/dist/tools/apps/create_app.d.ts +87 -0
  20. package/dist/tools/apps/create_app.js +87 -0
  21. package/dist/tools/apps/create_app.js.map +1 -0
  22. package/dist/tools/apps/index.d.ts +9 -0
  23. package/dist/tools/apps/index.js +40 -0
  24. package/dist/tools/apps/index.js.map +1 -0
  25. package/dist/tools/apps/list_tables.d.ts +108 -0
  26. package/dist/tools/apps/list_tables.js +100 -0
  27. package/dist/tools/apps/list_tables.js.map +1 -0
  28. package/dist/tools/apps/update_app.d.ts +91 -0
  29. package/dist/tools/apps/update_app.js +99 -0
  30. package/dist/tools/apps/update_app.js.map +1 -0
  31. package/dist/tools/base.d.ts +47 -0
  32. package/dist/tools/base.js +63 -0
  33. package/dist/tools/base.js.map +1 -0
  34. package/dist/tools/configure_cache.d.ts +81 -0
  35. package/dist/tools/configure_cache.js +77 -0
  36. package/dist/tools/configure_cache.js.map +1 -0
  37. package/dist/tools/fields/create_field.d.ts +121 -0
  38. package/dist/tools/fields/create_field.js +102 -0
  39. package/dist/tools/fields/create_field.js.map +1 -0
  40. package/dist/tools/fields/index.d.ts +8 -0
  41. package/dist/tools/fields/index.js +37 -0
  42. package/dist/tools/fields/index.js.map +1 -0
  43. package/dist/tools/fields/update_field.d.ts +112 -0
  44. package/dist/tools/fields/update_field.js +114 -0
  45. package/dist/tools/fields/update_field.js.map +1 -0
  46. package/dist/tools/files/download_file.d.ts +111 -0
  47. package/dist/tools/files/download_file.js +173 -0
  48. package/dist/tools/files/download_file.js.map +1 -0
  49. package/dist/tools/files/index.d.ts +8 -0
  50. package/dist/tools/files/index.js +37 -0
  51. package/dist/tools/files/index.js.map +1 -0
  52. package/dist/tools/files/upload_file.d.ts +107 -0
  53. package/dist/tools/files/upload_file.js +211 -0
  54. package/dist/tools/files/upload_file.js.map +1 -0
  55. package/dist/tools/index.d.ts +18 -0
  56. package/dist/tools/index.js +65 -0
  57. package/dist/tools/index.js.map +1 -0
  58. package/dist/tools/records/bulk_create_records.d.ts +75 -0
  59. package/dist/tools/records/bulk_create_records.js +104 -0
  60. package/dist/tools/records/bulk_create_records.js.map +1 -0
  61. package/dist/tools/records/bulk_update_records.d.ts +77 -0
  62. package/dist/tools/records/bulk_update_records.js +102 -0
  63. package/dist/tools/records/bulk_update_records.js.map +1 -0
  64. package/dist/tools/records/create_record.d.ts +68 -0
  65. package/dist/tools/records/create_record.js +123 -0
  66. package/dist/tools/records/create_record.js.map +1 -0
  67. package/dist/tools/records/index.d.ts +11 -0
  68. package/dist/tools/records/index.js +46 -0
  69. package/dist/tools/records/index.js.map +1 -0
  70. package/dist/tools/records/query_records.d.ts +164 -0
  71. package/dist/tools/records/query_records.js +261 -0
  72. package/dist/tools/records/query_records.js.map +1 -0
  73. package/dist/tools/records/update_record.d.ts +81 -0
  74. package/dist/tools/records/update_record.js +99 -0
  75. package/dist/tools/records/update_record.js.map +1 -0
  76. package/dist/tools/registry.d.ts +41 -0
  77. package/dist/tools/registry.js +66 -0
  78. package/dist/tools/registry.js.map +1 -0
  79. package/dist/tools/reports/index.d.ts +6 -0
  80. package/dist/tools/reports/index.js +31 -0
  81. package/dist/tools/reports/index.js.map +1 -0
  82. package/dist/tools/reports/run_report.d.ts +70 -0
  83. package/dist/tools/reports/run_report.js +72 -0
  84. package/dist/tools/reports/run_report.js.map +1 -0
  85. package/dist/tools/tables/create_table.d.ts +142 -0
  86. package/dist/tools/tables/create_table.js +119 -0
  87. package/dist/tools/tables/create_table.js.map +1 -0
  88. package/dist/tools/tables/get_table_fields.d.ts +108 -0
  89. package/dist/tools/tables/get_table_fields.js +96 -0
  90. package/dist/tools/tables/get_table_fields.js.map +1 -0
  91. package/dist/tools/tables/index.d.ts +9 -0
  92. package/dist/tools/tables/index.js +40 -0
  93. package/dist/tools/tables/index.js.map +1 -0
  94. package/dist/tools/tables/update_table.d.ts +91 -0
  95. package/dist/tools/tables/update_table.js +99 -0
  96. package/dist/tools/tables/update_table.js.map +1 -0
  97. package/dist/tools/test_connection.d.ts +51 -0
  98. package/dist/tools/test_connection.js +101 -0
  99. package/dist/tools/test_connection.js.map +1 -0
  100. package/dist/types/api.d.ts +70 -0
  101. package/dist/types/api.js +6 -0
  102. package/dist/types/api.js.map +1 -0
  103. package/dist/types/config.d.ts +49 -0
  104. package/dist/types/config.js +3 -0
  105. package/dist/types/config.js.map +1 -0
  106. package/dist/types/mcp.d.ts +55 -0
  107. package/dist/types/mcp.js +3 -0
  108. package/dist/types/mcp.js.map +1 -0
  109. package/dist/utils/cache.d.ts +87 -0
  110. package/dist/utils/cache.js +211 -0
  111. package/dist/utils/cache.js.map +1 -0
  112. package/dist/utils/file.d.ts +40 -0
  113. package/dist/utils/file.js +167 -0
  114. package/dist/utils/file.js.map +1 -0
  115. package/dist/utils/logger.d.ts +37 -0
  116. package/dist/utils/logger.js +144 -0
  117. package/dist/utils/logger.js.map +1 -0
  118. package/dist/utils/retry.d.ts +39 -0
  119. package/dist/utils/retry.js +88 -0
  120. package/dist/utils/retry.js.map +1 -0
  121. package/dist/utils/validation.d.ts +32 -0
  122. package/dist/utils/validation.js +227 -0
  123. package/dist/utils/validation.js.map +1 -0
  124. package/docs/README.md +41 -0
  125. package/docs/architecture.md +94 -0
  126. package/docs/claude-prompts.md +218 -0
  127. package/docs/deployment.md +244 -0
  128. package/docs/developer-guide.md +537 -0
  129. package/docs/final-qa-report.md +243 -0
  130. package/docs/performance-benchmarks.md +306 -0
  131. package/docs/quick-reference.md +109 -0
  132. package/docs/quickstart.md +183 -0
  133. package/docs/security-review.md +263 -0
  134. package/docs/tools.md +269 -0
  135. package/package.json +68 -0
@@ -0,0 +1,537 @@
1
+ # Developer Guide - Quickbase MCP Server v2
2
+
3
+ This guide provides detailed information for developers working on or extending Quickbase MCP Server v2.
4
+
5
+ ## 📋 Table of Contents
6
+
7
+ - [Architecture Overview](#architecture-overview)
8
+ - [Development Setup](#development-setup)
9
+ - [Code Organization](#code-organization)
10
+ - [Adding New Tools](#adding-new-tools)
11
+ - [Testing Strategy](#testing-strategy)
12
+ - [TypeScript Patterns](#typescript-patterns)
13
+ - [Error Handling](#error-handling)
14
+ - [Performance Considerations](#performance-considerations)
15
+ - [Debugging](#debugging)
16
+ - [Contributing](#contributing)
17
+
18
+ ## 🏗️ Architecture Overview
19
+
20
+ ### Core Components
21
+
22
+ The connector is built using a modular architecture with the following key components:
23
+
24
+ ```
25
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
26
+ │ MCP Server │ │ Tool Registry │ │ Quickbase API │
27
+ │ │ │ │ │ Client │
28
+ │ - Stdio Mode │◄──►│ - Tool Manager │◄──►│ │
29
+ │ - HTTP Mode │ │ - Schema Validation│ │ - HTTP Client │
30
+ │ │ │ │ │ - Auth Handler │
31
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
32
+ │ │ │
33
+ │ │ │
34
+ ▼ ▼ ▼
35
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
36
+ │ Tool Layer │ │ Utility Layer │ │ Type Layer │
37
+ │ │ │ │ │ │
38
+ │ - Apps Tools │ │ - Cache Service │ │ - API Types │
39
+ │ - Table Tools │ │ - Retry Logic │ │ - Config Types │
40
+ │ - Record Tools │ │ - File Utils │ │ - MCP Types │
41
+ │ - Field Tools │ │ - Logger │ │ - Tool Types │
42
+ │ - File Tools │ │ │ │ │
43
+ │ - Report Tools │ │ │ │ │
44
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
45
+ ```
46
+
47
+ ### Design Principles
48
+
49
+ 1. **TypeScript-First**: All code is written in TypeScript with strict type checking
50
+ 2. **Modular Design**: Tools are organized by functionality and can be extended independently
51
+ 3. **Error Resilience**: Comprehensive error handling with graceful degradation
52
+ 4. **Performance**: Intelligent caching and retry mechanisms
53
+ 5. **Developer Experience**: Clear interfaces, comprehensive logging, and detailed error messages
54
+
55
+ ## 🚀 Development Setup
56
+
57
+ ### Prerequisites
58
+
59
+ ```bash
60
+ # Required tools
61
+ node --version # v18+
62
+ npm --version # v6+
63
+ ```
64
+
65
+ ### Initial Setup
66
+
67
+ ```bash
68
+ # Clone and setup
69
+ git clone <repository-url>
70
+ cd mcp-quickbase
71
+
72
+ # Install dependencies
73
+ npm install
74
+
75
+ # Setup environment
76
+ cp .env.example .env
77
+ # Edit .env with your Quickbase credentials
78
+
79
+ # Build and test
80
+ npm run build
81
+ npm test
82
+ ```
83
+
84
+ ### Development Workflow
85
+
86
+ ```bash
87
+ # Development mode with auto-reload
88
+ npm run dev
89
+
90
+ # Watch mode for tests
91
+ npm test -- --watch
92
+
93
+ # Lint and format
94
+ npm run lint
95
+ npm run format
96
+
97
+ # Build for production
98
+ npm run build
99
+ ```
100
+
101
+ ## 📁 Code Organization
102
+
103
+ ### Directory Structure
104
+
105
+ ```
106
+ src/
107
+ ├── client/ # Quickbase API client
108
+ │ └── quickbase.ts # Main API client implementation
109
+ ├── mcp/ # MCP server implementations
110
+ │ ├── index.ts # Exports
111
+ │ └── server.ts # MCP server setup and tool registration
112
+ ├── tools/ # MCP tool implementations
113
+ │ ├── base.ts # Base tool class
114
+ │ ├── registry.ts # Tool registry and management
115
+ │ ├── apps/ # Application management tools
116
+ │ ├── fields/ # Field management tools
117
+ │ ├── files/ # File operation tools
118
+ │ ├── records/ # Record operation tools
119
+ │ ├── reports/ # Report execution tools
120
+ │ └── tables/ # Table operation tools
121
+ ├── types/ # TypeScript type definitions
122
+ │ ├── api.ts # Quickbase API types
123
+ │ ├── config.ts # Configuration types
124
+ │ └── mcp.ts # MCP-specific types
125
+ ├── utils/ # Utility functions
126
+ │ ├── cache.ts # Caching service
127
+ │ ├── file.ts # File handling utilities
128
+ │ ├── logger.ts # Logging service
129
+ │ └── retry.ts # Retry logic implementation
130
+ ├── mcp-stdio-server.ts # Stdio MCP server entry point
131
+ └── server.ts # HTTP server entry point
132
+ ```
133
+
134
+ ### Naming Conventions
135
+
136
+ - **Files**: kebab-case (`create-record.ts`)
137
+ - **Classes**: PascalCase (`CreateRecordTool`)
138
+ - **Variables/Functions**: camelCase (`executeQuery`)
139
+ - **Constants**: UPPER_SNAKE_CASE (`MAX_RETRY_ATTEMPTS`)
140
+ - **Types/Interfaces**: PascalCase (`QuickbaseConfig`)
141
+
142
+ ## 🔧 Adding New Tools
143
+
144
+ ### 1. Create Tool Class
145
+
146
+ ```typescript
147
+ // src/tools/my-category/my-new-tool.ts
148
+ import { BaseTool } from '../base';
149
+ import { QuickbaseClient } from '../../client/quickbase';
150
+
151
+ interface MyNewToolParams {
152
+ required_param: string;
153
+ optional_param?: number;
154
+ }
155
+
156
+ interface MyNewToolResult {
157
+ success: boolean;
158
+ data: any;
159
+ }
160
+
161
+ export class MyNewTool extends BaseTool<MyNewToolParams, MyNewToolResult> {
162
+ public readonly name = 'my_new_tool';
163
+ public readonly description = 'Description of what this tool does';
164
+ public readonly paramSchema = {
165
+ type: 'object',
166
+ properties: {
167
+ required_param: {
168
+ type: 'string',
169
+ description: 'Description of required parameter'
170
+ },
171
+ optional_param: {
172
+ type: 'number',
173
+ description: 'Description of optional parameter'
174
+ }
175
+ },
176
+ required: ['required_param']
177
+ };
178
+
179
+ constructor(client: QuickbaseClient) {
180
+ super(client);
181
+ }
182
+
183
+ protected async run(params: MyNewToolParams): Promise<MyNewToolResult> {
184
+ // Implement tool logic here
185
+ const response = await this.client.request({
186
+ method: 'POST',
187
+ path: '/some/endpoint',
188
+ body: params
189
+ });
190
+
191
+ return {
192
+ success: true,
193
+ data: response.data
194
+ };
195
+ }
196
+ }
197
+ ```
198
+
199
+ ### 2. Register Tool
200
+
201
+ ```typescript
202
+ // src/tools/my-category/index.ts
203
+ import { QuickbaseClient } from '../../client/quickbase';
204
+ import { toolRegistry } from '../registry';
205
+ import { MyNewTool } from './my-new-tool';
206
+ import { createLogger } from '../../utils/logger';
207
+
208
+ const logger = createLogger('MyCategoryTools');
209
+
210
+ export function registerMyCategoryTools(client: QuickbaseClient): void {
211
+ logger.info('Registering my category tools');
212
+
213
+ toolRegistry.registerTool(new MyNewTool(client));
214
+
215
+ logger.info('My category tools registered');
216
+ }
217
+
218
+ export * from './my-new-tool';
219
+ ```
220
+
221
+ ### 3. Add to Main Tool Registration
222
+
223
+ ```typescript
224
+ // src/tools/index.ts
225
+ import { registerMyCategoryTools } from './my-category';
226
+
227
+ export function initializeTools(client: QuickbaseClient, cache: CacheService): void {
228
+ // ... existing registrations
229
+
230
+ // Register my category tools
231
+ registerMyCategoryTools(client);
232
+
233
+ // ... rest of function
234
+ }
235
+ ```
236
+
237
+ ### 4. Add Tests
238
+
239
+ ```typescript
240
+ // src/__tests__/tools/my-new-tool.test.ts
241
+ import { MyNewTool } from '../../tools/my-category/my-new-tool';
242
+ import { QuickbaseClient } from '../../client/quickbase';
243
+
244
+ jest.mock('../../client/quickbase');
245
+
246
+ describe('MyNewTool', () => {
247
+ let tool: MyNewTool;
248
+ let mockClient: jest.Mocked<QuickbaseClient>;
249
+
250
+ beforeEach(() => {
251
+ mockClient = new QuickbaseClient({
252
+ realmHost: 'test.quickbase.com',
253
+ userToken: 'test-token'
254
+ }) as jest.Mocked<QuickbaseClient>;
255
+
256
+ tool = new MyNewTool(mockClient);
257
+ });
258
+
259
+ it('should have correct properties', () => {
260
+ expect(tool.name).toBe('my_new_tool');
261
+ expect(tool.description).toBeTruthy();
262
+ expect(tool.paramSchema).toBeDefined();
263
+ });
264
+
265
+ it('should execute successfully', async () => {
266
+ mockClient.request = jest.fn().mockResolvedValue({
267
+ success: true,
268
+ data: { result: 'success' }
269
+ });
270
+
271
+ const result = await tool.execute({
272
+ required_param: 'test'
273
+ });
274
+
275
+ expect(result.success).toBe(true);
276
+ expect(mockClient.request).toHaveBeenCalledWith({
277
+ method: 'POST',
278
+ path: '/some/endpoint',
279
+ body: { required_param: 'test' }
280
+ });
281
+ });
282
+ });
283
+ ```
284
+
285
+ ## 🧪 Testing Strategy
286
+
287
+ ### Test Organization
288
+
289
+ ```
290
+ src/__tests__/
291
+ ├── client.test.ts # API client tests
292
+ ├── cache.test.ts # Cache service tests
293
+ ├── integration.test.ts # Full system integration tests
294
+ ├── tools.test.ts # Tool registry tests
295
+ └── tools/ # Individual tool tests
296
+ ├── records.test.ts # Record operation tools
297
+ └── test_connection.test.ts
298
+ ```
299
+
300
+ ### Test Types
301
+
302
+ 1. **Unit Tests**: Test individual components in isolation
303
+ 2. **Integration Tests**: Test component interactions
304
+ 3. **Mocking**: Mock external dependencies (Quickbase API)
305
+ 4. **Coverage**: Maintain >35% coverage, aim for >80%
306
+
307
+ ### Running Tests
308
+
309
+ ```bash
310
+ # All tests
311
+ npm test
312
+
313
+ # With coverage
314
+ npm test -- --coverage
315
+
316
+ # Watch mode
317
+ npm test -- --watch
318
+
319
+ # Specific test file
320
+ npm test -- client.test.ts
321
+
322
+ # Verbose output
323
+ npm test -- --verbose
324
+ ```
325
+
326
+ ## 📝 TypeScript Patterns
327
+
328
+ ### Strict Type Safety
329
+
330
+ ```typescript
331
+ // Use strict types for all function parameters and returns
332
+ async function processRecord(
333
+ tableId: string,
334
+ recordData: Record<string, unknown>
335
+ ): Promise<ApiResponse<RecordResult>> {
336
+ // Implementation
337
+ }
338
+
339
+ // Use discriminated unions for different response types
340
+ type ToolResult =
341
+ | { success: true; data: any }
342
+ | { success: false; error: ApiError };
343
+ ```
344
+
345
+ ### Generic Tool Base Class
346
+
347
+ ```typescript
348
+ // The BaseTool class uses generics for type safety
349
+ export abstract class BaseTool<TParams, TResult> {
350
+ protected abstract run(params: TParams): Promise<TResult>;
351
+
352
+ public async execute(params: TParams): Promise<ApiResponse<TResult>> {
353
+ // Implementation with full type safety
354
+ }
355
+ }
356
+ ```
357
+
358
+ ### Interface Definitions
359
+
360
+ ```typescript
361
+ // Separate interfaces for different concerns
362
+ interface QuickbaseConfig {
363
+ realmHost: string;
364
+ userToken: string;
365
+ appId?: string;
366
+ cacheEnabled?: boolean;
367
+ }
368
+
369
+ interface RequestOptions {
370
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
371
+ path: string;
372
+ body?: unknown;
373
+ params?: Record<string, string>;
374
+ }
375
+ ```
376
+
377
+ ## ⚠️ Error Handling
378
+
379
+ ### Error Types
380
+
381
+ ```typescript
382
+ // Structured error hierarchy
383
+ export class QuickbaseError extends Error {
384
+ constructor(
385
+ message: string,
386
+ public statusCode?: number,
387
+ public response?: unknown
388
+ ) {
389
+ super(message);
390
+ this.name = 'QuickbaseError';
391
+ }
392
+ }
393
+
394
+ export class QuickbaseAuthError extends QuickbaseError {
395
+ constructor(message: string) {
396
+ super(message, 401);
397
+ this.name = 'QuickbaseAuthError';
398
+ }
399
+ }
400
+ ```
401
+
402
+ ### Error Handling Pattern
403
+
404
+ ```typescript
405
+ // Consistent error handling in tools
406
+ protected async run(params: MyParams): Promise<MyResult> {
407
+ try {
408
+ const response = await this.client.request(options);
409
+ return this.processResponse(response);
410
+ } catch (error) {
411
+ if (error instanceof QuickbaseAuthError) {
412
+ throw new Error('Authentication failed. Check your user token.');
413
+ }
414
+ if (error instanceof QuickbaseRateLimitError) {
415
+ throw new Error('Rate limit exceeded. Please try again later.');
416
+ }
417
+ throw error; // Re-throw unknown errors
418
+ }
419
+ }
420
+ ```
421
+
422
+ ## ⚡ Performance Considerations
423
+
424
+ ### Caching Strategy
425
+
426
+ ```typescript
427
+ // Cache frequently accessed data
428
+ const cacheKey = `table-fields-${tableId}`;
429
+ const cachedFields = cache.get(cacheKey);
430
+
431
+ if (cachedFields && !options.skipCache) {
432
+ return cachedFields;
433
+ }
434
+
435
+ const fields = await this.fetchTableFields(tableId);
436
+ cache.set(cacheKey, fields);
437
+ return fields;
438
+ ```
439
+
440
+ ### Bulk Operations
441
+
442
+ ```typescript
443
+ // Prefer bulk operations for multiple records
444
+ const bulkResult = await this.client.request({
445
+ method: 'POST',
446
+ path: '/records',
447
+ body: {
448
+ to: tableId,
449
+ data: records.map(record => this.formatRecord(record))
450
+ }
451
+ });
452
+ ```
453
+
454
+ ### Pagination
455
+
456
+ ```typescript
457
+ // Handle large datasets with pagination
458
+ async function queryAllRecords(params: QueryParams): Promise<Record[]> {
459
+ const allRecords: Record[] = [];
460
+ let skip = 0;
461
+ const top = 1000;
462
+
463
+ while (true) {
464
+ const batch = await this.queryRecords({
465
+ ...params,
466
+ options: { ...params.options, skip, top }
467
+ });
468
+
469
+ allRecords.push(...batch.data);
470
+
471
+ if (batch.data.length < top) break;
472
+ skip += top;
473
+ }
474
+
475
+ return allRecords;
476
+ }
477
+ ```
478
+
479
+ ## 🐛 Debugging
480
+
481
+ ### Logging
482
+
483
+ ```typescript
484
+ // Use structured logging throughout
485
+ const logger = createLogger('ToolName');
486
+
487
+ logger.info('Starting operation', { tableId, recordCount });
488
+ logger.debug('Request details', { method, path, body });
489
+ logger.error('Operation failed', { error, context });
490
+ ```
491
+
492
+ ### Debug Mode
493
+
494
+ ```bash
495
+ # Enable debug logging
496
+ DEBUG=true npm start
497
+
498
+ # Enable specific logger
499
+ DEBUG=QuickbaseClient npm start
500
+ ```
501
+
502
+ ### Common Issues
503
+
504
+ 1. **Authentication Errors**: Check user token and realm hostname
505
+ 2. **Rate Limiting**: Implement proper retry logic with backoff
506
+ 3. **Cache Issues**: Clear cache or disable caching for debugging
507
+ 4. **Type Errors**: Ensure all parameters match expected types
508
+
509
+ ## 🤝 Contributing
510
+
511
+ ### Code Style
512
+
513
+ - Use ESLint and Prettier configurations
514
+ - Follow existing patterns and conventions
515
+ - Add comprehensive tests for new features
516
+ - Update documentation for public APIs
517
+
518
+ ### Pull Request Process
519
+
520
+ 1. Create feature branch from `main`
521
+ 2. Implement feature with tests
522
+ 3. Ensure all tests pass
523
+ 4. Update documentation
524
+ 5. Submit pull request with clear description
525
+
526
+ ### Review Checklist
527
+
528
+ - [ ] Code follows TypeScript best practices
529
+ - [ ] Tests cover new functionality
530
+ - [ ] Documentation is updated
531
+ - [ ] No breaking changes to existing APIs
532
+ - [ ] Error handling is comprehensive
533
+ - [ ] Performance impact is considered
534
+
535
+ ---
536
+
537
+ For more specific questions, check the inline code documentation or open an issue on GitHub.