mcp-ai-agent-guidelines 0.7.2 → 0.7.4
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 +236 -9
- package/dist/index.js +487 -5
- package/dist/index.js.map +1 -1
- package/dist/prompts/index.d.ts +18 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +127 -492
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/structured.d.ts.map +1 -1
- package/dist/resources/structured.js +410 -0
- package/dist/resources/structured.js.map +1 -1
- package/dist/schemas/flow-tool-schemas.d.ts +167 -0
- package/dist/schemas/flow-tool-schemas.d.ts.map +1 -0
- package/dist/schemas/flow-tool-schemas.js +149 -0
- package/dist/schemas/flow-tool-schemas.js.map +1 -0
- package/dist/tools/bridge/index.d.ts +83 -0
- package/dist/tools/bridge/index.d.ts.map +1 -0
- package/dist/tools/bridge/index.js +85 -0
- package/dist/tools/bridge/index.js.map +1 -0
- package/dist/tools/bridge/project-onboarding-bridge.d.ts +54 -0
- package/dist/tools/bridge/project-onboarding-bridge.d.ts.map +1 -0
- package/dist/tools/bridge/project-onboarding-bridge.js +220 -0
- package/dist/tools/bridge/project-onboarding-bridge.js.map +1 -0
- package/dist/tools/bridge/semantic-analyzer-bridge.d.ts +47 -0
- package/dist/tools/bridge/semantic-analyzer-bridge.d.ts.map +1 -0
- package/dist/tools/bridge/semantic-analyzer-bridge.js +174 -0
- package/dist/tools/bridge/semantic-analyzer-bridge.js.map +1 -0
- package/dist/tools/clean-code-scorer.d.ts +7 -0
- package/dist/tools/clean-code-scorer.d.ts.map +1 -0
- package/dist/tools/clean-code-scorer.js +359 -0
- package/dist/tools/clean-code-scorer.js.map +1 -0
- package/dist/tools/code-hygiene-analyzer.js +181 -9
- package/dist/tools/code-hygiene-analyzer.js.map +1 -1
- package/dist/tools/config/guidelines-config.d.ts +2 -14
- package/dist/tools/config/guidelines-config.d.ts.map +1 -1
- package/dist/tools/config/guidelines-config.js +45 -6
- package/dist/tools/config/guidelines-config.js.map +1 -1
- package/dist/tools/config/model-config.d.ts +2 -23
- package/dist/tools/config/model-config.d.ts.map +1 -1
- package/dist/tools/config/model-config.js.map +1 -1
- package/dist/tools/config/types/guidelines.types.d.ts +15 -0
- package/dist/tools/config/types/guidelines.types.d.ts.map +1 -0
- package/dist/tools/config/types/guidelines.types.js +3 -0
- package/dist/tools/config/types/guidelines.types.js.map +1 -0
- package/dist/tools/config/types/index.d.ts +3 -0
- package/dist/tools/config/types/index.d.ts.map +1 -0
- package/dist/tools/config/types/index.js +3 -0
- package/dist/tools/config/types/index.js.map +1 -0
- package/dist/tools/config/types/model.types.d.ts +24 -0
- package/dist/tools/config/types/model.types.d.ts.map +1 -0
- package/dist/tools/config/types/model.types.js +3 -0
- package/dist/tools/config/types/model.types.js.map +1 -0
- package/dist/tools/design/adr-generator.d.ts +1 -1
- package/dist/tools/design/adr-generator.d.ts.map +1 -1
- package/dist/tools/design/adr-generator.js +5 -1
- package/dist/tools/design/adr-generator.js.map +1 -1
- package/dist/tools/design/confirmation-module.d.ts +1 -1
- package/dist/tools/design/confirmation-module.d.ts.map +1 -1
- package/dist/tools/design/confirmation-module.js +2 -0
- package/dist/tools/design/confirmation-module.js.map +1 -1
- package/dist/tools/design/confirmation-prompt-builder.d.ts +1 -1
- package/dist/tools/design/confirmation-prompt-builder.d.ts.map +1 -1
- package/dist/tools/design/confirmation-prompt-builder.js +5 -1
- package/dist/tools/design/confirmation-prompt-builder.js.map +1 -1
- package/dist/tools/design/constraint-consistency-enforcer.d.ts +1 -1
- package/dist/tools/design/constraint-consistency-enforcer.d.ts.map +1 -1
- package/dist/tools/design/constraint-consistency-enforcer.js +6 -1
- package/dist/tools/design/constraint-consistency-enforcer.js.map +1 -1
- package/dist/tools/design/constraint-manager.d.ts +9 -9
- package/dist/tools/design/constraint-manager.d.ts.map +1 -1
- package/dist/tools/design/coverage-enforcer.d.ts +1 -1
- package/dist/tools/design/coverage-enforcer.d.ts.map +1 -1
- package/dist/tools/design/cross-session-consistency-enforcer.d.ts +1 -1
- package/dist/tools/design/cross-session-consistency-enforcer.d.ts.map +1 -1
- package/dist/tools/design/design-assistant.d.ts +1 -15
- package/dist/tools/design/design-assistant.d.ts.map +1 -1
- package/dist/tools/design/design-assistant.js +29 -853
- package/dist/tools/design/design-assistant.js.map +1 -1
- package/dist/tools/design/design-phase-workflow.d.ts +1 -1
- package/dist/tools/design/design-phase-workflow.d.ts.map +1 -1
- package/dist/tools/design/design-phase-workflow.js +15 -8
- package/dist/tools/design/design-phase-workflow.js.map +1 -1
- package/dist/tools/design/index.d.ts +1 -1
- package/dist/tools/design/index.d.ts.map +1 -1
- package/dist/tools/design/methodology-selector.d.ts +1 -1
- package/dist/tools/design/methodology-selector.d.ts.map +1 -1
- package/dist/tools/design/pivot-module.d.ts +1 -1
- package/dist/tools/design/pivot-module.d.ts.map +1 -1
- package/dist/tools/design/roadmap-generator.d.ts +1 -1
- package/dist/tools/design/roadmap-generator.d.ts.map +1 -1
- package/dist/tools/design/roadmap-generator.js.map +1 -1
- package/dist/tools/design/services/additional-operations.service.d.ts +23 -0
- package/dist/tools/design/services/additional-operations.service.d.ts.map +1 -0
- package/dist/tools/design/services/additional-operations.service.js +215 -0
- package/dist/tools/design/services/additional-operations.service.js.map +1 -0
- package/dist/tools/design/services/artifact-generation.service.d.ts +19 -0
- package/dist/tools/design/services/artifact-generation.service.d.ts.map +1 -0
- package/dist/tools/design/services/artifact-generation.service.js +171 -0
- package/dist/tools/design/services/artifact-generation.service.js.map +1 -0
- package/dist/tools/design/services/consistency.service.d.ts +24 -0
- package/dist/tools/design/services/consistency.service.d.ts.map +1 -0
- package/dist/tools/design/services/consistency.service.js +196 -0
- package/dist/tools/design/services/consistency.service.js.map +1 -0
- package/dist/tools/design/services/index.d.ts +7 -0
- package/dist/tools/design/services/index.d.ts.map +1 -0
- package/dist/tools/design/services/index.js +9 -0
- package/dist/tools/design/services/index.js.map +1 -0
- package/dist/tools/design/services/phase-management.service.d.ts +25 -0
- package/dist/tools/design/services/phase-management.service.d.ts.map +1 -0
- package/dist/tools/design/services/phase-management.service.js +133 -0
- package/dist/tools/design/services/phase-management.service.js.map +1 -0
- package/dist/tools/design/services/session-management.service.d.ts +23 -0
- package/dist/tools/design/services/session-management.service.d.ts.map +1 -0
- package/dist/tools/design/services/session-management.service.js +190 -0
- package/dist/tools/design/services/session-management.service.js.map +1 -0
- package/dist/tools/design/spec-generator.d.ts +1 -1
- package/dist/tools/design/spec-generator.d.ts.map +1 -1
- package/dist/tools/design/spec-generator.js +3 -3
- package/dist/tools/design/spec-generator.js.map +1 -1
- package/dist/tools/design/strategic-pivot-prompt-builder.d.ts +1 -1
- package/dist/tools/design/strategic-pivot-prompt-builder.d.ts.map +1 -1
- package/dist/tools/design/types/artifact.types.d.ts +16 -0
- package/dist/tools/design/types/artifact.types.d.ts.map +1 -0
- package/dist/tools/design/types/artifact.types.js +3 -0
- package/dist/tools/design/types/artifact.types.js.map +1 -0
- package/dist/tools/design/types/common.types.d.ts +8 -0
- package/dist/tools/design/types/common.types.d.ts.map +1 -0
- package/dist/tools/design/types/common.types.js +3 -0
- package/dist/tools/design/types/common.types.js.map +1 -0
- package/dist/tools/design/types/consistency.types.d.ts +130 -0
- package/dist/tools/design/types/consistency.types.d.ts.map +1 -0
- package/dist/tools/design/types/consistency.types.js +3 -0
- package/dist/tools/design/types/consistency.types.js.map +1 -0
- package/dist/tools/design/types/constraint.types.d.ts +53 -0
- package/dist/tools/design/types/constraint.types.d.ts.map +1 -0
- package/dist/tools/design/types/constraint.types.js +3 -0
- package/dist/tools/design/types/constraint.types.js.map +1 -0
- package/dist/tools/design/types/coverage.types.d.ts +59 -0
- package/dist/tools/design/types/coverage.types.d.ts.map +1 -0
- package/dist/tools/design/types/coverage.types.js +3 -0
- package/dist/tools/design/types/coverage.types.js.map +1 -0
- package/dist/tools/design/types/index.d.ts +9 -0
- package/dist/tools/design/types/index.d.ts.map +1 -0
- package/dist/tools/design/types/index.js +4 -0
- package/dist/tools/design/types/index.js.map +1 -0
- package/dist/tools/design/types/methodology.types.d.ts +53 -0
- package/dist/tools/design/types/methodology.types.d.ts.map +1 -0
- package/dist/tools/design/types/methodology.types.js +3 -0
- package/dist/tools/design/types/methodology.types.js.map +1 -0
- package/dist/tools/design/types/pivot.types.d.ts +56 -0
- package/dist/tools/design/types/pivot.types.d.ts.map +1 -0
- package/dist/tools/design/types/pivot.types.js +3 -0
- package/dist/tools/design/types/pivot.types.js.map +1 -0
- package/dist/tools/design/types/session.types.d.ts +50 -0
- package/dist/tools/design/types/session.types.d.ts.map +1 -0
- package/dist/tools/design/types/session.types.js +3 -0
- package/dist/tools/design/types/session.types.js.map +1 -0
- package/dist/tools/design/types.d.ts +18 -401
- package/dist/tools/design/types.d.ts.map +1 -1
- package/dist/tools/design/types.js +17 -1
- package/dist/tools/design/types.js.map +1 -1
- package/dist/tools/guidelines-validator.js +3 -3
- package/dist/tools/mermaid-diagram-generator.d.ts.map +1 -1
- package/dist/tools/mermaid-diagram-generator.js +712 -58
- package/dist/tools/mermaid-diagram-generator.js.map +1 -1
- package/dist/tools/mode-switcher.d.ts +21 -0
- package/dist/tools/mode-switcher.d.ts.map +1 -0
- package/dist/tools/mode-switcher.js +383 -0
- package/dist/tools/mode-switcher.js.map +1 -0
- package/dist/tools/project-onboarding.d.ts +7 -0
- package/dist/tools/project-onboarding.d.ts.map +1 -0
- package/dist/tools/project-onboarding.js +344 -0
- package/dist/tools/project-onboarding.js.map +1 -0
- package/dist/tools/prompt/architecture-design-prompt-builder.d.ts +7 -0
- package/dist/tools/prompt/architecture-design-prompt-builder.d.ts.map +1 -0
- package/dist/tools/prompt/architecture-design-prompt-builder.js +143 -0
- package/dist/tools/prompt/architecture-design-prompt-builder.js.map +1 -0
- package/dist/tools/prompt/code-analysis-prompt-builder.d.ts +7 -0
- package/dist/tools/prompt/code-analysis-prompt-builder.d.ts.map +1 -0
- package/dist/tools/prompt/code-analysis-prompt-builder.js +292 -0
- package/dist/tools/prompt/code-analysis-prompt-builder.js.map +1 -0
- package/dist/tools/prompt/debugging-assistant-prompt-builder.d.ts +7 -0
- package/dist/tools/prompt/debugging-assistant-prompt-builder.d.ts.map +1 -0
- package/dist/tools/prompt/debugging-assistant-prompt-builder.js +360 -0
- package/dist/tools/prompt/debugging-assistant-prompt-builder.js.map +1 -0
- package/dist/tools/prompt/documentation-generator-prompt-builder.d.ts +7 -0
- package/dist/tools/prompt/documentation-generator-prompt-builder.d.ts.map +1 -0
- package/dist/tools/prompt/documentation-generator-prompt-builder.js +152 -0
- package/dist/tools/prompt/documentation-generator-prompt-builder.js.map +1 -0
- package/dist/tools/prompt/domain-neutral-prompt-builder.d.ts +39 -39
- package/dist/tools/prompt/hierarchical-prompt-builder.d.ts +20 -20
- package/dist/tools/prompt/hierarchical-prompt-builder.d.ts.map +1 -1
- package/dist/tools/prompt/hierarchical-prompt-builder.js +275 -17
- package/dist/tools/prompt/hierarchical-prompt-builder.js.map +1 -1
- package/dist/tools/prompt/hierarchy-level-selector.d.ts +7 -0
- package/dist/tools/prompt/hierarchy-level-selector.d.ts.map +1 -0
- package/dist/tools/prompt/hierarchy-level-selector.js +256 -0
- package/dist/tools/prompt/hierarchy-level-selector.js.map +1 -0
- package/dist/tools/prompt/prompt-chaining-builder.d.ts +29 -0
- package/dist/tools/prompt/prompt-chaining-builder.d.ts.map +1 -0
- package/dist/tools/prompt/prompt-chaining-builder.js +212 -0
- package/dist/tools/prompt/prompt-chaining-builder.js.map +1 -0
- package/dist/tools/prompt/prompt-flow-builder.d.ts +24 -0
- package/dist/tools/prompt/prompt-flow-builder.d.ts.map +1 -0
- package/dist/tools/prompt/prompt-flow-builder.js +426 -0
- package/dist/tools/prompt/prompt-flow-builder.js.map +1 -0
- package/dist/tools/prompt/prompting-hierarchy-evaluator.d.ts +13 -0
- package/dist/tools/prompt/prompting-hierarchy-evaluator.d.ts.map +1 -0
- package/dist/tools/prompt/prompting-hierarchy-evaluator.js +372 -0
- package/dist/tools/prompt/prompting-hierarchy-evaluator.js.map +1 -0
- package/dist/tools/prompt/spark-prompt-builder.d.ts +54 -54
- package/dist/tools/prompt/types/hierarchy.types.d.ts +42 -0
- package/dist/tools/prompt/types/hierarchy.types.d.ts.map +1 -0
- package/dist/tools/prompt/types/hierarchy.types.js +23 -0
- package/dist/tools/prompt/types/hierarchy.types.js.map +1 -0
- package/dist/tools/prompt/types/index.d.ts +2 -0
- package/dist/tools/prompt/types/index.d.ts.map +1 -0
- package/dist/tools/prompt/types/index.js +3 -0
- package/dist/tools/prompt/types/index.js.map +1 -0
- package/dist/tools/semantic-code-analyzer.d.ts +7 -0
- package/dist/tools/semantic-code-analyzer.d.ts.map +1 -0
- package/dist/tools/semantic-code-analyzer.js +380 -0
- package/dist/tools/semantic-code-analyzer.js.map +1 -0
- package/dist/tools/shared/errors.d.ts +101 -0
- package/dist/tools/shared/errors.d.ts.map +1 -0
- package/dist/tools/shared/errors.js +176 -0
- package/dist/tools/shared/errors.js.map +1 -0
- package/dist/tools/shared/logger.d.ts +40 -0
- package/dist/tools/shared/logger.d.ts.map +1 -0
- package/dist/tools/shared/logger.js +53 -0
- package/dist/tools/shared/logger.js.map +1 -0
- package/dist/tools/shared/prompt-sections.d.ts +3 -7
- package/dist/tools/shared/prompt-sections.d.ts.map +1 -1
- package/dist/tools/shared/prompt-sections.js +2 -26
- package/dist/tools/shared/prompt-sections.js.map +1 -1
- package/dist/tools/shared/prompt-utils.d.ts +2 -6
- package/dist/tools/shared/prompt-utils.d.ts.map +1 -1
- package/dist/tools/shared/prompt-utils.js.map +1 -1
- package/dist/tools/shared/types/index.d.ts +3 -0
- package/dist/tools/shared/types/index.d.ts.map +1 -0
- package/dist/tools/shared/types/index.js +3 -0
- package/dist/tools/shared/types/index.js.map +1 -0
- package/dist/tools/shared/types/prompt-sections.types.d.ts +8 -0
- package/dist/tools/shared/types/prompt-sections.types.d.ts.map +1 -0
- package/dist/tools/shared/types/prompt-sections.types.js +28 -0
- package/dist/tools/shared/types/prompt-sections.types.js.map +1 -0
- package/dist/tools/shared/types/prompt-utils.types.d.ts +7 -0
- package/dist/tools/shared/types/prompt-utils.types.d.ts.map +1 -0
- package/dist/tools/shared/types/prompt-utils.types.js +3 -0
- package/dist/tools/shared/types/prompt-utils.types.js.map +1 -0
- package/dist/tools/sprint-timeline-calculator.d.ts.map +1 -1
- package/dist/tools/sprint-timeline-calculator.js +134 -28
- package/dist/tools/sprint-timeline-calculator.js.map +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { buildReferencesSection } from "./shared/prompt-utils.js";
|
|
3
|
+
const CleanCodeScorerSchema = z.object({
|
|
4
|
+
projectPath: z.string().optional(),
|
|
5
|
+
codeContent: z.string().optional(),
|
|
6
|
+
language: z.string().optional(),
|
|
7
|
+
framework: z.string().optional(),
|
|
8
|
+
coverageMetrics: z
|
|
9
|
+
.object({
|
|
10
|
+
statements: z.number().min(0).max(100).optional(),
|
|
11
|
+
branches: z.number().min(0).max(100).optional(),
|
|
12
|
+
functions: z.number().min(0).max(100).optional(),
|
|
13
|
+
lines: z.number().min(0).max(100).optional(),
|
|
14
|
+
})
|
|
15
|
+
.optional(),
|
|
16
|
+
includeReferences: z.boolean().optional().default(true),
|
|
17
|
+
includeMetadata: z.boolean().optional().default(true),
|
|
18
|
+
inputFile: z.string().optional(),
|
|
19
|
+
});
|
|
20
|
+
export async function cleanCodeScorer(args) {
|
|
21
|
+
const input = CleanCodeScorerSchema.parse(args);
|
|
22
|
+
const scoreResult = calculateCleanCodeScore(input);
|
|
23
|
+
const references = input.includeReferences
|
|
24
|
+
? buildReferencesSection([
|
|
25
|
+
"Clean Code principles: https://www.freecodecamp.org/news/clean-coding-for-beginners/",
|
|
26
|
+
"Code quality metrics: https://docs.sonarqube.org/latest/user-guide/metric-definitions/",
|
|
27
|
+
"Test coverage best practices: https://martinfowler.com/bliki/TestCoverage.html",
|
|
28
|
+
"TypeScript best practices: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html",
|
|
29
|
+
])
|
|
30
|
+
: undefined;
|
|
31
|
+
const metadata = input.includeMetadata
|
|
32
|
+
? [
|
|
33
|
+
"### Metadata",
|
|
34
|
+
`- Updated: ${new Date().toISOString().slice(0, 10)}`,
|
|
35
|
+
"- Source tool: mcp_ai-agent-guid_clean-code-scorer",
|
|
36
|
+
input.inputFile ? `- Input file: ${input.inputFile}` : undefined,
|
|
37
|
+
]
|
|
38
|
+
.filter(Boolean)
|
|
39
|
+
.join("\n")
|
|
40
|
+
: undefined;
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: "text",
|
|
45
|
+
text: `## 🏆 Clean Code Score Report
|
|
46
|
+
|
|
47
|
+
${metadata ? `${metadata}\n` : ""}
|
|
48
|
+
### 📊 Overall Score
|
|
49
|
+
**${scoreResult.overallScore}/100** - ${scoreResult.scoreDescription}
|
|
50
|
+
|
|
51
|
+
${generateScoreBar(scoreResult.overallScore)}
|
|
52
|
+
|
|
53
|
+
### 📈 Category Breakdown
|
|
54
|
+
|
|
55
|
+
${Object.entries(scoreResult.categories)
|
|
56
|
+
.map(([category, data]) => {
|
|
57
|
+
const categoryName = category
|
|
58
|
+
.replace(/([A-Z])/g, " $1")
|
|
59
|
+
.replace(/^./, (str) => str.toUpperCase());
|
|
60
|
+
const percentage = (data.score / data.weight) * 100;
|
|
61
|
+
const status = getScoreStatus(percentage);
|
|
62
|
+
return `#### ${status} ${categoryName}
|
|
63
|
+
- Score: ${data.score}/${data.weight} (${percentage.toFixed(1)}%)
|
|
64
|
+
${data.issues.length > 0 ? `- Issues:\n${data.issues.map((issue) => ` - ${issue}`).join("\n")}` : "- ✅ No issues found"}`;
|
|
65
|
+
})
|
|
66
|
+
.join("\n\n")}
|
|
67
|
+
|
|
68
|
+
${scoreResult.achievements.length > 0 ? `### 🎉 Achievements\n${scoreResult.achievements.map((a, i) => `${i + 1}. ${a}`).join("\n")}\n` : ""}
|
|
69
|
+
|
|
70
|
+
### 💡 Recommendations
|
|
71
|
+
${scoreResult.recommendations.map((rec, index) => `${index + 1}. ${rec}`).join("\n")}
|
|
72
|
+
|
|
73
|
+
### 🚀 Next Steps
|
|
74
|
+
${scoreResult.nextSteps.map((step, index) => `${index + 1}. ${step}`).join("\n")}
|
|
75
|
+
|
|
76
|
+
### 📊 Score Distribution
|
|
77
|
+
\`\`\`
|
|
78
|
+
Code Hygiene: ${generateMiniBar(scoreResult.categories.codeHygiene.score, scoreResult.categories.codeHygiene.weight)}
|
|
79
|
+
Test Coverage: ${generateMiniBar(scoreResult.categories.testCoverage.score, scoreResult.categories.testCoverage.weight)}
|
|
80
|
+
TypeScript: ${generateMiniBar(scoreResult.categories.typeScript.score, scoreResult.categories.typeScript.weight)}
|
|
81
|
+
Linting: ${generateMiniBar(scoreResult.categories.linting.score, scoreResult.categories.linting.weight)}
|
|
82
|
+
Documentation: ${generateMiniBar(scoreResult.categories.documentation.score, scoreResult.categories.documentation.weight)}
|
|
83
|
+
Security: ${generateMiniBar(scoreResult.categories.security.score, scoreResult.categories.security.weight)}
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
86
|
+
${references ? `\n${references}\n` : ""}
|
|
87
|
+
### ⚠️ Disclaimer
|
|
88
|
+
- This score is calculated based on multiple quality metrics and best practices
|
|
89
|
+
- Achieving 100/100 requires excellence across all categories
|
|
90
|
+
- Regular monitoring and improvement is recommended
|
|
91
|
+
`,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function calculateCleanCodeScore(input) {
|
|
97
|
+
const categories = {
|
|
98
|
+
codeHygiene: { score: 0, weight: 20, issues: [] },
|
|
99
|
+
testCoverage: { score: 0, weight: 25, issues: [] },
|
|
100
|
+
typeScript: { score: 0, weight: 20, issues: [] },
|
|
101
|
+
linting: { score: 0, weight: 15, issues: [] },
|
|
102
|
+
documentation: { score: 0, weight: 10, issues: [] },
|
|
103
|
+
security: { score: 0, weight: 10, issues: [] },
|
|
104
|
+
};
|
|
105
|
+
const recommendations = [];
|
|
106
|
+
const nextSteps = [];
|
|
107
|
+
const achievements = [];
|
|
108
|
+
// Code Hygiene Scoring
|
|
109
|
+
if (input.codeContent) {
|
|
110
|
+
const hygieneResult = analyzeCodeHygiene(input.codeContent, input.language || "javascript");
|
|
111
|
+
categories.codeHygiene.score = Math.round((hygieneResult.score / 100) * categories.codeHygiene.weight);
|
|
112
|
+
categories.codeHygiene.issues = hygieneResult.issues;
|
|
113
|
+
if (hygieneResult.score >= 85) {
|
|
114
|
+
achievements.push("Excellent code hygiene maintained");
|
|
115
|
+
}
|
|
116
|
+
else if (hygieneResult.score < 70) {
|
|
117
|
+
recommendations.push("Improve code hygiene by addressing identified issues");
|
|
118
|
+
nextSteps.push("Run code cleanup and remove dead code");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// If no code provided, assume good hygiene
|
|
123
|
+
categories.codeHygiene.score = categories.codeHygiene.weight;
|
|
124
|
+
}
|
|
125
|
+
// Test Coverage Scoring
|
|
126
|
+
if (input.coverageMetrics) {
|
|
127
|
+
const coverage = input.coverageMetrics;
|
|
128
|
+
const avgCoverage = ((coverage.statements || 0) +
|
|
129
|
+
(coverage.branches || 0) +
|
|
130
|
+
(coverage.functions || 0) +
|
|
131
|
+
(coverage.lines || 0)) /
|
|
132
|
+
4;
|
|
133
|
+
categories.testCoverage.score = Math.round((avgCoverage / 100) * categories.testCoverage.weight);
|
|
134
|
+
if (avgCoverage < 80) {
|
|
135
|
+
categories.testCoverage.issues.push(`Average coverage ${avgCoverage.toFixed(1)}% is below 80% target`);
|
|
136
|
+
}
|
|
137
|
+
if ((coverage.statements || 0) < 80) {
|
|
138
|
+
categories.testCoverage.issues.push(`Statement coverage ${coverage.statements}% is below 80%`);
|
|
139
|
+
}
|
|
140
|
+
if ((coverage.branches || 0) < 80) {
|
|
141
|
+
categories.testCoverage.issues.push(`Branch coverage ${coverage.branches}% is below 80%`);
|
|
142
|
+
}
|
|
143
|
+
if ((coverage.functions || 0) < 80) {
|
|
144
|
+
categories.testCoverage.issues.push(`Function coverage ${coverage.functions}% is below 80%`);
|
|
145
|
+
}
|
|
146
|
+
if (avgCoverage >= 90) {
|
|
147
|
+
achievements.push("Excellent test coverage achieved (≥90%)");
|
|
148
|
+
}
|
|
149
|
+
else if (avgCoverage < 70) {
|
|
150
|
+
recommendations.push("Increase test coverage to at least 80% across all metrics");
|
|
151
|
+
nextSteps.push("Identify and test uncovered code paths");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Default to assume 80% coverage
|
|
156
|
+
categories.testCoverage.score = Math.round(0.8 * categories.testCoverage.weight);
|
|
157
|
+
}
|
|
158
|
+
// TypeScript Scoring (assume passing if no errors)
|
|
159
|
+
categories.typeScript.score = categories.typeScript.weight;
|
|
160
|
+
achievements.push("TypeScript strict mode enabled and passing");
|
|
161
|
+
// Linting Scoring (assume Biome is configured and passing)
|
|
162
|
+
categories.linting.score = categories.linting.weight;
|
|
163
|
+
achievements.push("Biome linting and formatting configured");
|
|
164
|
+
// Documentation Scoring
|
|
165
|
+
if (input.codeContent) {
|
|
166
|
+
const docScore = analyzeDocumentation(input.codeContent);
|
|
167
|
+
categories.documentation.score = Math.round((docScore / 100) * categories.documentation.weight);
|
|
168
|
+
if (docScore < 70) {
|
|
169
|
+
categories.documentation.issues.push("Insufficient code documentation and comments");
|
|
170
|
+
recommendations.push("Add comprehensive documentation and comments");
|
|
171
|
+
}
|
|
172
|
+
if (docScore >= 90) {
|
|
173
|
+
achievements.push("Well-documented codebase");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
categories.documentation.score = Math.round(0.8 * categories.documentation.weight);
|
|
178
|
+
}
|
|
179
|
+
// Security Scoring
|
|
180
|
+
if (input.codeContent) {
|
|
181
|
+
const securityScore = analyzeSecurityIssues(input.codeContent);
|
|
182
|
+
categories.security.score = Math.round((securityScore.score / 100) * categories.security.weight);
|
|
183
|
+
categories.security.issues = securityScore.issues;
|
|
184
|
+
if (securityScore.score < 80) {
|
|
185
|
+
recommendations.push("Address security vulnerabilities immediately");
|
|
186
|
+
nextSteps.push("Run security audit and fix identified issues");
|
|
187
|
+
}
|
|
188
|
+
if (securityScore.score === 100) {
|
|
189
|
+
achievements.push("No security vulnerabilities detected");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
categories.security.score = categories.security.weight;
|
|
194
|
+
achievements.push("Security checks passed");
|
|
195
|
+
}
|
|
196
|
+
// Calculate overall score
|
|
197
|
+
const overallScore = Math.round(Object.values(categories).reduce((sum, cat) => sum + cat.score, 0));
|
|
198
|
+
let scoreDescription = "";
|
|
199
|
+
if (overallScore >= 95) {
|
|
200
|
+
scoreDescription = "🏆 Perfect - Clean Code Excellence";
|
|
201
|
+
}
|
|
202
|
+
else if (overallScore >= 90) {
|
|
203
|
+
scoreDescription = "✨ Excellent - Near Perfect Quality";
|
|
204
|
+
}
|
|
205
|
+
else if (overallScore >= 80) {
|
|
206
|
+
scoreDescription = "✅ Very Good - High Quality Code";
|
|
207
|
+
}
|
|
208
|
+
else if (overallScore >= 70) {
|
|
209
|
+
scoreDescription = "👍 Good - Quality Standards Met";
|
|
210
|
+
}
|
|
211
|
+
else if (overallScore >= 60) {
|
|
212
|
+
scoreDescription = "⚠️ Fair - Improvements Needed";
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
scoreDescription = "❌ Poor - Significant Issues";
|
|
216
|
+
}
|
|
217
|
+
// Add general recommendations
|
|
218
|
+
if (overallScore < 100) {
|
|
219
|
+
if (recommendations.length === 0) {
|
|
220
|
+
recommendations.push("Continue maintaining current quality standards");
|
|
221
|
+
}
|
|
222
|
+
recommendations.push("Regular code reviews and pair programming sessions");
|
|
223
|
+
recommendations.push("Automated quality gates in CI/CD pipeline");
|
|
224
|
+
}
|
|
225
|
+
if (nextSteps.length === 0) {
|
|
226
|
+
if (overallScore === 100) {
|
|
227
|
+
nextSteps.push("Maintain this excellent quality level");
|
|
228
|
+
nextSteps.push("Share best practices with the team");
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
nextSteps.push("Focus on lowest scoring categories first");
|
|
232
|
+
nextSteps.push("Set up automated quality monitoring");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
overallScore,
|
|
237
|
+
scoreDescription,
|
|
238
|
+
categories,
|
|
239
|
+
recommendations,
|
|
240
|
+
nextSteps,
|
|
241
|
+
achievements,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function analyzeCodeHygiene(code, language) {
|
|
245
|
+
let score = 100;
|
|
246
|
+
const issues = [];
|
|
247
|
+
// Check for TODOs/FIXMEs
|
|
248
|
+
if (code.includes("TODO") || code.includes("FIXME")) {
|
|
249
|
+
score -= 5;
|
|
250
|
+
issues.push("TODO or FIXME comments found");
|
|
251
|
+
}
|
|
252
|
+
// Check for debug statements
|
|
253
|
+
if ((code.includes("console.log") || code.includes("print(")) &&
|
|
254
|
+
(language === "javascript" ||
|
|
255
|
+
language === "typescript" ||
|
|
256
|
+
language === "python")) {
|
|
257
|
+
score -= 10;
|
|
258
|
+
issues.push("Debug statements found");
|
|
259
|
+
}
|
|
260
|
+
// Check for hardcoded credentials
|
|
261
|
+
if (/(apiKey|api_key|password|secret|token)\s*=\s*['"][^'"]+['"]/i.test(code)) {
|
|
262
|
+
score -= 20;
|
|
263
|
+
issues.push("Potential hardcoded credentials detected");
|
|
264
|
+
}
|
|
265
|
+
// Check for commented code
|
|
266
|
+
const commentedLines = (code.match(/^\s*(\/\/|#)\s*(const|let|var|def|function)/gm) || []).length;
|
|
267
|
+
if (commentedLines > 3) {
|
|
268
|
+
score -= 5;
|
|
269
|
+
issues.push(`${commentedLines} lines of commented code found`);
|
|
270
|
+
}
|
|
271
|
+
// Check for complex functions (>50 lines)
|
|
272
|
+
const functionMatches = code.match(/function\s+\w+\s*\([^)]*\)\s*{[\s\S]*?}/g) || [];
|
|
273
|
+
for (const func of functionMatches) {
|
|
274
|
+
const lines = func.split("\n").length;
|
|
275
|
+
if (lines > 50) {
|
|
276
|
+
score -= 10;
|
|
277
|
+
issues.push("Complex function detected (>50 lines)");
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return { score: Math.max(0, score), issues };
|
|
282
|
+
}
|
|
283
|
+
function analyzeDocumentation(code) {
|
|
284
|
+
let score = 70; // Base score
|
|
285
|
+
// Check for JSDoc/docstring comments
|
|
286
|
+
const docComments = (code.match(/\/\*\*[\s\S]*?\*\/|'''[\s\S]*?'''|"""[\s\S]*?"""/g) || []).length;
|
|
287
|
+
if (docComments > 0) {
|
|
288
|
+
score += 15;
|
|
289
|
+
}
|
|
290
|
+
// Check for inline comments
|
|
291
|
+
const inlineComments = (code.match(/\/\/.*|#.*/g) || []).length;
|
|
292
|
+
if (inlineComments > 5) {
|
|
293
|
+
score += 15;
|
|
294
|
+
}
|
|
295
|
+
// Check for README or documentation keywords
|
|
296
|
+
if (/README|CONTRIBUTING|CHANGELOG/i.test(code)) {
|
|
297
|
+
score += 10;
|
|
298
|
+
}
|
|
299
|
+
return Math.min(100, score);
|
|
300
|
+
}
|
|
301
|
+
function analyzeSecurityIssues(code) {
|
|
302
|
+
let score = 100;
|
|
303
|
+
const issues = [];
|
|
304
|
+
// Check for eval() or exec()
|
|
305
|
+
if (/\b(eval|exec)\s*\(/i.test(code)) {
|
|
306
|
+
score -= 30;
|
|
307
|
+
issues.push("Use of eval() or exec() detected - security risk");
|
|
308
|
+
}
|
|
309
|
+
// Check for SQL injection risks
|
|
310
|
+
if (/(SELECT|INSERT|UPDATE|DELETE)\s+.*\+.*/.test(code)) {
|
|
311
|
+
score -= 25;
|
|
312
|
+
issues.push("Potential SQL injection vulnerability");
|
|
313
|
+
}
|
|
314
|
+
// Check for XSS risks
|
|
315
|
+
if (/innerHTML\s*=|dangerouslySetInnerHTML/i.test(code)) {
|
|
316
|
+
score -= 20;
|
|
317
|
+
issues.push("Potential XSS vulnerability with innerHTML");
|
|
318
|
+
}
|
|
319
|
+
// Check for hardcoded secrets
|
|
320
|
+
if (/(secret|password|api_key|apiKey|token|auth|credential)\s*=\s*['"][^'"]+['"]/i.test(code)) {
|
|
321
|
+
score -= 25;
|
|
322
|
+
issues.push("Hardcoded secrets or credentials found");
|
|
323
|
+
}
|
|
324
|
+
return { score: Math.max(0, score), issues };
|
|
325
|
+
}
|
|
326
|
+
function generateScoreBar(score) {
|
|
327
|
+
const barLength = 50;
|
|
328
|
+
const filledLength = Math.round((score / 100) * barLength);
|
|
329
|
+
const emptyLength = barLength - filledLength;
|
|
330
|
+
const filled = "█".repeat(filledLength);
|
|
331
|
+
const empty = "░".repeat(emptyLength);
|
|
332
|
+
let color = "🔴";
|
|
333
|
+
if (score >= 90)
|
|
334
|
+
color = "🟢";
|
|
335
|
+
else if (score >= 70)
|
|
336
|
+
color = "🟡";
|
|
337
|
+
else if (score >= 50)
|
|
338
|
+
color = "🟠";
|
|
339
|
+
return `${color} [${filled}${empty}] ${score}%`;
|
|
340
|
+
}
|
|
341
|
+
function generateMiniBar(score, weight) {
|
|
342
|
+
const percentage = (score / weight) * 100;
|
|
343
|
+
const barLength = 20;
|
|
344
|
+
const filledLength = Math.round((percentage / 100) * barLength);
|
|
345
|
+
const emptyLength = barLength - filledLength;
|
|
346
|
+
const filled = "█".repeat(filledLength);
|
|
347
|
+
const empty = "░".repeat(emptyLength);
|
|
348
|
+
return `[${filled}${empty}] ${score}/${weight}`;
|
|
349
|
+
}
|
|
350
|
+
function getScoreStatus(percentage) {
|
|
351
|
+
if (percentage >= 90)
|
|
352
|
+
return "🟢";
|
|
353
|
+
if (percentage >= 70)
|
|
354
|
+
return "🟡";
|
|
355
|
+
if (percentage >= 50)
|
|
356
|
+
return "🟠";
|
|
357
|
+
return "🔴";
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=clean-code-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean-code-scorer.js","sourceRoot":"","sources":["../../src/tools/clean-code-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,11 +74,81 @@ function analyzeCodeHygiene(input) {
|
|
|
74
74
|
const nextSteps = [];
|
|
75
75
|
const code = input.codeContent;
|
|
76
76
|
const language = input.language.toLowerCase();
|
|
77
|
+
// Check for empty or minimal code
|
|
78
|
+
const trimmedCode = code.trim();
|
|
79
|
+
if (trimmedCode.length === 0) {
|
|
80
|
+
issues.push({
|
|
81
|
+
type: "Empty Code",
|
|
82
|
+
description: "No code provided for analysis",
|
|
83
|
+
severity: "critical",
|
|
84
|
+
});
|
|
85
|
+
recommendations.push("Provide code content for meaningful analysis");
|
|
86
|
+
}
|
|
87
|
+
else if (trimmedCode.length < 20) {
|
|
88
|
+
issues.push({
|
|
89
|
+
type: "Insufficient Code",
|
|
90
|
+
description: "Code too short for comprehensive analysis (less than 20 characters)",
|
|
91
|
+
severity: "minor",
|
|
92
|
+
});
|
|
93
|
+
recommendations.push("Provide more substantial code for better analysis");
|
|
94
|
+
}
|
|
95
|
+
// Check for code complexity metrics
|
|
96
|
+
const lines = code.split("\n");
|
|
97
|
+
const nonEmptyLines = lines.filter((line) => line.trim().length > 0).length;
|
|
98
|
+
const codeOnlyLines = lines.filter((line) => {
|
|
99
|
+
const trimmed = line.trim();
|
|
100
|
+
// Count lines that are not comments
|
|
101
|
+
return (trimmed.length > 0 &&
|
|
102
|
+
!trimmed.startsWith("//") &&
|
|
103
|
+
!trimmed.startsWith("#") &&
|
|
104
|
+
!trimmed.startsWith("*") &&
|
|
105
|
+
!trimmed.startsWith("/*"));
|
|
106
|
+
}).length;
|
|
107
|
+
// Check for lack of documentation
|
|
108
|
+
const hasDocComments = /\/\*\*[\s\S]*?\*\/|\/\/\/|#\s*@|"""[\s\S]*?"""|'''[\s\S]*?'''/g.test(code);
|
|
109
|
+
if (codeOnlyLines > 15 && !hasDocComments) {
|
|
110
|
+
issues.push({
|
|
111
|
+
type: "Documentation",
|
|
112
|
+
description: "No documentation comments found in substantial codebase",
|
|
113
|
+
severity: "minor",
|
|
114
|
+
});
|
|
115
|
+
recommendations.push("Add documentation comments for functions and classes");
|
|
116
|
+
}
|
|
117
|
+
// Check for magic numbers (simple heuristic - may have false positives for HTTP codes, ports, etc.)
|
|
118
|
+
const magicNumberPattern = /(?:^|[^\w.])([2-9]\d{2,}|[1-9]\d{4,})(?:[^\w.]|$)/g;
|
|
119
|
+
const magicNumbers = code.match(magicNumberPattern);
|
|
120
|
+
if (magicNumbers && magicNumbers.length > 2) {
|
|
121
|
+
issues.push({
|
|
122
|
+
type: "Code Quality",
|
|
123
|
+
description: `Found ${magicNumbers.length} potential magic numbers - consider using named constants`,
|
|
124
|
+
severity: "minor",
|
|
125
|
+
});
|
|
126
|
+
recommendations.push("Replace magic numbers with named constants for clarity");
|
|
127
|
+
}
|
|
128
|
+
// Check for deep nesting (heuristic based on indentation - may vary with tab/space preferences)
|
|
129
|
+
let maxIndentation = 0;
|
|
130
|
+
for (const line of lines) {
|
|
131
|
+
const leadingSpaces = line.match(/^(\s*)/)?.[1].length || 0;
|
|
132
|
+
// Estimate indent level (assuming 2-4 space indentation is common)
|
|
133
|
+
const indentLevel = Math.floor(leadingSpaces / 2);
|
|
134
|
+
if (indentLevel > maxIndentation) {
|
|
135
|
+
maxIndentation = indentLevel;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (maxIndentation > 4) {
|
|
139
|
+
issues.push({
|
|
140
|
+
type: "Code Complexity",
|
|
141
|
+
description: `Deep nesting detected (${maxIndentation} levels) - consider refactoring`,
|
|
142
|
+
severity: "major",
|
|
143
|
+
});
|
|
144
|
+
recommendations.push("Reduce nesting depth by extracting functions or using early returns");
|
|
145
|
+
}
|
|
77
146
|
// Common code hygiene checks
|
|
78
147
|
if (code.includes("TODO") || code.includes("FIXME")) {
|
|
79
148
|
issues.push({
|
|
80
149
|
type: "Technical Debt",
|
|
81
150
|
description: "Found TODO or FIXME comments indicating incomplete work",
|
|
151
|
+
severity: "minor",
|
|
82
152
|
});
|
|
83
153
|
recommendations.push("Address pending TODO and FIXME items before production");
|
|
84
154
|
}
|
|
@@ -87,6 +157,7 @@ function analyzeCodeHygiene(input) {
|
|
|
87
157
|
issues.push({
|
|
88
158
|
type: "Debug Code",
|
|
89
159
|
description: "Found console.log statements that should be removed in production",
|
|
160
|
+
severity: "major",
|
|
90
161
|
});
|
|
91
162
|
recommendations.push("Remove debug console.log statements");
|
|
92
163
|
}
|
|
@@ -94,11 +165,11 @@ function analyzeCodeHygiene(input) {
|
|
|
94
165
|
issues.push({
|
|
95
166
|
type: "Debug Code",
|
|
96
167
|
description: "Found print statements that should use proper logging",
|
|
168
|
+
severity: "major",
|
|
97
169
|
});
|
|
98
170
|
recommendations.push("Replace print statements with proper logging");
|
|
99
171
|
}
|
|
100
172
|
// Check for long functions (simple heuristic)
|
|
101
|
-
const lines = code.split("\n");
|
|
102
173
|
let functionLines = 0;
|
|
103
174
|
let inFunction = false;
|
|
104
175
|
for (const line of lines) {
|
|
@@ -116,6 +187,7 @@ function analyzeCodeHygiene(input) {
|
|
|
116
187
|
issues.push({
|
|
117
188
|
type: "Code Complexity",
|
|
118
189
|
description: `Found function with ${functionLines} lines - consider breaking into smaller functions`,
|
|
190
|
+
severity: "major",
|
|
119
191
|
});
|
|
120
192
|
}
|
|
121
193
|
inFunction = false;
|
|
@@ -128,9 +200,35 @@ function analyzeCodeHygiene(input) {
|
|
|
128
200
|
issues.push({
|
|
129
201
|
type: "Outdated Pattern",
|
|
130
202
|
description: "Using var instead of let/const",
|
|
203
|
+
severity: "minor",
|
|
131
204
|
});
|
|
132
205
|
recommendations.push("Replace var declarations with let or const");
|
|
133
206
|
}
|
|
207
|
+
// Check for potential callback hell
|
|
208
|
+
const nestedCallbacks = (code.match(/\)\s*{\s*[^}]*\([^)]*\)\s*{/g) || [])
|
|
209
|
+
.length;
|
|
210
|
+
if (nestedCallbacks > 2) {
|
|
211
|
+
issues.push({
|
|
212
|
+
type: "Code Complexity",
|
|
213
|
+
description: `Potential callback hell detected (${nestedCallbacks} nested callbacks)`,
|
|
214
|
+
severity: "major",
|
|
215
|
+
});
|
|
216
|
+
recommendations.push("Consider using async/await or Promise chains instead of nested callbacks");
|
|
217
|
+
}
|
|
218
|
+
// Check for missing type annotations in TypeScript
|
|
219
|
+
if (language === "typescript" && codeOnlyLines > 10) {
|
|
220
|
+
const functionDeclarations = (code.match(/function\s+\w+\s*\([^)]*\)\s*{/g) || []).length;
|
|
221
|
+
const typedFunctions = (code.match(/function\s+\w+\s*\([^)]*\)\s*:\s*\w+/g) || []).length;
|
|
222
|
+
if (functionDeclarations > 0 &&
|
|
223
|
+
typedFunctions / functionDeclarations < 0.5) {
|
|
224
|
+
issues.push({
|
|
225
|
+
type: "Type Safety",
|
|
226
|
+
description: "Many functions lack return type annotations",
|
|
227
|
+
severity: "minor",
|
|
228
|
+
});
|
|
229
|
+
recommendations.push("Add explicit return type annotations to functions");
|
|
230
|
+
}
|
|
231
|
+
}
|
|
134
232
|
}
|
|
135
233
|
// Check for missing error handling
|
|
136
234
|
if (code.includes("await ") &&
|
|
@@ -139,21 +237,87 @@ function analyzeCodeHygiene(input) {
|
|
|
139
237
|
issues.push({
|
|
140
238
|
type: "Error Handling",
|
|
141
239
|
description: "Async code without proper error handling",
|
|
240
|
+
severity: "critical",
|
|
142
241
|
});
|
|
143
242
|
recommendations.push("Add try-catch blocks around async operations");
|
|
144
243
|
}
|
|
145
|
-
//
|
|
244
|
+
// Check for hardcoded credentials or sensitive data
|
|
245
|
+
if (/password\s*=\s*["']|api[_-]?key\s*=\s*["']|secret\s*=\s*["']/i.test(code)) {
|
|
246
|
+
issues.push({
|
|
247
|
+
type: "Security Risk",
|
|
248
|
+
description: "Potential hardcoded credentials or API keys detected",
|
|
249
|
+
severity: "critical",
|
|
250
|
+
});
|
|
251
|
+
recommendations.push("Move sensitive data to environment variables or secure configuration");
|
|
252
|
+
}
|
|
253
|
+
// Check for commented out code
|
|
254
|
+
const commentedLines = lines.filter((line) => {
|
|
255
|
+
const trimmed = line.trim();
|
|
256
|
+
return ((trimmed.startsWith("//") && /[a-zA-Z0-9()]/.test(trimmed.slice(2))) ||
|
|
257
|
+
(trimmed.startsWith("#") &&
|
|
258
|
+
language === "python" &&
|
|
259
|
+
/[a-zA-Z0-9()]/.test(trimmed.slice(1))));
|
|
260
|
+
}).length;
|
|
261
|
+
if (commentedLines > 3) {
|
|
262
|
+
issues.push({
|
|
263
|
+
type: "Dead Code",
|
|
264
|
+
description: `Found ${commentedLines} lines of commented code - consider removing`,
|
|
265
|
+
severity: "minor",
|
|
266
|
+
});
|
|
267
|
+
recommendations.push("Remove commented out code or move to version control history");
|
|
268
|
+
}
|
|
269
|
+
// Calculate score with severity-based penalties
|
|
146
270
|
let score = 100;
|
|
147
|
-
|
|
271
|
+
for (const issue of issues) {
|
|
272
|
+
if (issue.severity === "critical") {
|
|
273
|
+
score -= 20;
|
|
274
|
+
}
|
|
275
|
+
else if (issue.severity === "major") {
|
|
276
|
+
score -= 12;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
score -= 5;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
148
282
|
score = Math.max(0, score);
|
|
283
|
+
// Apply additional scoring adjustments for overall code quality
|
|
284
|
+
if (trimmedCode.length > 0 && codeOnlyLines > 0) {
|
|
285
|
+
// Reward code with good practices
|
|
286
|
+
let qualityBonus = 0;
|
|
287
|
+
// Check for good practices
|
|
288
|
+
if (hasDocComments && codeOnlyLines > 10) {
|
|
289
|
+
qualityBonus += 0; // Neutral - documentation is expected, not bonus
|
|
290
|
+
}
|
|
291
|
+
// Penalize very short code that might not be representative
|
|
292
|
+
if (codeOnlyLines < 5 && trimmedCode.length < 100) {
|
|
293
|
+
score = Math.max(70, score - 10); // Reduce score for minimal code samples
|
|
294
|
+
}
|
|
295
|
+
// Penalize code with low comment ratio (if substantial)
|
|
296
|
+
if (codeOnlyLines > 15) {
|
|
297
|
+
const commentLines = nonEmptyLines - codeOnlyLines;
|
|
298
|
+
const commentRatio = commentLines / codeOnlyLines;
|
|
299
|
+
if (commentRatio < 0.1) {
|
|
300
|
+
score -= 5;
|
|
301
|
+
if (!issues.some((i) => i.type === "Documentation")) {
|
|
302
|
+
issues.push({
|
|
303
|
+
type: "Documentation",
|
|
304
|
+
description: "Low comment-to-code ratio (< 10%)",
|
|
305
|
+
severity: "minor",
|
|
306
|
+
});
|
|
307
|
+
recommendations.push("Consider adding more explanatory comments");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
score = Math.max(0, Math.min(100, score + qualityBonus));
|
|
312
|
+
}
|
|
149
313
|
let scoreDescription = "";
|
|
150
|
-
if (score >=
|
|
314
|
+
if (score >= 85)
|
|
151
315
|
scoreDescription = "Excellent";
|
|
152
|
-
else if (score >= 80)
|
|
153
|
-
scoreDescription = "Good";
|
|
154
316
|
else if (score >= 70)
|
|
317
|
+
scoreDescription = "Good";
|
|
318
|
+
else if (score >= 50)
|
|
155
319
|
scoreDescription = "Fair";
|
|
156
|
-
else if (score >=
|
|
320
|
+
else if (score >= 30)
|
|
157
321
|
scoreDescription = "Needs Improvement";
|
|
158
322
|
else
|
|
159
323
|
scoreDescription = "Poor";
|
|
@@ -162,12 +326,20 @@ function analyzeCodeHygiene(input) {
|
|
|
162
326
|
nextSteps.push("Code hygiene looks good! Consider adding automated linting if not already present.");
|
|
163
327
|
}
|
|
164
328
|
else {
|
|
165
|
-
|
|
329
|
+
const criticalIssues = issues.filter((i) => i.severity === "critical").length;
|
|
330
|
+
const majorIssues = issues.filter((i) => i.severity === "major").length;
|
|
331
|
+
if (criticalIssues > 0) {
|
|
332
|
+
nextSteps.push(`Address ${criticalIssues} critical issue(s) immediately`);
|
|
333
|
+
}
|
|
334
|
+
if (majorIssues > 0) {
|
|
335
|
+
nextSteps.push(`Fix ${majorIssues} major issue(s) before merging`);
|
|
336
|
+
}
|
|
337
|
+
nextSteps.push("Address the identified issues in order of priority (critical > major > minor)");
|
|
166
338
|
nextSteps.push("Set up automated code quality checks (ESLint, Prettier, Biome, etc.)");
|
|
167
339
|
nextSteps.push("Consider implementing pre-commit hooks");
|
|
168
340
|
}
|
|
169
341
|
return {
|
|
170
|
-
issues,
|
|
342
|
+
issues: issues.map(({ severity, ...rest }) => rest),
|
|
171
343
|
recommendations,
|
|
172
344
|
score,
|
|
173
345
|
scoreDescription,
|