codeguard-testgen 1.0.10 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +311 -3
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +68 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1439 -515
- package/dist/index.js.map +1 -1
- package/dist/reviewEngine.d.ts +38 -0
- package/dist/reviewEngine.d.ts.map +1 -0
- package/dist/reviewEngine.js +571 -0
- package/dist/reviewEngine.js.map +1 -0
- package/dist/toolExecutors.d.ts +82 -0
- package/dist/toolExecutors.d.ts.map +1 -0
- package/dist/toolExecutors.js +354 -0
- package/dist/toolExecutors.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
AI-powered code review and unit test generator with AST analysis for TypeScript/JavaScript projects. Automatically reviews code quality and generates comprehensive Jest tests using Claude, OpenAI, or Gemini.
|
|
4
4
|
|
|
5
|
-
> **⚡ NEW: Unified Auto Mode** - Automatically review code quality AND generate tests for
|
|
5
|
+
> **⚡ NEW: Unified Auto Mode** - Automatically review code quality AND generate tests for staged functions!
|
|
6
6
|
> ```bash
|
|
7
7
|
> testgen auto # Reviews code + generates tests
|
|
8
8
|
> testgen review # Only code review
|
|
9
9
|
> testgen test # Only test generation
|
|
10
|
+
> testgen doc # Generate API documentation
|
|
10
11
|
> ```
|
|
11
12
|
|
|
12
13
|
## Features
|
|
@@ -31,6 +32,7 @@ AI-powered code review and unit test generator with AST analysis for TypeScript/
|
|
|
31
32
|
- ⚡ **Auto Mode**: Reviews code quality + generates tests for changed functions
|
|
32
33
|
- 🔄 **Git Integration**: Detects changes via git diff (staged and unstaged)
|
|
33
34
|
- 🚀 **CI/CD Ready**: Non-interactive modes perfect for automation
|
|
35
|
+
- 📚 **Documentation Mode**: AI-powered OpenAPI/Swagger documentation generation
|
|
34
36
|
|
|
35
37
|
## Installation
|
|
36
38
|
|
|
@@ -63,10 +65,29 @@ Create a `codeguard.json` file in your project root:
|
|
|
63
65
|
"openai": "gpt-4o-mini",
|
|
64
66
|
"gemini": "gemini-2.0-flash-exp"
|
|
65
67
|
},
|
|
68
|
+
"testEnv": "vitest/jest",
|
|
66
69
|
"testDir": "src/tests",
|
|
67
|
-
"extensions": [".ts", ".tsx", ".js", ".jsx"],
|
|
68
70
|
"excludeDirs": ["node_modules", "dist", "build", ".git", "coverage"],
|
|
69
|
-
"validationInterval": 5
|
|
71
|
+
"validationInterval": 5,
|
|
72
|
+
"reviewExecutionMode": "parallel",
|
|
73
|
+
"reviewSteps": [
|
|
74
|
+
{
|
|
75
|
+
"id": "code-quality",
|
|
76
|
+
"name": "Code Quality",
|
|
77
|
+
"category": "quality",
|
|
78
|
+
"type": "ai",
|
|
79
|
+
"enabled": true,
|
|
80
|
+
"ruleset": "code-quality.md"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "security",
|
|
84
|
+
"name": "Security",
|
|
85
|
+
"category": "security",
|
|
86
|
+
"type": "ai",
|
|
87
|
+
"enabled": true,
|
|
88
|
+
"ruleset": "security.md"
|
|
89
|
+
}
|
|
90
|
+
]
|
|
70
91
|
}
|
|
71
92
|
```
|
|
72
93
|
|
|
@@ -81,6 +102,147 @@ Create a `codeguard.json` file in your project root:
|
|
|
81
102
|
| `extensions` | No | File extensions to process (default: `.ts`, `.tsx`, `.js`, `.jsx`) |
|
|
82
103
|
| `excludeDirs` | No | Directories to exclude from scanning |
|
|
83
104
|
| `validationInterval` | No | Validation frequency in function-wise mode: `undefined` = no validation, `0` = only at end, `N` = validate every N functions |
|
|
105
|
+
| `docsDir` | No | Directory for generated documentation (default: `docs`) |
|
|
106
|
+
| `docFormat` | No | Documentation format: `json` or `yaml` (default: `json`) |
|
|
107
|
+
| `docTitle` | No | API documentation title (default: from package.json name) |
|
|
108
|
+
| `docVersion` | No | API version (default: from package.json version) |
|
|
109
|
+
| `includeGenericFunctions` | No | Include non-API functions in documentation (default: `true`) |
|
|
110
|
+
| `repoDoc` | No | Document entire repository (`true`) or only staged changes (`false`, default) |
|
|
111
|
+
| `reviewSteps` | No | Array of review steps with custom rulesets (see below) |
|
|
112
|
+
| `reviewExecutionMode` | No | How to execute review steps: `parallel` or `sequential` (default: `parallel`) |
|
|
113
|
+
|
|
114
|
+
### Configurable Review Steps
|
|
115
|
+
|
|
116
|
+
Configure custom review steps with rulesets defined in markdown files. Each ruleset is stored in the `codeguard-ruleset/` folder at your project root.
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"reviewExecutionMode": "parallel",
|
|
121
|
+
"reviewSteps": [
|
|
122
|
+
{
|
|
123
|
+
"id": "code-quality",
|
|
124
|
+
"name": "Code Quality",
|
|
125
|
+
"category": "quality",
|
|
126
|
+
"type": "ai",
|
|
127
|
+
"enabled": true,
|
|
128
|
+
"ruleset": "code-quality.md"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "security",
|
|
132
|
+
"name": "Security Vulnerabilities",
|
|
133
|
+
"category": "security",
|
|
134
|
+
"type": "ai",
|
|
135
|
+
"enabled": true,
|
|
136
|
+
"ruleset": "security.md"
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Review Step Options:**
|
|
143
|
+
|
|
144
|
+
| Option | Required | Description |
|
|
145
|
+
|--------|----------|-------------|
|
|
146
|
+
| `id` | Yes | Unique identifier for the step |
|
|
147
|
+
| `name` | Yes | Display name for the review step |
|
|
148
|
+
| `category` | Yes | Category of the review (e.g., `quality`, `security`, `performance`) |
|
|
149
|
+
| `type` | Yes | Type of review (currently only `ai` supported) |
|
|
150
|
+
| `enabled` | Yes | Whether this step is active (`true` or `false`) |
|
|
151
|
+
| `ruleset` | Yes | Filename of markdown ruleset in `codeguard-ruleset/` folder |
|
|
152
|
+
|
|
153
|
+
**Ruleset Files:**
|
|
154
|
+
|
|
155
|
+
Rulesets are markdown files stored in `codeguard-ruleset/` at your project root:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
your-project/
|
|
159
|
+
├── codeguard.json
|
|
160
|
+
├── codeguard-ruleset/
|
|
161
|
+
│ ├── code-quality.md
|
|
162
|
+
│ ├── security.md
|
|
163
|
+
│ ├── performance.md
|
|
164
|
+
│ └── custom-rules.md
|
|
165
|
+
└── src/
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Each ruleset file can contain:
|
|
169
|
+
- Detailed review criteria
|
|
170
|
+
- Specific rules and guidelines
|
|
171
|
+
- Examples and code snippets
|
|
172
|
+
- Severity guidelines
|
|
173
|
+
- OWASP references (for security)
|
|
174
|
+
- Best practices documentation
|
|
175
|
+
|
|
176
|
+
**Example Ruleset File** (`codeguard-ruleset/code-quality.md`):
|
|
177
|
+
|
|
178
|
+
```markdown
|
|
179
|
+
# Code Quality Review Ruleset
|
|
180
|
+
|
|
181
|
+
## Review Criteria
|
|
182
|
+
|
|
183
|
+
### 1. Naming Conventions
|
|
184
|
+
- Functions: Use clear, descriptive names
|
|
185
|
+
- Variables: Use meaningful names
|
|
186
|
+
- Boolean variables: Prefix with is, has, should
|
|
187
|
+
|
|
188
|
+
### 2. Code Complexity
|
|
189
|
+
- Functions should be concise (< 50 lines)
|
|
190
|
+
- Cyclomatic complexity should be low (< 10)
|
|
191
|
+
- Avoid deeply nested conditionals
|
|
192
|
+
|
|
193
|
+
...
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**Execution Modes:**
|
|
197
|
+
|
|
198
|
+
- **`parallel`** (default): All enabled review steps run simultaneously for faster completion
|
|
199
|
+
- **`sequential`**: Steps run one after another in the order defined
|
|
200
|
+
|
|
201
|
+
**Default Review Steps:**
|
|
202
|
+
|
|
203
|
+
If you don't specify `reviewSteps` in your config, CodeGuard uses these default steps:
|
|
204
|
+
- ✅ **Code Quality** (`code-quality.md`) - Naming, complexity, readability, best practices
|
|
205
|
+
- ✅ **Potential Bugs** (`potential-bugs.md`) - Logic errors, edge cases, type issues, async problems
|
|
206
|
+
- ✅ **Performance** (`performance.md`) - Algorithm efficiency, unnecessary computations, memory leaks
|
|
207
|
+
- ✅ **Security** (`security.md`) - Input validation, injection risks, OWASP vulnerabilities
|
|
208
|
+
|
|
209
|
+
**Included Ruleset Files:**
|
|
210
|
+
|
|
211
|
+
CodeGuard comes with comprehensive default rulesets in `codeguard-ruleset/`:
|
|
212
|
+
- `code-quality.md` - 8 categories including naming, complexity, patterns, error handling
|
|
213
|
+
- `potential-bugs.md` - 8 categories covering logic errors, edge cases, async issues
|
|
214
|
+
- `performance.md` - 8 categories for algorithms, caching, data structures, optimizations
|
|
215
|
+
- `security.md` - OWASP Top 10 coverage with specific checks and references
|
|
216
|
+
|
|
217
|
+
You can customize these files or create your own rulesets for project-specific requirements.
|
|
218
|
+
|
|
219
|
+
**Output Format:**
|
|
220
|
+
|
|
221
|
+
Reviews are organized by step in the final markdown file:
|
|
222
|
+
|
|
223
|
+
```markdown
|
|
224
|
+
# Code Review
|
|
225
|
+
|
|
226
|
+
## Summary
|
|
227
|
+
[Overall assessment]
|
|
228
|
+
|
|
229
|
+
## Files Changed
|
|
230
|
+
[List of files]
|
|
231
|
+
|
|
232
|
+
## Code Quality
|
|
233
|
+
[Findings from code quality step]
|
|
234
|
+
|
|
235
|
+
## Security Vulnerabilities
|
|
236
|
+
[Findings from security step]
|
|
237
|
+
|
|
238
|
+
## Performance Issues
|
|
239
|
+
[Findings from performance step]
|
|
240
|
+
|
|
241
|
+
## Conclusion
|
|
242
|
+
[Final assessment]
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
See `codeguard.example.json` for a complete configuration example with additional review steps like Accessibility and Documentation Quality.
|
|
84
246
|
|
|
85
247
|
### Validation Interval
|
|
86
248
|
|
|
@@ -258,6 +420,12 @@ cat reviews/user.service.review.md
|
|
|
258
420
|
testgen test
|
|
259
421
|
```
|
|
260
422
|
|
|
423
|
+
**Documentation generation:**
|
|
424
|
+
```bash
|
|
425
|
+
# Generate API documentation
|
|
426
|
+
testgen doc
|
|
427
|
+
```
|
|
428
|
+
|
|
261
429
|
**Output:**
|
|
262
430
|
```
|
|
263
431
|
🧪 AI-Powered Unit Test Generator with AST Analysis
|
|
@@ -361,6 +529,128 @@ Test generation only:
|
|
|
361
529
|
- Faster when you only need tests
|
|
362
530
|
- Use: `testgen test`
|
|
363
531
|
|
|
532
|
+
#### 7. Documentation Mode
|
|
533
|
+
AI-powered API documentation generation:
|
|
534
|
+
- **Default**: Documents only staged/changed functions (like review/test modes)
|
|
535
|
+
- **Full Repo**: Set `"repoDoc": true` to document entire codebase
|
|
536
|
+
- Analyzes codebase using AST tools
|
|
537
|
+
- Auto-detects API endpoints (Express, NestJS, Fastify, Koa)
|
|
538
|
+
- Generates comprehensive OpenAPI 3.0 specification
|
|
539
|
+
- Documents both API routes and generic functions
|
|
540
|
+
- Smart merge with existing documentation
|
|
541
|
+
- Supports JSON and YAML formats
|
|
542
|
+
- Use: `testgen doc`
|
|
543
|
+
|
|
544
|
+
**Two modes:**
|
|
545
|
+
|
|
546
|
+
**1. Changed Files Only (Default)** - `"repoDoc": false` or omitted
|
|
547
|
+
- Works like `testgen review` and `testgen test`
|
|
548
|
+
- Only documents staged/changed functions
|
|
549
|
+
- Fast and targeted
|
|
550
|
+
- Perfect for incremental updates
|
|
551
|
+
- Requires git repository
|
|
552
|
+
|
|
553
|
+
**2. Full Repository** - `"repoDoc": true`
|
|
554
|
+
- Documents entire codebase
|
|
555
|
+
- Comprehensive documentation generation
|
|
556
|
+
- Useful for initial documentation or major updates
|
|
557
|
+
- No git requirement
|
|
558
|
+
|
|
559
|
+
**What it documents:**
|
|
560
|
+
- ✅ **API Endpoints**: All REST API routes with methods, paths, parameters
|
|
561
|
+
- ✅ **Request/Response Schemas**: Inferred from TypeScript types
|
|
562
|
+
- ✅ **Authentication**: Detects and documents auth requirements
|
|
563
|
+
- ✅ **Error Responses**: Documents error cases and status codes
|
|
564
|
+
- ✅ **Generic Functions**: Optional documentation for utility functions
|
|
565
|
+
- ✅ **Usage Examples**: AI-generated examples for each endpoint
|
|
566
|
+
|
|
567
|
+
**Supported Frameworks:**
|
|
568
|
+
- **Express**: `app.get()`, `router.post()`, route methods
|
|
569
|
+
- **NestJS**: `@Controller()`, `@Get()`, `@Post()`, decorators
|
|
570
|
+
- **Fastify**: `fastify.route()`, route configurations
|
|
571
|
+
- **Koa**: `router.get()`, middleware patterns
|
|
572
|
+
|
|
573
|
+
**Example usage:**
|
|
574
|
+
```bash
|
|
575
|
+
# Document only changed/staged functions (default)
|
|
576
|
+
testgen doc
|
|
577
|
+
|
|
578
|
+
# Output:
|
|
579
|
+
# 📚 Documentation Mode: Generating API documentation
|
|
580
|
+
#
|
|
581
|
+
# 🔍 Scanning git changes for documentation...
|
|
582
|
+
#
|
|
583
|
+
# 📝 Found changes in 2 file(s)
|
|
584
|
+
#
|
|
585
|
+
# 🤖 Generating OpenAPI specification...
|
|
586
|
+
#
|
|
587
|
+
# ✅ Documentation generated successfully
|
|
588
|
+
#
|
|
589
|
+
# ============================================================
|
|
590
|
+
# 📊 Documentation Summary
|
|
591
|
+
# ============================================================
|
|
592
|
+
# ✅ API Endpoints documented: 5
|
|
593
|
+
# ✅ Generic functions documented: 8
|
|
594
|
+
# 📁 Output: docs/openapi.json
|
|
595
|
+
# ============================================================
|
|
596
|
+
|
|
597
|
+
# For full repository documentation, set in codeguard.json:
|
|
598
|
+
# {
|
|
599
|
+
# "repoDoc": true
|
|
600
|
+
# }
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
**Generated OpenAPI spec:**
|
|
604
|
+
```json
|
|
605
|
+
{
|
|
606
|
+
"openapi": "3.0.0",
|
|
607
|
+
"info": {
|
|
608
|
+
"title": "My API",
|
|
609
|
+
"version": "1.0.0"
|
|
610
|
+
},
|
|
611
|
+
"paths": {
|
|
612
|
+
"/users": {
|
|
613
|
+
"get": {
|
|
614
|
+
"summary": "Get all users",
|
|
615
|
+
"responses": {
|
|
616
|
+
"200": {
|
|
617
|
+
"description": "Success",
|
|
618
|
+
"content": {
|
|
619
|
+
"application/json": {
|
|
620
|
+
"schema": {
|
|
621
|
+
"type": "array",
|
|
622
|
+
"items": { "$ref": "#/components/schemas/User" }
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
},
|
|
631
|
+
"components": {
|
|
632
|
+
"schemas": {
|
|
633
|
+
"User": {
|
|
634
|
+
"type": "object",
|
|
635
|
+
"properties": {
|
|
636
|
+
"id": { "type": "string" },
|
|
637
|
+
"name": { "type": "string" },
|
|
638
|
+
"email": { "type": "string" }
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
**Smart merging:**
|
|
647
|
+
When existing documentation is found, CodeGuard intelligently merges:
|
|
648
|
+
- ✅ Preserves manually edited descriptions and summaries
|
|
649
|
+
- ✅ Updates schemas with latest types from code
|
|
650
|
+
- ✅ Adds new endpoints without removing manual changes
|
|
651
|
+
- ✅ Maintains custom examples and documentation
|
|
652
|
+
- ✅ Tracks generation metadata and timestamps
|
|
653
|
+
|
|
364
654
|
## How It Works
|
|
365
655
|
|
|
366
656
|
### Code Review Process
|
|
@@ -395,6 +685,24 @@ Test generation only:
|
|
|
395
685
|
- Type mismatches
|
|
396
686
|
7. **Failure Detection**: Distinguishes between test bugs and source code bugs
|
|
397
687
|
|
|
688
|
+
### Documentation Generation Process
|
|
689
|
+
1. **File Scanning**: Recursively scans all source files in the project
|
|
690
|
+
2. **AST Analysis**: Parses each file using Babel to understand structure
|
|
691
|
+
3. **Endpoint Detection**: AI identifies API routes across different frameworks:
|
|
692
|
+
- Express: `app.METHOD()`, `router.METHOD()`
|
|
693
|
+
- NestJS: `@Controller()`, `@Get()`, `@Post()`, etc.
|
|
694
|
+
- Fastify: `fastify.route()`, route configurations
|
|
695
|
+
- Koa: `router.METHOD()`, middleware chains
|
|
696
|
+
4. **Schema Inference**: Extracts TypeScript types for request/response schemas
|
|
697
|
+
5. **AI Enhancement**: AI generates:
|
|
698
|
+
- Meaningful descriptions for each endpoint
|
|
699
|
+
- Parameter documentation
|
|
700
|
+
- Response examples
|
|
701
|
+
- Error scenarios
|
|
702
|
+
6. **OpenAPI Generation**: Builds complete OpenAPI 3.0 specification
|
|
703
|
+
7. **Smart Merge**: Intelligently merges with existing documentation
|
|
704
|
+
8. **File Output**: Writes to `docs/openapi.json` or `.yaml`
|
|
705
|
+
|
|
398
706
|
## Generated Test Features
|
|
399
707
|
|
|
400
708
|
The AI generates tests with:
|
package/dist/config.d.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
export interface ReviewStep {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
category: string;
|
|
5
|
+
type: 'ai';
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
ruleset: string;
|
|
8
|
+
}
|
|
1
9
|
export interface CodeGuardConfig {
|
|
2
10
|
aiProvider: 'openai' | 'gemini' | 'claude';
|
|
3
11
|
apiKeys: {
|
|
@@ -11,14 +19,24 @@ export interface CodeGuardConfig {
|
|
|
11
19
|
gemini?: string;
|
|
12
20
|
};
|
|
13
21
|
testDir?: string;
|
|
22
|
+
testEnv?: 'jest' | 'vitest';
|
|
14
23
|
extensions?: string[];
|
|
15
24
|
excludeDirs?: string[];
|
|
16
25
|
validationInterval?: number;
|
|
26
|
+
docsDir?: string;
|
|
27
|
+
docFormat?: 'json' | 'yaml';
|
|
28
|
+
docTitle?: string;
|
|
29
|
+
docVersion?: string;
|
|
30
|
+
includeGenericFunctions?: boolean;
|
|
31
|
+
repoDoc?: boolean;
|
|
32
|
+
reviewSteps?: ReviewStep[];
|
|
33
|
+
reviewExecutionMode?: 'parallel' | 'sequential';
|
|
17
34
|
}
|
|
18
35
|
export interface Config {
|
|
19
36
|
extensions: string[];
|
|
20
37
|
excludeDirs: string[];
|
|
21
38
|
testDir: string;
|
|
39
|
+
testEnv: 'jest' | 'vitest';
|
|
22
40
|
aiProvider: 'openai' | 'gemini' | 'claude';
|
|
23
41
|
apiKeys: {
|
|
24
42
|
claude?: string;
|
|
@@ -31,6 +49,14 @@ export interface Config {
|
|
|
31
49
|
gemini: string;
|
|
32
50
|
};
|
|
33
51
|
validationInterval?: number;
|
|
52
|
+
docsDir: string;
|
|
53
|
+
docFormat: 'json' | 'yaml';
|
|
54
|
+
docTitle: string;
|
|
55
|
+
docVersion: string;
|
|
56
|
+
includeGenericFunctions: boolean;
|
|
57
|
+
repoDoc: boolean;
|
|
58
|
+
reviewSteps: ReviewStep[];
|
|
59
|
+
reviewExecutionMode: 'parallel' | 'sequential';
|
|
34
60
|
}
|
|
35
61
|
export declare function loadConfig(): Config;
|
|
36
62
|
export declare function validateConfig(config: Config): void;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,mBAAmB,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CACjD;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,OAAO,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,mBAAmB,EAAE,UAAU,GAAG,YAAY,CAAC;CAChD;AA2CD,wBAAgB,UAAU,IAAI,MAAM,CA6GnC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAuBnD"}
|
package/dist/config.js
CHANGED
|
@@ -9,6 +9,40 @@ const DEFAULT_MODELS = {
|
|
|
9
9
|
openai: 'gpt-5-mini',
|
|
10
10
|
gemini: 'gemini-2.0-flash-lite'
|
|
11
11
|
};
|
|
12
|
+
const DEFAULT_REVIEW_STEPS = [
|
|
13
|
+
{
|
|
14
|
+
id: 'code-quality',
|
|
15
|
+
name: 'Code Quality',
|
|
16
|
+
category: 'quality',
|
|
17
|
+
type: 'ai',
|
|
18
|
+
enabled: true,
|
|
19
|
+
ruleset: 'code-quality.md'
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: 'potential-bugs',
|
|
23
|
+
name: 'Potential Bugs',
|
|
24
|
+
category: 'bugs',
|
|
25
|
+
type: 'ai',
|
|
26
|
+
enabled: true,
|
|
27
|
+
ruleset: 'potential-bugs.md'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'performance',
|
|
31
|
+
name: 'Performance Issues',
|
|
32
|
+
category: 'performance',
|
|
33
|
+
type: 'ai',
|
|
34
|
+
enabled: true,
|
|
35
|
+
ruleset: 'performance.md'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'security',
|
|
39
|
+
name: 'Security Vulnerabilities',
|
|
40
|
+
category: 'security',
|
|
41
|
+
type: 'ai',
|
|
42
|
+
enabled: true,
|
|
43
|
+
ruleset: 'security.md'
|
|
44
|
+
}
|
|
45
|
+
];
|
|
12
46
|
function loadConfig() {
|
|
13
47
|
const configPath = path.join(process.cwd(), 'codeguard.json');
|
|
14
48
|
// Check if config file exists
|
|
@@ -20,6 +54,7 @@ function loadConfig() {
|
|
|
20
54
|
return {
|
|
21
55
|
aiProvider: 'claude',
|
|
22
56
|
testDir: 'src/tests',
|
|
57
|
+
testEnv: 'jest',
|
|
23
58
|
extensions: ['.ts', '.tsx', '.js', '.jsx'],
|
|
24
59
|
excludeDirs: ['node_modules', 'dist', 'build', '.git', 'coverage', '__tests__'],
|
|
25
60
|
apiKeys: {
|
|
@@ -27,7 +62,15 @@ function loadConfig() {
|
|
|
27
62
|
openai: process.env.OPENAI_API_KEY,
|
|
28
63
|
gemini: process.env.GEMINI_API_KEY
|
|
29
64
|
},
|
|
30
|
-
models: DEFAULT_MODELS
|
|
65
|
+
models: DEFAULT_MODELS,
|
|
66
|
+
docsDir: 'docs',
|
|
67
|
+
docFormat: 'json',
|
|
68
|
+
docTitle: 'API Documentation',
|
|
69
|
+
docVersion: '1.0.0',
|
|
70
|
+
includeGenericFunctions: true,
|
|
71
|
+
repoDoc: false,
|
|
72
|
+
reviewSteps: DEFAULT_REVIEW_STEPS,
|
|
73
|
+
reviewExecutionMode: 'parallel'
|
|
31
74
|
};
|
|
32
75
|
}
|
|
33
76
|
// Load and parse config file
|
|
@@ -54,10 +97,25 @@ function loadConfig() {
|
|
|
54
97
|
if (!selectedProviderKey) {
|
|
55
98
|
throw new Error(`API key for "${config.aiProvider}" not found in codeguard.json`);
|
|
56
99
|
}
|
|
100
|
+
// Try to read package.json for default title and version
|
|
101
|
+
let packageTitle = 'API Documentation';
|
|
102
|
+
let packageVersion = '1.0.0';
|
|
103
|
+
try {
|
|
104
|
+
const packagePath = path.join(process.cwd(), 'package.json');
|
|
105
|
+
if (fs.existsSync(packagePath)) {
|
|
106
|
+
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
|
|
107
|
+
packageTitle = packageJson.name || packageTitle;
|
|
108
|
+
packageVersion = packageJson.version || packageVersion;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Ignore errors reading package.json
|
|
113
|
+
}
|
|
57
114
|
// Build final config with defaults
|
|
58
115
|
return {
|
|
59
116
|
aiProvider: config.aiProvider,
|
|
60
117
|
testDir: config.testDir || 'src/tests',
|
|
118
|
+
testEnv: config.testEnv || 'jest',
|
|
61
119
|
extensions: config.extensions || ['.ts', '.tsx', '.js', '.jsx'],
|
|
62
120
|
excludeDirs: config.excludeDirs || [
|
|
63
121
|
'node_modules',
|
|
@@ -77,7 +135,15 @@ function loadConfig() {
|
|
|
77
135
|
openai: config.models?.openai || DEFAULT_MODELS.openai,
|
|
78
136
|
gemini: config.models?.gemini || DEFAULT_MODELS.gemini
|
|
79
137
|
},
|
|
80
|
-
validationInterval: config.validationInterval // undefined by default (no validation)
|
|
138
|
+
validationInterval: config.validationInterval, // undefined by default (no validation)
|
|
139
|
+
docsDir: config.docsDir || 'docs',
|
|
140
|
+
docFormat: config.docFormat || 'json',
|
|
141
|
+
docTitle: config.docTitle || packageTitle,
|
|
142
|
+
docVersion: config.docVersion || packageVersion,
|
|
143
|
+
includeGenericFunctions: config.includeGenericFunctions !== undefined ? config.includeGenericFunctions : true,
|
|
144
|
+
repoDoc: config.repoDoc !== undefined ? config.repoDoc : false,
|
|
145
|
+
reviewSteps: config.reviewSteps || DEFAULT_REVIEW_STEPS,
|
|
146
|
+
reviewExecutionMode: config.reviewExecutionMode || 'parallel'
|
|
81
147
|
};
|
|
82
148
|
}
|
|
83
149
|
function validateConfig(config) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ interface Tool {
|
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
declare const TOOLS: Tool[];
|
|
26
|
-
declare function analyzeFileAST(filePath: string): any;
|
|
26
|
+
declare function analyzeFileAST(filePath: string, functionName?: string): any;
|
|
27
27
|
declare function getFunctionAST(filePath: string, functionName: string): any;
|
|
28
28
|
declare function getImportsAST(filePath: string): any;
|
|
29
29
|
declare function getTypeDefinitions(filePath: string): any;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|