@sun-asterisk/sunlint
Version:
☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards
163 lines (137 loc) • 7.92 kB
JavaScript
/**
* CLI Program Definition
* Following Rule C005: Single responsibility - only handle CLI structure
*/
const { Command } = require('commander');
const { version } = require('../package.json');
function createCliProgram() {
const program = new Command();
program
.name('sunlint')
.description('☀️ Sun Lint - Coding Standards Checker | Multi-rule Quality & Security Analysis')
.version(version);
// Rule selection options
program
.option('-r, --rule <rule>', 'Run single rule (e.g., C019)')
.option('--rules <rules>', 'Run multiple rules (comma-separated, e.g., C019,C006,S005)')
.option('-a, --all', 'Run all available rules')
.option('-c, --category <category>', 'Run rules by category (quality,security,logging,naming)')
.option('--quality', 'Run all code quality rules')
.option('--security', 'Run all secure coding rules');
// TypeScript specific options (Phase 1 focus)
program
.option('--typescript', 'Enable TypeScript-specific analysis')
.option('--typescript-engine <engine>', 'TypeScript analysis engine (eslint,heuristic,hybrid)', 'heuristic')
.option('--ensure-deps', 'Ensure ESLint dependencies are installed');
// Input/Output options (v1.x: explicit --input required)
program
.option('-i, --input <path>', 'Input file or directory to analyze (REQUIRED)')
.option('-f, --format <format>', 'Output format (eslint,json,summary,table)', 'eslint')
.option('-o, --output <file>', 'Output file path')
.option('--output-summary <file>', 'Output summary report file path (JSON format for CI/CD)')
.option('--upload-report [url]', 'Upload summary report to API endpoint after analysis (default: Sun* Coding Standards API)')
.option('--config <file>', 'Configuration file path (default: auto-discover)');
// File targeting options
program
.option('--include <patterns>', 'Include file patterns (comma-separated globs)')
.option('--exclude <patterns>', 'Exclude file patterns (comma-separated globs)')
.option('--languages <languages>', 'Target specific languages (comma-separated: typescript,dart,kotlin)')
.option('--include-tests', 'Include test files in analysis (default: true)')
.option('--exclude-tests', 'Exclude test files from analysis')
.option('--only-source', 'Only analyze source files (exclude tests, configs, etc.)');
// CI/CD and Git integration options
program
.option('--changed-files', 'Only analyze files changed in current branch (git diff)')
.option('--staged-files', 'Only analyze staged files (git diff --cached)')
.option('--diff-base <ref>', 'Compare against specific git reference (e.g., origin/main)')
.option('--since <commit>', 'Only analyze files changed since specific commit')
.option('--pr-mode', 'Enable PR mode (changed files + baseline comparison)')
.option('--baseline <file>', 'Load baseline results to compare against')
.option('--save-baseline <file>', 'Save current results as baseline')
.option('--fail-on-new-violations', 'Exit with error only on new violations (not existing)');
// Performance options (SIMPLIFIED)
program
.option('--timeout <milliseconds>', 'Analysis timeout in milliseconds (default: auto)', '0')
.option('--max-files <count>', 'Maximum files to analyze (default: auto-detect)', '0')
.option('--performance <mode>', 'Performance mode: auto, fast, careful (default: auto)', 'auto');
// Advanced options
program
.option('--engine <engine>', 'Analysis engine (eslint,heuristic,auto)', 'auto')
.option('--dry-run', 'Show what would be analyzed without running')
.option('--verbose', 'Enable verbose logging')
.option('--quiet', 'Suppress non-error output')
.option('--debug', 'Enable debug mode')
.option('--ai', 'Enable AI-powered analysis')
.option('--no-ai', 'Force disable AI analysis')
.option('--max-semantic-files <number>', 'Symbol table file limit for TypeScript analysis (default: 1000, -1 for unlimited)')
.option('--list-engines', 'List available analysis engines');
// ESLint Integration options
program
.option('--eslint-integration', 'Enable ESLint integration (merge with existing ESLint config)')
.option('--no-eslint-integration', 'Disable ESLint integration')
.option('--eslint-merge-rules', 'Merge SunLint and user ESLint rules (default: true)')
.option('--eslint-preserve-config', 'Preserve user ESLint configuration (default: true)')
.option('--eslint-run-after', 'Run ESLint after SunLint (instead of merged execution)');
// Help examples
program.addHelpText('after', `
Examples:
$ sunlint --rule=C019 --input=src
$ sunlint --rule C019 --input src
$ sunlint --rules=C019,C006,S005 --input=src
$ sunlint --all --input=src
$ sunlint --quality --input=src
$ sunlint --security --input=src
$ sunlint --category=logging --input=src
File Targeting:
$ sunlint --all --include="src/**/*.ts" --exclude="**/*.test.*" --input=.
Performance (SIMPLIFIED):
$ sunlint --all --input=src --performance=auto # Auto-detect best settings
$ sunlint --all --input=src --performance=fast # Quick scan
$ sunlint --all --input=src --performance=careful # Thorough analysis
$ sunlint --all --input=src --timeout=60000 # Custom timeout (60s)
File Limits (when needed):
$ sunlint --all --input=src --max-files=500 # Limit total files analyzed
$ sunlint --all --input=src --max-semantic-files=200 # Limit TypeScript symbol table
$ sunlint --all --languages=typescript,dart --input=src
$ sunlint --typescript --exclude-tests --input=src
$ sunlint --all --only-source --include="src/**,lib/**" --input=.
TypeScript Analysis (Phase 1):
$ sunlint --typescript --input=src
$ sunlint --rule=C006 --typescript --input=src
$ sunlint --rules=C019,S005 --typescript --input=src
$ sunlint --typescript-engine=eslint --input=src
Version Strategy:
v1.x: ESLint-first with SunLint fallback (current)
v2.x: SunLint-first with ESLint integration (--eslint-integration)
Engine Configuration:
$ sunlint --all --input=src # Use config engine setting
$ sunlint --all --input=src --engine=eslint # Force ESLint engine
$ sunlint --all --input=src --engine=heuristic # Force Heuristic engine
CI/CD Integration:
$ sunlint --all --changed-files --format=summary --no-ai
$ sunlint --all --changed-files --diff-base=origin/main --fail-on-new-violations
$ sunlint --all --staged-files --format=summary
$ sunlint --all --pr-mode --diff-base=origin/main
$ sunlint --all --output-summary=report.json --upload-report
$ sunlint --all --output-summary=report.json --upload-report=https://custom-api.com/reports
ESLint Integration:
$ sunlint --typescript --eslint-integration --input=src
$ sunlint --all --eslint-integration --eslint-merge-rules --input=src
$ sunlint --all --eslint-integration --eslint-run-after --input=src
$ sunlint --typescript --eslint-integration --changed-files
Advanced File Targeting:
$ sunlint --all --include="src/**/*.ts,lib/**/*.dart" --exclude="**/*.generated.*" --input=.
$ sunlint --typescript --exclude="**/*.d.ts,**/*.test.*" --input=src
$ sunlint --languages=typescript,dart --include="src/**,packages/**" --input=.
$ sunlint --all --only-source --exclude-tests --languages=typescript --input=.
Large Project Optimization:
$ sunlint --all --input=. --max-semantic-files=500 # Conservative analysis
$ sunlint --all --input=. --max-semantic-files=2000 # Comprehensive analysis
$ sunlint --all --input=. --max-semantic-files=-1 # Unlimited (all files)
$ sunlint --all --input=. --max-semantic-files=0 # Disable semantic analysis
$ sunlint --all --changed-files --max-semantic-files=300 # Fast CI analysis
Sun* Engineering - Coding Standards Made Simple ☀️
`);
return program;
}
module.exports = { createCliProgram };