@mathonsunday/dead-code-toolkit 0.1.0
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 +356 -0
- package/dist/analyzer.d.ts +23 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +173 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/checkers/knipChecker.d.ts +11 -0
- package/dist/checkers/knipChecker.d.ts.map +1 -0
- package/dist/checkers/knipChecker.js +226 -0
- package/dist/checkers/knipChecker.js.map +1 -0
- package/dist/checkers/typescriptChecker.d.ts +10 -0
- package/dist/checkers/typescriptChecker.d.ts.map +1 -0
- package/dist/checkers/typescriptChecker.js +174 -0
- package/dist/checkers/typescriptChecker.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +204 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/detectors.d.ts +29 -0
- package/dist/config/detectors.d.ts.map +1 -0
- package/dist/config/detectors.js +159 -0
- package/dist/config/detectors.js.map +1 -0
- package/dist/config/templates.d.ts +76 -0
- package/dist/config/templates.d.ts.map +1 -0
- package/dist/config/templates.js +191 -0
- package/dist/config/templates.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/reporters/jsonReporter.d.ts +68 -0
- package/dist/reporters/jsonReporter.d.ts.map +1 -0
- package/dist/reporters/jsonReporter.js +161 -0
- package/dist/reporters/jsonReporter.js.map +1 -0
- package/dist/setup/hookInstaller.d.ts +36 -0
- package/dist/setup/hookInstaller.d.ts.map +1 -0
- package/dist/setup/hookInstaller.js +196 -0
- package/dist/setup/hookInstaller.js.map +1 -0
- package/dist/setup/installer.d.ts +10 -0
- package/dist/setup/installer.d.ts.map +1 -0
- package/dist/setup/installer.js +156 -0
- package/dist/setup/installer.js.map +1 -0
- package/dist/setup/packageJsonUpdater.d.ts +54 -0
- package/dist/setup/packageJsonUpdater.d.ts.map +1 -0
- package/dist/setup/packageJsonUpdater.js +129 -0
- package/dist/setup/packageJsonUpdater.js.map +1 -0
- package/dist/src/analyzer.d.ts +23 -0
- package/dist/src/analyzer.d.ts.map +1 -0
- package/dist/src/analyzer.js +173 -0
- package/dist/src/analyzer.js.map +1 -0
- package/dist/src/checkers/knipChecker.d.ts +11 -0
- package/dist/src/checkers/knipChecker.d.ts.map +1 -0
- package/dist/src/checkers/knipChecker.js +226 -0
- package/dist/src/checkers/knipChecker.js.map +1 -0
- package/dist/src/checkers/typescriptChecker.d.ts +10 -0
- package/dist/src/checkers/typescriptChecker.d.ts.map +1 -0
- package/dist/src/checkers/typescriptChecker.js +174 -0
- package/dist/src/checkers/typescriptChecker.js.map +1 -0
- package/dist/src/config/detectors.d.ts +29 -0
- package/dist/src/config/detectors.d.ts.map +1 -0
- package/dist/src/config/detectors.js +159 -0
- package/dist/src/config/detectors.js.map +1 -0
- package/dist/src/config/templates.d.ts +76 -0
- package/dist/src/config/templates.d.ts.map +1 -0
- package/dist/src/config/templates.js +191 -0
- package/dist/src/config/templates.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/reporters/jsonReporter.d.ts +68 -0
- package/dist/src/reporters/jsonReporter.d.ts.map +1 -0
- package/dist/src/reporters/jsonReporter.js +161 -0
- package/dist/src/reporters/jsonReporter.js.map +1 -0
- package/dist/src/setup/hookInstaller.d.ts +36 -0
- package/dist/src/setup/hookInstaller.d.ts.map +1 -0
- package/dist/src/setup/hookInstaller.js +196 -0
- package/dist/src/setup/hookInstaller.js.map +1 -0
- package/dist/src/setup/installer.d.ts +10 -0
- package/dist/src/setup/installer.d.ts.map +1 -0
- package/dist/src/setup/installer.js +156 -0
- package/dist/src/setup/installer.js.map +1 -0
- package/dist/src/setup/packageJsonUpdater.d.ts +54 -0
- package/dist/src/setup/packageJsonUpdater.d.ts.map +1 -0
- package/dist/src/setup/packageJsonUpdater.js +129 -0
- package/dist/src/setup/packageJsonUpdater.js.map +1 -0
- package/dist/src/types.d.ts +177 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/types.d.ts +177 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG7D,YAAY,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,WAAW,EACX,SAAS,EACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main entry point for dead code toolkit
|
|
3
|
+
* Exports public API for programmatic usage
|
|
4
|
+
*/
|
|
5
|
+
// Core functions
|
|
6
|
+
export { analyzeDeadCode, fixFindings } from './analyzer.js';
|
|
7
|
+
// Reporters
|
|
8
|
+
export { createJSONReport, formatJSONReport, formatJSONReportCompact, createLLMSummary, } from './reporters/jsonReporter.js';
|
|
9
|
+
// Checkers (for advanced usage)
|
|
10
|
+
export { runKnipCheck } from './checkers/knipChecker.js';
|
|
11
|
+
export { runTypeScriptCheck } from './checkers/typescriptChecker.js';
|
|
12
|
+
// Setup functions
|
|
13
|
+
export { setupProject } from './setup/installer.js';
|
|
14
|
+
// Config utilities (for advanced usage)
|
|
15
|
+
export { detectProjectConfig, getEntryPoints, getProjectPatterns } from './config/detectors.js';
|
|
16
|
+
export { generateKnipConfig, generateESLintRules, generateTypeCoverageConfig, generateLintStagedConfig, generatePackageJsonScripts, } from './config/templates.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAiB7D,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,GAIjB,MAAM,6BAA6B,CAAC;AAErC,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,wCAAwC;AACxC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON reporter - formats analysis results as JSON for programmatic consumption
|
|
3
|
+
* Optimized for LLM interpretation
|
|
4
|
+
*/
|
|
5
|
+
import type { AnalysisResult } from '../types.js';
|
|
6
|
+
export interface JSONReport {
|
|
7
|
+
version: '1.0';
|
|
8
|
+
timestamp: string;
|
|
9
|
+
status: AnalysisResult['status'];
|
|
10
|
+
summary: {
|
|
11
|
+
totalIssues: number;
|
|
12
|
+
fixableIssues: number;
|
|
13
|
+
byCategory: Record<string, number>;
|
|
14
|
+
bySeverity: {
|
|
15
|
+
errors: number;
|
|
16
|
+
warnings: number;
|
|
17
|
+
info: number;
|
|
18
|
+
};
|
|
19
|
+
executionTimeMs: number;
|
|
20
|
+
};
|
|
21
|
+
findings: JSONFinding[];
|
|
22
|
+
recommendations: string[];
|
|
23
|
+
checksRun: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface JSONFinding {
|
|
26
|
+
id: string;
|
|
27
|
+
category: string;
|
|
28
|
+
severity: string;
|
|
29
|
+
file: string;
|
|
30
|
+
location?: {
|
|
31
|
+
line?: number;
|
|
32
|
+
column?: number;
|
|
33
|
+
};
|
|
34
|
+
message: string;
|
|
35
|
+
fixable: boolean;
|
|
36
|
+
suggestion?: string;
|
|
37
|
+
source: string;
|
|
38
|
+
rule?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Convert analysis result to JSON report
|
|
42
|
+
*/
|
|
43
|
+
export declare function createJSONReport(result: AnalysisResult): JSONReport;
|
|
44
|
+
/**
|
|
45
|
+
* Format JSON report as indented string for display
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatJSONReport(report: JSONReport): string;
|
|
48
|
+
/**
|
|
49
|
+
* Format JSON report as compact string for logging
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatJSONReportCompact(report: JSONReport): string;
|
|
52
|
+
/**
|
|
53
|
+
* Create a summary report for LLM consumption
|
|
54
|
+
*/
|
|
55
|
+
export interface LLMSummaryReport {
|
|
56
|
+
status: 'success' | 'failure' | 'partial' | 'clean';
|
|
57
|
+
totalIssues: number;
|
|
58
|
+
summary: string;
|
|
59
|
+
topIssues: Array<{
|
|
60
|
+
count: number;
|
|
61
|
+
type: string;
|
|
62
|
+
severity: string;
|
|
63
|
+
fixable: number;
|
|
64
|
+
}>;
|
|
65
|
+
actionItems: string[];
|
|
66
|
+
}
|
|
67
|
+
export declare function createLLMSummary(result: AnalysisResult): LLMSummaryReport;
|
|
68
|
+
//# sourceMappingURL=jsonReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonReporter.d.ts","sourceRoot":"","sources":["../../../src/reporters/jsonReporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,UAAU,EAAE;YACV,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAoBnE;AAoFD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA6CzE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON reporter - formats analysis results as JSON for programmatic consumption
|
|
3
|
+
* Optimized for LLM interpretation
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert analysis result to JSON report
|
|
7
|
+
*/
|
|
8
|
+
export function createJSONReport(result) {
|
|
9
|
+
return {
|
|
10
|
+
version: '1.0',
|
|
11
|
+
timestamp: new Date().toISOString(),
|
|
12
|
+
status: result.status,
|
|
13
|
+
summary: {
|
|
14
|
+
totalIssues: result.summary.totalIssues,
|
|
15
|
+
fixableIssues: result.summary.fixableCount,
|
|
16
|
+
byCategory: result.summary.byCategory,
|
|
17
|
+
bySeverity: {
|
|
18
|
+
errors: result.summary.errorCount,
|
|
19
|
+
warnings: result.summary.warningCount,
|
|
20
|
+
info: result.summary.infoCount,
|
|
21
|
+
},
|
|
22
|
+
executionTimeMs: result.executionTime,
|
|
23
|
+
},
|
|
24
|
+
findings: result.findings.map((f, i) => findingToJSON(f, i)),
|
|
25
|
+
recommendations: generateRecommendations(result),
|
|
26
|
+
checksRun: result.checkResults.map((c) => c.type),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Convert individual finding to JSON format
|
|
31
|
+
*/
|
|
32
|
+
function findingToJSON(finding, index) {
|
|
33
|
+
return {
|
|
34
|
+
id: `finding_${index}`,
|
|
35
|
+
category: finding.category,
|
|
36
|
+
severity: finding.severity,
|
|
37
|
+
file: finding.file,
|
|
38
|
+
location: finding.line
|
|
39
|
+
? {
|
|
40
|
+
line: finding.line,
|
|
41
|
+
column: finding.column,
|
|
42
|
+
}
|
|
43
|
+
: undefined,
|
|
44
|
+
message: finding.message,
|
|
45
|
+
fixable: finding.fixable,
|
|
46
|
+
suggestion: finding.suggestion,
|
|
47
|
+
source: finding.source,
|
|
48
|
+
rule: finding.rule,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate actionable recommendations based on findings
|
|
53
|
+
*/
|
|
54
|
+
function generateRecommendations(result) {
|
|
55
|
+
const recommendations = [];
|
|
56
|
+
// Count fixable vs unfixable
|
|
57
|
+
const fixable = result.findings.filter((f) => f.fixable).length;
|
|
58
|
+
const unfixable = result.findings.length - fixable;
|
|
59
|
+
// Fixable issues
|
|
60
|
+
if (fixable > 0) {
|
|
61
|
+
recommendations.push(`Run 'npm run dead-code:fix' to automatically fix ${fixable} issue${fixable !== 1 ? 's' : ''}`);
|
|
62
|
+
}
|
|
63
|
+
// Unused exports
|
|
64
|
+
const unusedExports = result.findings.filter((f) => f.category === 'unused-export');
|
|
65
|
+
if (unusedExports.length > 0) {
|
|
66
|
+
recommendations.push(`Review and remove ${unusedExports.length} unused export${unusedExports.length !== 1 ? 's' : ''} from your codebase`);
|
|
67
|
+
}
|
|
68
|
+
// Unused files
|
|
69
|
+
const unusedFiles = result.findings.filter((f) => f.category === 'unused-file');
|
|
70
|
+
if (unusedFiles.length > 0) {
|
|
71
|
+
recommendations.push(`Consider deleting ${unusedFiles.length} unused file${unusedFiles.length !== 1 ? 's' : ''} (manual review recommended)`);
|
|
72
|
+
}
|
|
73
|
+
// Type errors
|
|
74
|
+
const typeErrors = result.findings.filter((f) => f.severity === 'error');
|
|
75
|
+
if (typeErrors.length > 0) {
|
|
76
|
+
recommendations.push(`Fix ${typeErrors.length} type error${typeErrors.length !== 1 ? 's' : ''} to ensure code correctness`);
|
|
77
|
+
}
|
|
78
|
+
// Union/type issues
|
|
79
|
+
const unionIssues = result.findings.filter((f) => f.category === 'union-issue');
|
|
80
|
+
if (unionIssues.length > 0) {
|
|
81
|
+
recommendations.push(`Review ${unionIssues.length} union type issue${unionIssues.length !== 1 ? 's' : ''} for type safety`);
|
|
82
|
+
}
|
|
83
|
+
// General suggestions
|
|
84
|
+
if (unfixable > 0 && fixable === 0) {
|
|
85
|
+
recommendations.push(`Manually review and fix the ${unfixable} remaining issue${unfixable !== 1 ? 's' : ''}`);
|
|
86
|
+
}
|
|
87
|
+
if (result.findings.length === 0) {
|
|
88
|
+
recommendations.push('✓ No dead code detected! Your codebase is clean.');
|
|
89
|
+
}
|
|
90
|
+
return recommendations;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Format JSON report as indented string for display
|
|
94
|
+
*/
|
|
95
|
+
export function formatJSONReport(report) {
|
|
96
|
+
return JSON.stringify(report, null, 2);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Format JSON report as compact string for logging
|
|
100
|
+
*/
|
|
101
|
+
export function formatJSONReportCompact(report) {
|
|
102
|
+
return JSON.stringify(report);
|
|
103
|
+
}
|
|
104
|
+
export function createLLMSummary(result) {
|
|
105
|
+
const topIssues = [];
|
|
106
|
+
const categoryMap = new Map();
|
|
107
|
+
for (const finding of result.findings) {
|
|
108
|
+
const key = finding.category;
|
|
109
|
+
const current = categoryMap.get(key) || { count: 0, severities: new Set(), fixable: 0 };
|
|
110
|
+
current.count++;
|
|
111
|
+
current.severities.add(finding.severity);
|
|
112
|
+
if (finding.fixable)
|
|
113
|
+
current.fixable++;
|
|
114
|
+
categoryMap.set(key, current);
|
|
115
|
+
}
|
|
116
|
+
// Convert to top issues sorted by count
|
|
117
|
+
for (const [type, data] of categoryMap) {
|
|
118
|
+
const severity = Array.from(data.severities).sort()[0] || 'info';
|
|
119
|
+
topIssues.push({
|
|
120
|
+
count: data.count,
|
|
121
|
+
type,
|
|
122
|
+
severity,
|
|
123
|
+
fixable: data.fixable,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
topIssues.sort((a, b) => b.count - a.count);
|
|
127
|
+
// Generate readable summary
|
|
128
|
+
let status = 'clean';
|
|
129
|
+
if (result.findings.length === 0) {
|
|
130
|
+
status = 'success';
|
|
131
|
+
}
|
|
132
|
+
else if (result.findings.some((f) => f.severity === 'error')) {
|
|
133
|
+
status = 'failure';
|
|
134
|
+
}
|
|
135
|
+
else if (result.findings.length > 0) {
|
|
136
|
+
status = 'partial';
|
|
137
|
+
}
|
|
138
|
+
const summary = generateSummaryText(result, topIssues);
|
|
139
|
+
return {
|
|
140
|
+
status,
|
|
141
|
+
totalIssues: result.findings.length,
|
|
142
|
+
summary,
|
|
143
|
+
topIssues,
|
|
144
|
+
actionItems: generateRecommendations(result),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function generateSummaryText(result, topIssues) {
|
|
148
|
+
if (result.findings.length === 0) {
|
|
149
|
+
return 'Your codebase is clean with no dead code detected.';
|
|
150
|
+
}
|
|
151
|
+
const parts = [`Found ${result.findings.length} issues:`];
|
|
152
|
+
for (const issue of topIssues.slice(0, 3)) {
|
|
153
|
+
const fixStr = issue.fixable > 0 ? ` (${issue.fixable} auto-fixable)` : '';
|
|
154
|
+
parts.push(` • ${issue.count}x ${issue.type}${fixStr}`);
|
|
155
|
+
}
|
|
156
|
+
if (topIssues.length > 3) {
|
|
157
|
+
parts.push(` • ... and ${topIssues.length - 3} more categories`);
|
|
158
|
+
}
|
|
159
|
+
return parts.join('\n');
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=jsonReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonReporter.js","sourceRoot":"","sources":["../../../src/reporters/jsonReporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git hooks installer
|
|
3
|
+
* Sets up Husky and pre-commit hooks
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Check if Husky is installed
|
|
7
|
+
*/
|
|
8
|
+
export declare function isHuskyInstalled(projectRoot: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize Husky in a project
|
|
11
|
+
*/
|
|
12
|
+
export declare function initializeHusky(projectRoot: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Create .husky directory
|
|
15
|
+
*/
|
|
16
|
+
export declare function createHuskyDirectory(projectRoot: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Install pre-commit hook
|
|
19
|
+
*/
|
|
20
|
+
export declare function installPreCommitHook(projectRoot: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Install commit-msg hook for conventional commits
|
|
23
|
+
*/
|
|
24
|
+
export declare function installCommitMsgHook(projectRoot: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Create commitlint config
|
|
27
|
+
*/
|
|
28
|
+
export declare function createCommitLintConfig(projectRoot: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Full hook setup
|
|
31
|
+
*/
|
|
32
|
+
export declare function setupAllHooks(projectRoot: string): {
|
|
33
|
+
success: boolean;
|
|
34
|
+
errors: string[];
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=hookInstaller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hookInstaller.d.ts","sourceRoot":"","sources":["../../../src/setup/hookInstaller.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgB7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAuB5D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CA8BjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CA8BjE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CA8CnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA0BA"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git hooks installer
|
|
3
|
+
* Sets up Husky and pre-commit hooks
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, mkdirSync, writeFileSync, chmodSync, readFileSync } from 'fs';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { resolve } from 'path';
|
|
8
|
+
import { generatePreCommitHook } from '../config/templates.js';
|
|
9
|
+
/**
|
|
10
|
+
* Check if Husky is installed
|
|
11
|
+
*/
|
|
12
|
+
export function isHuskyInstalled(projectRoot) {
|
|
13
|
+
try {
|
|
14
|
+
// Check if husky is in package.json or node_modules
|
|
15
|
+
const packageJsonPath = resolve(projectRoot, 'package.json');
|
|
16
|
+
if (existsSync(packageJsonPath)) {
|
|
17
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
18
|
+
return !!(packageJson.devDependencies?.husky ||
|
|
19
|
+
packageJson.dependencies?.husky ||
|
|
20
|
+
existsSync(resolve(projectRoot, 'node_modules/husky')));
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize Husky in a project
|
|
30
|
+
*/
|
|
31
|
+
export function initializeHusky(projectRoot) {
|
|
32
|
+
try {
|
|
33
|
+
if (!isHuskyInstalled(projectRoot)) {
|
|
34
|
+
console.log('[Hook Installer] Installing Husky...');
|
|
35
|
+
execSync('npx husky install', {
|
|
36
|
+
cwd: projectRoot,
|
|
37
|
+
stdio: 'inherit',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.log('[Hook Installer] Husky already installed');
|
|
42
|
+
// Run husky install to ensure hooks are set up
|
|
43
|
+
execSync('npx husky install', {
|
|
44
|
+
cwd: projectRoot,
|
|
45
|
+
stdio: 'ignore',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(`[Hook Installer] Failed to initialize Husky: ${error instanceof Error ? error.message : String(error)}`);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create .husky directory
|
|
57
|
+
*/
|
|
58
|
+
export function createHuskyDirectory(projectRoot) {
|
|
59
|
+
const huskyDir = resolve(projectRoot, '.husky');
|
|
60
|
+
if (!existsSync(huskyDir)) {
|
|
61
|
+
mkdirSync(huskyDir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
return huskyDir;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Install pre-commit hook
|
|
67
|
+
*/
|
|
68
|
+
export function installPreCommitHook(projectRoot) {
|
|
69
|
+
try {
|
|
70
|
+
const huskyDir = createHuskyDirectory(projectRoot);
|
|
71
|
+
const preCommitPath = resolve(huskyDir, 'pre-commit');
|
|
72
|
+
// Check if hook already exists
|
|
73
|
+
let existingContent = '';
|
|
74
|
+
if (existsSync(preCommitPath)) {
|
|
75
|
+
existingContent = readFileSync(preCommitPath, 'utf-8');
|
|
76
|
+
}
|
|
77
|
+
// Generate new hook content
|
|
78
|
+
const newContent = generatePreCommitHook();
|
|
79
|
+
// Only write if different
|
|
80
|
+
if (existingContent !== newContent) {
|
|
81
|
+
writeFileSync(preCommitPath, newContent);
|
|
82
|
+
chmodSync(preCommitPath, 0o755); // Make executable
|
|
83
|
+
console.log('[Hook Installer] Created .husky/pre-commit');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log('[Hook Installer] .husky/pre-commit already up to date');
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error(`[Hook Installer] Failed to install pre-commit hook: ${error instanceof Error ? error.message : String(error)}`);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Install commit-msg hook for conventional commits
|
|
97
|
+
*/
|
|
98
|
+
export function installCommitMsgHook(projectRoot) {
|
|
99
|
+
try {
|
|
100
|
+
const huskyDir = createHuskyDirectory(projectRoot);
|
|
101
|
+
const commitMsgPath = resolve(huskyDir, 'commit-msg');
|
|
102
|
+
const content = `#!/bin/sh
|
|
103
|
+
# Commit message validation via commitlint
|
|
104
|
+
npx --no-install commitlint --edit "$1"`;
|
|
105
|
+
// Check if exists and is the same
|
|
106
|
+
let existingContent = '';
|
|
107
|
+
if (existsSync(commitMsgPath)) {
|
|
108
|
+
existingContent = readFileSync(commitMsgPath, 'utf-8');
|
|
109
|
+
}
|
|
110
|
+
if (existingContent !== content) {
|
|
111
|
+
writeFileSync(commitMsgPath, content);
|
|
112
|
+
chmodSync(commitMsgPath, 0o755);
|
|
113
|
+
console.log('[Hook Installer] Created .husky/commit-msg');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
console.log('[Hook Installer] .husky/commit-msg already up to date');
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error(`[Hook Installer] Failed to install commit-msg hook: ${error instanceof Error ? error.message : String(error)}`);
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Create commitlint config
|
|
127
|
+
*/
|
|
128
|
+
export function createCommitLintConfig(projectRoot) {
|
|
129
|
+
try {
|
|
130
|
+
const configPath = resolve(projectRoot, 'commitlint.config.js');
|
|
131
|
+
// Check if already exists
|
|
132
|
+
if (existsSync(configPath)) {
|
|
133
|
+
console.log('[Hook Installer] commitlint.config.js already exists');
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
const content = `module.exports = {
|
|
137
|
+
extends: ['@commitlint/config-conventional'],
|
|
138
|
+
rules: {
|
|
139
|
+
'type-enum': [
|
|
140
|
+
2,
|
|
141
|
+
'always',
|
|
142
|
+
[
|
|
143
|
+
'feat',
|
|
144
|
+
'fix',
|
|
145
|
+
'refactor',
|
|
146
|
+
'perf',
|
|
147
|
+
'test',
|
|
148
|
+
'docs',
|
|
149
|
+
'chore',
|
|
150
|
+
'style',
|
|
151
|
+
'ci',
|
|
152
|
+
'revert',
|
|
153
|
+
],
|
|
154
|
+
],
|
|
155
|
+
'type-case': [2, 'always', 'lowerCase'],
|
|
156
|
+
'subject-case': [2, 'always', 'lowerCase'],
|
|
157
|
+
'subject-full-stop': [2, 'never', '.'],
|
|
158
|
+
'subject-empty': [2, 'never'],
|
|
159
|
+
'header-max-length': [2, 'always', 72],
|
|
160
|
+
},
|
|
161
|
+
};`;
|
|
162
|
+
writeFileSync(configPath, content);
|
|
163
|
+
console.log('[Hook Installer] Created commitlint.config.js');
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.error(`[Hook Installer] Failed to create commitlint config: ${error instanceof Error ? error.message : String(error)}`);
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Full hook setup
|
|
173
|
+
*/
|
|
174
|
+
export function setupAllHooks(projectRoot) {
|
|
175
|
+
const errors = [];
|
|
176
|
+
// Initialize Husky
|
|
177
|
+
if (!initializeHusky(projectRoot)) {
|
|
178
|
+
errors.push('Failed to initialize Husky');
|
|
179
|
+
}
|
|
180
|
+
// Install hooks
|
|
181
|
+
if (!installPreCommitHook(projectRoot)) {
|
|
182
|
+
errors.push('Failed to install pre-commit hook');
|
|
183
|
+
}
|
|
184
|
+
if (!installCommitMsgHook(projectRoot)) {
|
|
185
|
+
errors.push('Failed to install commit-msg hook');
|
|
186
|
+
}
|
|
187
|
+
// Create config
|
|
188
|
+
if (!createCommitLintConfig(projectRoot)) {
|
|
189
|
+
errors.push('Failed to create commitlint config');
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
success: errors.length === 0,
|
|
193
|
+
errors,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=hookInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hookInstaller.js","sourceRoot":"","sources":["../../../src/setup/hookInstaller.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,oDAAoD;QACpD,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC7D,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,CAAC,CACP,WAAW,CAAC,eAAe,EAAE,KAAK;gBAClC,WAAW,CAAC,YAAY,EAAE,KAAK;gBAC/B,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CACvD,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,IAAI,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,QAAQ,CAAC,mBAAmB,EAAE;gBAC5B,GAAG,EAAE,WAAW;gBAChB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,+CAA+C;YAC/C,QAAQ,CAAC,mBAAmB,EAAE;gBAC5B,GAAG,EAAE,WAAW;gBAChB,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,gDAAgD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzG,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEhD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEtD,+BAA+B;QAC/B,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,eAAe,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;QAE3C,0BAA0B;QAC1B,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;YACnC,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACzC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB;YACnD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,uDAAuD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChH,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG;;wCAEoB,CAAC;QAErC,kCAAkC;QAClC,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,eAAe,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;YAChC,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACtC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,uDAAuD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChH,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;QAEhE,0BAA0B;QAC1B,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;GAyBjB,CAAC;QAEA,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,wDAAwD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjH,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAI/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,mBAAmB;IACnB,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC5B,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main setup orchestrator
|
|
3
|
+
* Coordinates all setup tasks (configs, dependencies, hooks)
|
|
4
|
+
*/
|
|
5
|
+
import type { SetupOptions, SetupResult } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Main setup function
|
|
8
|
+
*/
|
|
9
|
+
export declare function setupProject(options: SetupOptions): Promise<SetupResult>;
|
|
10
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/setup/installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU7D;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2E9E"}
|