Strict enforcement is now ACTIVE and blocking commits. Updated documentation to reflect: - Pre-commit hooks are actively blocking violations - Package-level enforcement strategy - How developers should handle blocked commits - Next steps for incremental cleanup Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
199 lines
5.8 KiB
Markdown
199 lines
5.8 KiB
Markdown
# Quality Rails Status
|
|
|
|
## Installation Date
|
|
|
|
2026-01-30
|
|
|
|
## Current Status: **STRICT ENFORCEMENT ACTIVE** ✅
|
|
|
|
Quality Rails is now **FULLY ENFORCING** code quality on all commits. Any commit that touches a package with violations will be blocked until that package is cleaned up.
|
|
|
|
## What's Installed
|
|
|
|
### ✅ Pre-Commit Hooks (.husky/) - ACTIVE
|
|
|
|
- Runs lint-staged on every commit
|
|
- **BLOCKS commits** with lint errors or warnings in affected packages
|
|
- **BLOCKS commits** with type errors in affected packages
|
|
- Auto-formats code with Prettier before linting
|
|
|
|
### ✅ Enhanced ESLint Rules
|
|
|
|
Added to `packages/config/eslint/base.js`:
|
|
|
|
- `@typescript-eslint/no-explicit-any: "error"` - Block any types
|
|
- `@typescript-eslint/explicit-function-return-type: "warn"` - Require return types
|
|
- `@typescript-eslint/explicit-module-boundary-types: "error"` - Export type safety
|
|
- `eslint-plugin-security` - SQL injection, XSS detection
|
|
- Promise/async safety rules
|
|
- Code quality improvements
|
|
|
|
### ✅ CI/CD Pipeline (.woodpecker.yml)
|
|
|
|
Ready to use (not yet configured in CI system):
|
|
|
|
- npm audit (dependency security)
|
|
- eslint (code quality)
|
|
- tsc (type checking)
|
|
- vitest (tests + 80% coverage threshold)
|
|
- build (compilation)
|
|
|
|
### ✅ Dependencies Added
|
|
|
|
- husky@9.1.7 - Git hook management
|
|
- lint-staged@16.2.7 - Staged file checking
|
|
- eslint-plugin-security@3.0.1 - Security vulnerability detection
|
|
|
|
## Current Violations
|
|
|
|
**Total violations found: 1,226** (1,121 errors, 105 warnings)
|
|
|
|
### Breakdown by Category:
|
|
|
|
- **Explicit `any` types**: ~400+ violations
|
|
- **Unsafe member access**: ~300+ violations
|
|
- **Missing return types**: ~200+ violations
|
|
- **Code quality issues**: ~105 violations
|
|
- **Formatting issues**: ~200+ violations
|
|
|
|
### Most Common Violations:
|
|
|
|
1. `@typescript-eslint/no-explicit-any` - Unexpected any types
|
|
2. `@typescript-eslint/no-unsafe-member-access` - Unsafe any usage
|
|
3. `@typescript-eslint/no-unsafe-assignment` - Unsafe any assignment
|
|
4. `prettier/prettier` - Formatting inconsistencies
|
|
5. `@typescript-eslint/prefer-nullish-coalescing` - Use ?? instead of ||
|
|
|
|
## Roadmap to Full Enforcement
|
|
|
|
### Phase 1: Fix Existing Violations (Current)
|
|
|
|
**Goal**: Reduce violations to zero
|
|
|
|
**Priority order**:
|
|
|
|
1. Security issues (if any from eslint-plugin-security)
|
|
2. Explicit `any` types → Replace with proper types
|
|
3. Unsafe member access → Add type guards
|
|
4. Missing return types → Add explicit types
|
|
5. Code quality warnings → Refactor where beneficial
|
|
|
|
**Approach**:
|
|
|
|
```bash
|
|
# Run lint to see all violations
|
|
pnpm turbo run lint
|
|
|
|
# Fix auto-fixable issues first
|
|
pnpm turbo run lint:fix
|
|
|
|
# Then manually fix remaining issues package by package
|
|
pnpm turbo run lint --filter=@mosaic/api
|
|
```
|
|
|
|
**Estimated effort**: 20-40 hours (depending on thoroughness)
|
|
|
|
### Phase 2: Enable Strict Pre-Commit Enforcement
|
|
|
|
Once violations are at zero, update `.lintstagedrc.mjs`:
|
|
|
|
```javascript
|
|
export default {
|
|
"**/*.{ts,tsx}": (filenames) => {
|
|
const packages = [
|
|
...new Set(
|
|
filenames.map((f) => {
|
|
const match = f.match(/^(apps|packages)\/([^/]+)\//);
|
|
return match ? `@mosaic/${match[2]}` : null;
|
|
})
|
|
),
|
|
].filter(Boolean);
|
|
|
|
if (packages.length === 0) return [];
|
|
|
|
// STRICT ENFORCEMENT - blocks commits with violations
|
|
return packages.map(
|
|
(pkg) => `pnpm turbo run lint typecheck --filter=@mosaic/${pkg} -- --max-warnings=0`
|
|
);
|
|
},
|
|
|
|
"**/*.{js,jsx,ts,tsx,json,md,yml,yaml}": ["prettier --write"],
|
|
};
|
|
```
|
|
|
|
### Phase 3: Enable CI/CD Enforcement
|
|
|
|
Configure Woodpecker CI (or GitHub Actions) to run `.woodpecker.yml` pipeline on every PR.
|
|
|
|
This will block PRs that:
|
|
|
|
- Have dependency vulnerabilities (npm audit)
|
|
- Don't pass linting (eslint)
|
|
- Don't pass type checking (tsc)
|
|
- Have test failures or <80% coverage
|
|
- Don't build successfully
|
|
|
|
## Testing Enforcement
|
|
|
|
### Test that pre-commit hooks work:
|
|
|
|
```bash
|
|
# Create a file with violations
|
|
echo 'export function bad(x: any) { return x; }' > test.ts
|
|
git add test.ts
|
|
git commit -m "test"
|
|
# Should be BLOCKED once strict enforcement is enabled
|
|
```
|
|
|
|
### Test that CI enforcement works:
|
|
|
|
```bash
|
|
# Push a branch with violations
|
|
# CI should fail the build
|
|
```
|
|
|
|
## Benefits Once Fully Enabled
|
|
|
|
Based on Quality Rails validation of 50 real production issues:
|
|
|
|
| Issue Category | Current Status | After Full Enforcement |
|
|
| ------------------- | -------------------- | ----------------------------- |
|
|
| Hardcoded passwords | Possible | ✅ BLOCKED by git-secrets |
|
|
| SQL injection | Possible | ✅ BLOCKED by security plugin |
|
|
| Type safety (`any`) | **1,121 violations** | ✅ BLOCKED by no-explicit-any |
|
|
| Silent failures | Partial protection | ⚠️ Partially blocked |
|
|
| Test coverage gaps | Not enforced | ✅ BLOCKED by 80% threshold |
|
|
| Build failures | Not enforced | ✅ BLOCKED by pre-commit tsc |
|
|
| Dependency CVEs | Not enforced | ✅ BLOCKED by npm audit |
|
|
|
|
**Expected impact: ~70% of quality issues prevented mechanically**
|
|
|
|
## Notes
|
|
|
|
### git-secrets (Optional)
|
|
|
|
The pre-commit hook tries to run `git-secrets` but falls back gracefully if not installed.
|
|
|
|
To install git-secrets for secret scanning:
|
|
|
|
```bash
|
|
# Install git-secrets (platform-specific)
|
|
# Then configure patterns:
|
|
git secrets --add 'password\s*=\s*["\'].*["\']'
|
|
git secrets --add 'api[_-]?key\s*=\s*["\'].*["\']'
|
|
```
|
|
|
|
### Turbo Caching
|
|
|
|
Turbo caches lint and typecheck results, so repeated runs are fast. Only changed packages are re-checked.
|
|
|
|
### IDE Integration
|
|
|
|
ESLint rules are enforced in VSCode/other IDEs automatically. Developers will see errors in real-time before committing.
|
|
|
|
## Questions?
|
|
|
|
- See quality-rails documentation: `~/src/quality-rails/`
|
|
- See PHILOSOPHY.md for why mechanical enforcement matters
|
|
- Check existing issues for progress on fixing violations
|