- Created a comprehensive pre-commit blocker report detailing GolangCI-Lint and TypeScript type check failures, including remediation steps and verification commands. - Enhanced the golangci-lint pre-commit hook to automatically rebuild the tool if a Go version mismatch is detected. - Introduced a new script `rebuild-go-tools.sh` to rebuild essential Go development tools, ensuring they are compiled with the current Go version. - Improved error handling and user feedback in the rebuilding process, providing clear instructions for manual intervention if needed. - Updated supervisor review report to reflect the successful implementation of Go version management and associated documentation.
419 lines
10 KiB
Markdown
419 lines
10 KiB
Markdown
---
|
|
post_title: Pre-commit Blocker Remediation Plan
|
|
author1: "Charon Team"
|
|
post_slug: precommit-blocker-remediation
|
|
categories:
|
|
- infrastructure
|
|
- testing
|
|
tags:
|
|
- ci
|
|
- typescript
|
|
- go
|
|
- quick-fix
|
|
summary: "Quick fix plan for two critical pre-commit blockers: GolangCI-Lint version mismatch and TypeScript type errors."
|
|
post_date: "2026-02-12"
|
|
---
|
|
|
|
# Pre-commit Blocker Remediation Plan
|
|
|
|
**Status**: Ready for Implementation
|
|
**Priority**: Critical (Blocks commits)
|
|
**Estimated Time**: 15-20 minutes
|
|
**Confidence**: 95%
|
|
|
|
---
|
|
|
|
## 1. Introduction
|
|
|
|
Two critical blockers prevent commits:
|
|
1. **GolangCI-Lint Configuration**: Go version mismatch (built with 1.25, project uses 1.26)
|
|
2. **TypeScript Type Check**: 13 type errors in test file `src/components/__tests__/ProxyHostForm-dropdown-changes.test.tsx`
|
|
|
|
This plan provides exact commands, file changes, and verification steps to resolve both issues.
|
|
|
|
---
|
|
|
|
## 2. Issue Analysis
|
|
|
|
### 2.1 GolangCI-Lint Version Mismatch
|
|
|
|
**Error Message:**
|
|
```
|
|
Error: can't load config: the Go language version (go1.25) used to build
|
|
golangci-lint is lower than the targeted Go version (1.26)
|
|
```
|
|
|
|
**Root Cause:**
|
|
- GolangCI-Lint binary was built with Go 1.25
|
|
- Project's `go.mod` targets Go 1.26
|
|
- GolangCI-Lint refuses to run when built with older Go version than target
|
|
|
|
**Impact:**
|
|
- All Go linting blocked
|
|
- Cannot verify Go code quality
|
|
- Pre-commit hook fails with exit code 3
|
|
|
|
### 2.2 TypeScript Type Errors
|
|
|
|
**File:** `frontend/src/components/__tests__/ProxyHostForm-dropdown-changes.test.tsx`
|
|
|
|
**Error Categories:**
|
|
|
|
#### Category A: Invalid Property (Lines 92, 104)
|
|
Mock `SecurityHeaderProfile` objects use `headers: {}` property that doesn't exist in the type definition.
|
|
|
|
**Actual Type Definition** (`frontend/src/api/securityHeaders.ts`):
|
|
```typescript
|
|
export interface SecurityHeaderProfile {
|
|
id: number;
|
|
uuid: string;
|
|
name: string;
|
|
hsts_enabled: boolean;
|
|
hsts_max_age: number;
|
|
// ... (25+ security header properties)
|
|
// NO "headers" property exists
|
|
}
|
|
```
|
|
|
|
#### Category B: Untyped Vitest Mocks (Lines 158, 202, 243, 281, 345)
|
|
Vitest `vi.fn()` calls lack explicit type parameters, resulting in generic `Mock<Procedure | Constructable>` type that doesn't match expected function signatures.
|
|
|
|
**Expected Types:**
|
|
- `onSaveSuccess`: `(data: Partial<ProxyHost>) => Promise<void>`
|
|
- `onClose`: `() => void`
|
|
|
|
---
|
|
|
|
## 3. Solution Specifications
|
|
|
|
### 3.1 GolangCI-Lint Fix
|
|
|
|
**Command:**
|
|
```bash
|
|
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
|
```
|
|
|
|
**What it does:**
|
|
- Downloads latest golangci-lint source
|
|
- Builds with current Go version (1.26)
|
|
- Installs to `$GOPATH/bin` or `$HOME/go/bin`
|
|
|
|
**Verification:**
|
|
```bash
|
|
golangci-lint version
|
|
```
|
|
|
|
**Expected Output:**
|
|
```
|
|
golangci-lint has version 1.xx.x built with go1.26.x from ...
|
|
```
|
|
|
|
### 3.2 TypeScript Type Fixes
|
|
|
|
#### Fix 1: Remove Invalid `headers` Property
|
|
|
|
**Lines 92, 104** - Remove the `headers: {}` property entirely from mock objects.
|
|
|
|
**Current (BROKEN):**
|
|
```typescript
|
|
const profile = {
|
|
id: 1,
|
|
uuid: 'profile-uuid-1',
|
|
name: 'Basic Security',
|
|
description: 'Basic security headers',
|
|
is_preset: true,
|
|
preset_type: 'basic',
|
|
security_score: 60,
|
|
headers: {}, // ❌ DOESN'T EXIST IN TYPE
|
|
created_at: '2024-01-01',
|
|
updated_at: '2024-01-01',
|
|
}
|
|
```
|
|
|
|
**Fixed:**
|
|
```typescript
|
|
const profile = {
|
|
id: 1,
|
|
uuid: 'profile-uuid-1',
|
|
name: 'Basic Security',
|
|
description: 'Basic security headers',
|
|
is_preset: true,
|
|
preset_type: 'basic',
|
|
security_score: 60,
|
|
// headers property removed
|
|
created_at: '2024-01-01',
|
|
updated_at: '2024-01-01',
|
|
}
|
|
```
|
|
|
|
#### Fix 2: Add Explicit Mock Types
|
|
|
|
**Lines 158, 202, 243, 281, 345** - Add type parameters to `vi.fn()` calls.
|
|
|
|
**Current Pattern (BROKEN):**
|
|
```typescript
|
|
onSaveSuccess: vi.fn(), // ❌ Untyped mock
|
|
onClose: vi.fn(), // ❌ Untyped mock
|
|
```
|
|
|
|
**Fixed Pattern (Option 1 - Type Assertions):**
|
|
```typescript
|
|
onSaveSuccess: vi.fn() as jest.MockedFunction<(data: Partial<ProxyHost>) => Promise<void>>,
|
|
onClose: vi.fn() as jest.MockedFunction<() => void>,
|
|
```
|
|
|
|
**Fixed Pattern (Option 2 - Generic Type Parameters - RECOMMENDED):**
|
|
```typescript
|
|
onSaveSuccess: vi.fn<[Partial<ProxyHost>], Promise<void>>(),
|
|
onClose: vi.fn<[], void>(),
|
|
```
|
|
|
|
**Rationale for Option 2:**
|
|
- More explicit and type-safe
|
|
- Better IDE autocomplete support
|
|
- Matches Vitest conventions
|
|
- Less boilerplate than type assertions
|
|
|
|
---
|
|
|
|
## 4. Implementation Steps
|
|
|
|
### Step 1: Rebuild GolangCI-Lint
|
|
|
|
```bash
|
|
# Rebuild golangci-lint with Go 1.26
|
|
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
|
|
|
# Verify version
|
|
golangci-lint version
|
|
|
|
# Test run (should no longer error on version)
|
|
golangci-lint run ./... --timeout=5m
|
|
```
|
|
|
|
**Expected Result:** No version error, linting runs successfully.
|
|
|
|
### Step 2: Fix TypeScript Type Errors
|
|
|
|
**File:** `frontend/src/components/__tests__/ProxyHostForm-dropdown-changes.test.tsx`
|
|
|
|
**Change 1: Line 92 (Remove `headers` property)**
|
|
```typescript
|
|
// BEFORE:
|
|
const mockHeaderProfiles = [
|
|
{
|
|
id: 1,
|
|
uuid: 'profile-uuid-1',
|
|
name: 'Basic Security',
|
|
description: 'Basic security headers',
|
|
is_preset: true,
|
|
preset_type: 'basic',
|
|
security_score: 60,
|
|
headers: {}, // REMOVE THIS LINE
|
|
created_at: '2024-01-01',
|
|
updated_at: '2024-01-01',
|
|
},
|
|
|
|
// AFTER:
|
|
const mockHeaderProfiles = [
|
|
{
|
|
id: 1,
|
|
uuid: 'profile-uuid-1',
|
|
name: 'Basic Security',
|
|
description: 'Basic security headers',
|
|
is_preset: true,
|
|
preset_type: 'basic',
|
|
security_score: 60,
|
|
// headers property removed
|
|
created_at: '2024-01-01',
|
|
updated_at: '2024-01-01',
|
|
},
|
|
```
|
|
|
|
**Change 2: Line 104 (Remove `headers` property from second profile)**
|
|
Same change as above for the second profile in the array.
|
|
|
|
**Change 3: Lines 158, 202, 243, 281, 345 (Add mock types)**
|
|
|
|
Find all occurrences of:
|
|
```typescript
|
|
onSaveSuccess: vi.fn(),
|
|
onClose: vi.fn(),
|
|
```
|
|
|
|
Replace with:
|
|
```typescript
|
|
onSaveSuccess: vi.fn<[Partial<ProxyHost>], Promise<void>>(),
|
|
onClose: vi.fn<[], void>(),
|
|
```
|
|
|
|
**Exact Line Changes:**
|
|
|
|
**Line 158:**
|
|
```typescript
|
|
// BEFORE:
|
|
<ProxyHostForm onSubmit={mockOnSubmit} onCancel={mockOnCancel} />
|
|
|
|
// Context shows this is part of a render call
|
|
// Update the mock definitions above this line:
|
|
const mockOnSubmit = vi.fn<[Partial<ProxyHost>], Promise<void>>();
|
|
const mockOnCancel = vi.fn<[], void>();
|
|
```
|
|
|
|
Apply the same pattern for lines: 202, 243, 281, 345.
|
|
|
|
### Step 3: Verify Fixes
|
|
|
|
```bash
|
|
# Run TypeScript type check
|
|
cd /projects/Charon/frontend
|
|
npm run type-check
|
|
|
|
# Expected: 0 errors
|
|
|
|
# Run pre-commit checks
|
|
cd /projects/Charon
|
|
.github/skills/scripts/skill-runner.sh qa-precommit-all
|
|
|
|
# Expected: Exit code 0 (all hooks pass)
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Acceptance Criteria
|
|
|
|
### GolangCI-Lint
|
|
- [ ] `golangci-lint version` shows built with Go 1.26.x
|
|
- [ ] `golangci-lint run` executes without version errors
|
|
- [ ] Pre-commit hook `golangci-lint-fast` passes
|
|
|
|
### TypeScript
|
|
- [ ] No `headers` property in mock SecurityHeaderProfile objects
|
|
- [ ] All `vi.fn()` calls have explicit type parameters
|
|
- [ ] `npm run type-check` exits with 0 errors
|
|
- [ ] Pre-commit hook `frontend-type-check` passes
|
|
|
|
### Overall
|
|
- [ ] `.github/skills/scripts/skill-runner.sh qa-precommit-all` exits code 0
|
|
- [ ] No new type errors introduced
|
|
- [ ] All 13 TypeScript errors resolved
|
|
|
|
---
|
|
|
|
## 6. Risk Assessment
|
|
|
|
**Risks:** Minimal
|
|
|
|
1. **GolangCI-Lint rebuild might fail if Go isn't installed**
|
|
- Mitigation: Check Go version first (`go version`)
|
|
- Expected: Go 1.26.x already installed
|
|
|
|
2. **Mock type changes might break test runtime behavior**
|
|
- Mitigation: Run tests after type fixes
|
|
- Expected: Tests still pass, only types are corrected
|
|
|
|
3. **Removing `headers` property might affect test assertions**
|
|
- Mitigation: The property was never valid, so no test logic uses it
|
|
- Expected: Tests pass without modification
|
|
|
|
**Confidence:** 95%
|
|
|
|
---
|
|
|
|
## 7. File Change Summary
|
|
|
|
### Files Modified
|
|
|
|
1. **`frontend/src/components/__tests__/ProxyHostForm-dropdown-changes.test.tsx`**
|
|
- Lines 92, 104: Remove `headers: {}` from mock objects
|
|
- Lines 158, 202, 243, 281, 345: Add explicit types to `vi.fn()` calls
|
|
|
|
### Files NOT Changed
|
|
|
|
- All Go source files (no code changes needed)
|
|
- `go.mod` (version stays at 1.26)
|
|
- GolangCI-Lint config (no changes needed)
|
|
- Other TypeScript files (errors isolated to one test file)
|
|
|
|
---
|
|
|
|
## 8. Verification Commands
|
|
|
|
### Quick Verification
|
|
```bash
|
|
# 1. Check Go version
|
|
go version
|
|
|
|
# 2. Rebuild golangci-lint
|
|
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
|
|
|
# 3. Verify golangci-lint version
|
|
golangci-lint version | grep "go1.26"
|
|
|
|
# 4. Fix TypeScript errors (manual edits per Step 2)
|
|
|
|
# 5. Run type check
|
|
cd /projects/Charon/frontend && npm run type-check
|
|
|
|
# 6. Run full pre-commit
|
|
cd /projects/Charon
|
|
.github/skills/scripts/skill-runner.sh qa-precommit-all
|
|
```
|
|
|
|
### Expected Output
|
|
```
|
|
✅ golangci-lint has version X.X.X built with go1.26.x
|
|
✅ TypeScript type check: 0 errors
|
|
✅ Pre-commit hooks: All hooks passed (exit code 0)
|
|
```
|
|
|
|
---
|
|
|
|
## 9. Time Estimates
|
|
|
|
| Task | Time |
|
|
|------|------|
|
|
| Rebuild GolangCI-Lint | 2 min |
|
|
| Fix TypeScript errors (remove headers) | 3 min |
|
|
| Fix TypeScript errors (add mock types) | 5 min |
|
|
| Run verification | 5 min |
|
|
| **Total** | **~15 min** |
|
|
|
|
---
|
|
|
|
## 10. Next Steps After Completion
|
|
|
|
1. Commit fixes with message:
|
|
```
|
|
fix: resolve pre-commit blockers (golangci-lint + typescript)
|
|
|
|
- Rebuild golangci-lint with Go 1.26
|
|
- Remove invalid 'headers' property from SecurityHeaderProfile mocks
|
|
- Add explicit types to Vitest mock functions
|
|
|
|
Fixes 13 TypeScript errors in ProxyHostForm test
|
|
Resolves golangci-lint version mismatch
|
|
```
|
|
|
|
2. Run pre-commit again to confirm:
|
|
```bash
|
|
.github/skills/scripts/skill-runner.sh qa-precommit-all
|
|
```
|
|
|
|
3. Proceed with normal development workflow
|
|
|
|
---
|
|
|
|
## 11. Reference Links
|
|
|
|
- **Blocker Report:** `docs/reports/precommit_blockers.md`
|
|
- **SecurityHeaderProfile Type:** `frontend/src/api/securityHeaders.ts`
|
|
- **Test File:** `frontend/src/components/__tests__/ProxyHostForm-dropdown-changes.test.tsx`
|
|
- **GolangCI-Lint Docs:** https://golangci-lint.run/welcome/install/
|
|
|
|
---
|
|
|
|
**Plan Status:** ✅ Ready for Implementation
|
|
**Review Status:** Pending
|
|
**Implementation Agent:** Coding Agent
|