Skip to content

Commit 9da2909

Browse files
committed
Add built-in security and quality rules to Commit Coach
- Introduced new security rules to detect hardcoded secrets, SQL injection risks, and XSS vulnerabilities in commits. - Added quality checks for debug code, large file additions, dependency updates, missing error handling in async functions, and TypeScript 'any' type usage. - Enhanced documentation in README.md, EXAMPLES.md, and RULES.md to reflect the new rules and their configurations. - Updated the InsightGenerator to generate insights based on the new security and quality checks.
1 parent d0005e6 commit 9da2909

5 files changed

Lines changed: 387 additions & 8 deletions

File tree

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,24 @@ integrations:
7676
7777
## Built-in Rules
7878
79+
### 🔒 Security Rules
80+
- **Hardcoded Secrets**: Detects API keys, tokens, and credentials
81+
- **SQL Injection**: Identifies potential SQL injection vulnerabilities
82+
- **XSS Prevention**: Warns about unsafe DOM manipulation
83+
84+
### 🧪 Code Quality Rules
7985
- **Test Coverage**: Warns when source files lack tests
86+
- **Debug Code**: Detects console.log, debugger statements
87+
- **Error Handling**: Flags async functions without try/catch
88+
- **TypeScript Safety**: Warns about 'any' type usage
89+
90+
### 📝 Workflow Rules
91+
- **Merge Conflicts**: Detects unresolved conflict markers
92+
- **Large Files**: Warns about large file additions
93+
- **Dependencies**: Alerts on package updates
94+
- **Configuration**: Flags config file changes
95+
96+
### 🔄 API & Documentation Rules
8097
- **Public API Changes**: Detects API removals and new APIs
8198
- **Documentation**: Suggests updating docs for new features
8299
- **Commit Quality**: Flags large commits and short messages

commit-coach.yml.example

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,75 @@ rules:
6767
conditions: ["hasTodos"]
6868
message: "TODO/FIXME comments found - track these items"
6969

70+
# Security rules
71+
- id: hardcoded-secrets
72+
enabled: true
73+
severity: error
74+
conditions: ["diff.match(/['\"](sk-|pk_|ghp_|gho_|ghu_|ghs_|ghr_|AKIA|ya29\.)/)"]
75+
message: "Potential hardcoded secret detected - use environment variables instead"
76+
77+
- id: sql-injection-risk
78+
enabled: true
79+
severity: error
80+
conditions: ["diff.match(/query.*\\$\\{.*\\}|query.*\\+.*\\+/)"]
81+
message: "Potential SQL injection risk detected - use parameterized queries"
82+
83+
- id: xss-risk
84+
enabled: true
85+
severity: error
86+
conditions: ["diff.includes('innerHTML') && !diff.includes('textContent')"]
87+
message: "Potential XSS risk - use textContent instead of innerHTML"
88+
89+
# Code quality rules
90+
- id: debug-code
91+
enabled: true
92+
severity: warning
93+
conditions: ["diff.includes('console.log') || diff.includes('debugger') || diff.includes('alert(')"]
94+
message: "Debug code detected - remove before merging"
95+
96+
- id: large-file-addition
97+
enabled: true
98+
severity: warning
99+
conditions: ["files.some(f => f.status === 'added' && f.additions > 1000)"]
100+
message: "Large file(s) added - consider if these should be in version control"
101+
102+
- id: dependency-update
103+
enabled: true
104+
severity: info
105+
conditions: ["files.some(f => f.path.includes('package.json') || f.path.includes('yarn.lock') || f.path.includes('pnpm-lock.yaml'))"]
106+
message: "Dependencies updated - run tests and check for breaking changes"
107+
108+
- id: missing-error-handling
109+
enabled: true
110+
severity: warning
111+
conditions: ["diff.includes('async ') && !diff.includes('try') && !diff.includes('catch')"]
112+
message: "Async function added without error handling - consider try/catch blocks"
113+
114+
- id: typescript-any-type
115+
enabled: true
116+
severity: warning
117+
conditions: ["files.some(f => f.path.endsWith('.ts')) && diff.includes(': any')"]
118+
message: "Avoid using 'any' type - use specific types for better type safety"
119+
120+
# Workflow rules
121+
- id: merge-conflict-markers
122+
enabled: true
123+
severity: error
124+
conditions: ["diff.includes('<<<<<<<') || diff.includes('>>>>>>>') || diff.includes('=======')"]
125+
message: "Merge conflict markers detected - resolve conflicts before committing"
126+
127+
- id: binary-file-addition
128+
enabled: true
129+
severity: warning
130+
conditions: ["files.some(f => f.status === 'added' && /\.(jpg|jpeg|png|gif|pdf|zip|exe|dll|bin|so|dylib)$/i.test(f.path))"]
131+
message: "Binary file(s) added - ensure they're necessary and properly sized"
132+
133+
- id: config-file-changes
134+
enabled: true
135+
severity: info
136+
conditions: ["files.some(f => f.path.includes('config') || f.path.includes('.env') || f.path.includes('settings'))"]
137+
message: "Configuration files changed - verify all environments are updated"
138+
70139
# Output configuration
71140
output:
72141
format: console # console, comment, status-check, report

docs/EXAMPLES.md

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -452,11 +452,17 @@ integrations:
452452
```yaml
453453
# .commit-coach.yml
454454
rules:
455-
# Security patterns
455+
# Built-in security rules (automatically enabled)
456+
- id: hardcoded-secrets
457+
enabled: true
458+
severity: error
459+
conditions: ["diff.match(/['\"](sk-|pk_|ghp_|gho_|ghu_|ghs_|ghr_|AKIA|ya29\.)/)"]
460+
message: "Potential hardcoded secret detected - use environment variables"
461+
456462
- id: sql-injection-risk
457463
enabled: true
458464
severity: error
459-
conditions: ["diff.match(/query.*\\$\\{.*\\}/)"]
465+
conditions: ["diff.match(/query.*\\$\\{.*\\}|query.*\\+.*\\+/)"]
460466
message: "Potential SQL injection risk - use parameterized queries"
461467

462468
- id: xss-risk
@@ -465,18 +471,19 @@ rules:
465471
conditions: ["diff.includes('innerHTML') && !diff.includes('textContent')"]
466472
message: "Potential XSS risk - use textContent instead of innerHTML"
467473

468-
- id: hardcoded-secrets
469-
enabled: true
470-
severity: error
471-
conditions: ["diff.match(/['\"](sk-|pk_|ghp_|gho_|ghu_|ghs_|ghr_)/)"]
472-
message: "Potential hardcoded secret detected - use environment variables"
473-
474+
# Additional security rules
474475
- id: crypto-usage
475476
enabled: true
476477
severity: warning
477478
conditions: ["diff.includes('crypto') || diff.includes('hash')"]
478479
message: "Cryptographic code changed - review security implications"
479480

481+
- id: debug-code
482+
enabled: true
483+
severity: warning
484+
conditions: ["diff.includes('console.log') || diff.includes('debugger')"]
485+
message: "Debug code detected - remove before merging"
486+
480487
output:
481488
format: status-check
482489
maxInsights: 5

docs/RULES.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,16 +184,90 @@ Commit Coach comes with several built-in rules that you can enable/disable:
184184
message: "Breaking changes detected - update version and changelog"
185185
```
186186
187+
### Security Rules
188+
189+
```yaml
190+
- id: hardcoded-secrets
191+
enabled: true
192+
severity: error
193+
conditions: ["diff.match(/['\"](sk-|pk_|ghp_|gho_|ghu_|ghs_|ghr_|AKIA|ya29\.)/)"]
194+
message: "Potential hardcoded secret detected - use environment variables instead"
195+
196+
- id: sql-injection-risk
197+
enabled: true
198+
severity: error
199+
conditions: ["diff.match(/query.*\\$\\{.*\\}|query.*\\+.*\\+/)"]
200+
message: "Potential SQL injection risk detected - use parameterized queries"
201+
202+
- id: xss-risk
203+
enabled: true
204+
severity: error
205+
conditions: ["diff.includes('innerHTML') && !diff.includes('textContent')"]
206+
message: "Potential XSS risk - use textContent instead of innerHTML"
207+
```
208+
187209
### Code Quality Rules
188210
189211
```yaml
212+
- id: debug-code
213+
enabled: true
214+
severity: warning
215+
conditions: ["diff.includes('console.log') || diff.includes('debugger') || diff.includes('alert(')"]
216+
message: "Debug code detected - remove before merging"
217+
218+
- id: large-file-addition
219+
enabled: true
220+
severity: warning
221+
conditions: ["files.some(f => f.status === 'added' && f.additions > 1000)"]
222+
message: "Large file(s) added - consider if these should be in version control"
223+
224+
- id: dependency-update
225+
enabled: true
226+
severity: info
227+
conditions: ["files.some(f => f.path.includes('package.json') || f.path.includes('yarn.lock') || f.path.includes('pnpm-lock.yaml'))"]
228+
message: "Dependencies updated - run tests and check for breaking changes"
229+
230+
- id: missing-error-handling
231+
enabled: true
232+
severity: warning
233+
conditions: ["diff.includes('async ') && !diff.includes('try') && !diff.includes('catch')"]
234+
message: "Async function added without error handling - consider try/catch blocks"
235+
236+
- id: typescript-any-type
237+
enabled: true
238+
severity: warning
239+
conditions: ["files.some(f => f.path.endsWith('.ts')) && diff.includes(': any')"]
240+
message: "Avoid using 'any' type - use specific types for better type safety"
241+
190242
- id: todo-comments
191243
enabled: true
192244
severity: info
193245
conditions: ["hasTodos"]
194246
message: "TODO/FIXME comments found - track these items"
195247
```
196248
249+
### Workflow Rules
250+
251+
```yaml
252+
- id: merge-conflict-markers
253+
enabled: true
254+
severity: error
255+
conditions: ["diff.includes('<<<<<<<') || diff.includes('>>>>>>>') || diff.includes('=======')"]
256+
message: "Merge conflict markers detected - resolve conflicts before committing"
257+
258+
- id: binary-file-addition
259+
enabled: true
260+
severity: warning
261+
conditions: ["files.some(f => f.status === 'added' && /\.(jpg|jpeg|png|gif|pdf|zip|exe|dll|bin|so|dylib)$/i.test(f.path))"]
262+
message: "Binary file(s) added - ensure they're necessary and properly sized"
263+
264+
- id: config-file-changes
265+
enabled: true
266+
severity: info
267+
conditions: ["files.some(f => f.path.includes('config') || f.path.includes('.env') || f.path.includes('settings'))"]
268+
message: "Configuration files changed - verify all environments are updated"
269+
```
270+
197271
## Custom Rule Examples
198272
199273
### Security Rules

0 commit comments

Comments
 (0)