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.
Files changed (253) hide show
  1. package/README.md +236 -9
  2. package/dist/index.js +487 -5
  3. package/dist/index.js.map +1 -1
  4. package/dist/prompts/index.d.ts +18 -0
  5. package/dist/prompts/index.d.ts.map +1 -1
  6. package/dist/prompts/index.js +127 -492
  7. package/dist/prompts/index.js.map +1 -1
  8. package/dist/resources/structured.d.ts.map +1 -1
  9. package/dist/resources/structured.js +410 -0
  10. package/dist/resources/structured.js.map +1 -1
  11. package/dist/schemas/flow-tool-schemas.d.ts +167 -0
  12. package/dist/schemas/flow-tool-schemas.d.ts.map +1 -0
  13. package/dist/schemas/flow-tool-schemas.js +149 -0
  14. package/dist/schemas/flow-tool-schemas.js.map +1 -0
  15. package/dist/tools/bridge/index.d.ts +83 -0
  16. package/dist/tools/bridge/index.d.ts.map +1 -0
  17. package/dist/tools/bridge/index.js +85 -0
  18. package/dist/tools/bridge/index.js.map +1 -0
  19. package/dist/tools/bridge/project-onboarding-bridge.d.ts +54 -0
  20. package/dist/tools/bridge/project-onboarding-bridge.d.ts.map +1 -0
  21. package/dist/tools/bridge/project-onboarding-bridge.js +220 -0
  22. package/dist/tools/bridge/project-onboarding-bridge.js.map +1 -0
  23. package/dist/tools/bridge/semantic-analyzer-bridge.d.ts +47 -0
  24. package/dist/tools/bridge/semantic-analyzer-bridge.d.ts.map +1 -0
  25. package/dist/tools/bridge/semantic-analyzer-bridge.js +174 -0
  26. package/dist/tools/bridge/semantic-analyzer-bridge.js.map +1 -0
  27. package/dist/tools/clean-code-scorer.d.ts +7 -0
  28. package/dist/tools/clean-code-scorer.d.ts.map +1 -0
  29. package/dist/tools/clean-code-scorer.js +359 -0
  30. package/dist/tools/clean-code-scorer.js.map +1 -0
  31. package/dist/tools/code-hygiene-analyzer.js +181 -9
  32. package/dist/tools/code-hygiene-analyzer.js.map +1 -1
  33. package/dist/tools/config/guidelines-config.d.ts +2 -14
  34. package/dist/tools/config/guidelines-config.d.ts.map +1 -1
  35. package/dist/tools/config/guidelines-config.js +45 -6
  36. package/dist/tools/config/guidelines-config.js.map +1 -1
  37. package/dist/tools/config/model-config.d.ts +2 -23
  38. package/dist/tools/config/model-config.d.ts.map +1 -1
  39. package/dist/tools/config/model-config.js.map +1 -1
  40. package/dist/tools/config/types/guidelines.types.d.ts +15 -0
  41. package/dist/tools/config/types/guidelines.types.d.ts.map +1 -0
  42. package/dist/tools/config/types/guidelines.types.js +3 -0
  43. package/dist/tools/config/types/guidelines.types.js.map +1 -0
  44. package/dist/tools/config/types/index.d.ts +3 -0
  45. package/dist/tools/config/types/index.d.ts.map +1 -0
  46. package/dist/tools/config/types/index.js +3 -0
  47. package/dist/tools/config/types/index.js.map +1 -0
  48. package/dist/tools/config/types/model.types.d.ts +24 -0
  49. package/dist/tools/config/types/model.types.d.ts.map +1 -0
  50. package/dist/tools/config/types/model.types.js +3 -0
  51. package/dist/tools/config/types/model.types.js.map +1 -0
  52. package/dist/tools/design/adr-generator.d.ts +1 -1
  53. package/dist/tools/design/adr-generator.d.ts.map +1 -1
  54. package/dist/tools/design/adr-generator.js +5 -1
  55. package/dist/tools/design/adr-generator.js.map +1 -1
  56. package/dist/tools/design/confirmation-module.d.ts +1 -1
  57. package/dist/tools/design/confirmation-module.d.ts.map +1 -1
  58. package/dist/tools/design/confirmation-module.js +2 -0
  59. package/dist/tools/design/confirmation-module.js.map +1 -1
  60. package/dist/tools/design/confirmation-prompt-builder.d.ts +1 -1
  61. package/dist/tools/design/confirmation-prompt-builder.d.ts.map +1 -1
  62. package/dist/tools/design/confirmation-prompt-builder.js +5 -1
  63. package/dist/tools/design/confirmation-prompt-builder.js.map +1 -1
  64. package/dist/tools/design/constraint-consistency-enforcer.d.ts +1 -1
  65. package/dist/tools/design/constraint-consistency-enforcer.d.ts.map +1 -1
  66. package/dist/tools/design/constraint-consistency-enforcer.js +6 -1
  67. package/dist/tools/design/constraint-consistency-enforcer.js.map +1 -1
  68. package/dist/tools/design/constraint-manager.d.ts +9 -9
  69. package/dist/tools/design/constraint-manager.d.ts.map +1 -1
  70. package/dist/tools/design/coverage-enforcer.d.ts +1 -1
  71. package/dist/tools/design/coverage-enforcer.d.ts.map +1 -1
  72. package/dist/tools/design/cross-session-consistency-enforcer.d.ts +1 -1
  73. package/dist/tools/design/cross-session-consistency-enforcer.d.ts.map +1 -1
  74. package/dist/tools/design/design-assistant.d.ts +1 -15
  75. package/dist/tools/design/design-assistant.d.ts.map +1 -1
  76. package/dist/tools/design/design-assistant.js +29 -853
  77. package/dist/tools/design/design-assistant.js.map +1 -1
  78. package/dist/tools/design/design-phase-workflow.d.ts +1 -1
  79. package/dist/tools/design/design-phase-workflow.d.ts.map +1 -1
  80. package/dist/tools/design/design-phase-workflow.js +15 -8
  81. package/dist/tools/design/design-phase-workflow.js.map +1 -1
  82. package/dist/tools/design/index.d.ts +1 -1
  83. package/dist/tools/design/index.d.ts.map +1 -1
  84. package/dist/tools/design/methodology-selector.d.ts +1 -1
  85. package/dist/tools/design/methodology-selector.d.ts.map +1 -1
  86. package/dist/tools/design/pivot-module.d.ts +1 -1
  87. package/dist/tools/design/pivot-module.d.ts.map +1 -1
  88. package/dist/tools/design/roadmap-generator.d.ts +1 -1
  89. package/dist/tools/design/roadmap-generator.d.ts.map +1 -1
  90. package/dist/tools/design/roadmap-generator.js.map +1 -1
  91. package/dist/tools/design/services/additional-operations.service.d.ts +23 -0
  92. package/dist/tools/design/services/additional-operations.service.d.ts.map +1 -0
  93. package/dist/tools/design/services/additional-operations.service.js +215 -0
  94. package/dist/tools/design/services/additional-operations.service.js.map +1 -0
  95. package/dist/tools/design/services/artifact-generation.service.d.ts +19 -0
  96. package/dist/tools/design/services/artifact-generation.service.d.ts.map +1 -0
  97. package/dist/tools/design/services/artifact-generation.service.js +171 -0
  98. package/dist/tools/design/services/artifact-generation.service.js.map +1 -0
  99. package/dist/tools/design/services/consistency.service.d.ts +24 -0
  100. package/dist/tools/design/services/consistency.service.d.ts.map +1 -0
  101. package/dist/tools/design/services/consistency.service.js +196 -0
  102. package/dist/tools/design/services/consistency.service.js.map +1 -0
  103. package/dist/tools/design/services/index.d.ts +7 -0
  104. package/dist/tools/design/services/index.d.ts.map +1 -0
  105. package/dist/tools/design/services/index.js +9 -0
  106. package/dist/tools/design/services/index.js.map +1 -0
  107. package/dist/tools/design/services/phase-management.service.d.ts +25 -0
  108. package/dist/tools/design/services/phase-management.service.d.ts.map +1 -0
  109. package/dist/tools/design/services/phase-management.service.js +133 -0
  110. package/dist/tools/design/services/phase-management.service.js.map +1 -0
  111. package/dist/tools/design/services/session-management.service.d.ts +23 -0
  112. package/dist/tools/design/services/session-management.service.d.ts.map +1 -0
  113. package/dist/tools/design/services/session-management.service.js +190 -0
  114. package/dist/tools/design/services/session-management.service.js.map +1 -0
  115. package/dist/tools/design/spec-generator.d.ts +1 -1
  116. package/dist/tools/design/spec-generator.d.ts.map +1 -1
  117. package/dist/tools/design/spec-generator.js +3 -3
  118. package/dist/tools/design/spec-generator.js.map +1 -1
  119. package/dist/tools/design/strategic-pivot-prompt-builder.d.ts +1 -1
  120. package/dist/tools/design/strategic-pivot-prompt-builder.d.ts.map +1 -1
  121. package/dist/tools/design/types/artifact.types.d.ts +16 -0
  122. package/dist/tools/design/types/artifact.types.d.ts.map +1 -0
  123. package/dist/tools/design/types/artifact.types.js +3 -0
  124. package/dist/tools/design/types/artifact.types.js.map +1 -0
  125. package/dist/tools/design/types/common.types.d.ts +8 -0
  126. package/dist/tools/design/types/common.types.d.ts.map +1 -0
  127. package/dist/tools/design/types/common.types.js +3 -0
  128. package/dist/tools/design/types/common.types.js.map +1 -0
  129. package/dist/tools/design/types/consistency.types.d.ts +130 -0
  130. package/dist/tools/design/types/consistency.types.d.ts.map +1 -0
  131. package/dist/tools/design/types/consistency.types.js +3 -0
  132. package/dist/tools/design/types/consistency.types.js.map +1 -0
  133. package/dist/tools/design/types/constraint.types.d.ts +53 -0
  134. package/dist/tools/design/types/constraint.types.d.ts.map +1 -0
  135. package/dist/tools/design/types/constraint.types.js +3 -0
  136. package/dist/tools/design/types/constraint.types.js.map +1 -0
  137. package/dist/tools/design/types/coverage.types.d.ts +59 -0
  138. package/dist/tools/design/types/coverage.types.d.ts.map +1 -0
  139. package/dist/tools/design/types/coverage.types.js +3 -0
  140. package/dist/tools/design/types/coverage.types.js.map +1 -0
  141. package/dist/tools/design/types/index.d.ts +9 -0
  142. package/dist/tools/design/types/index.d.ts.map +1 -0
  143. package/dist/tools/design/types/index.js +4 -0
  144. package/dist/tools/design/types/index.js.map +1 -0
  145. package/dist/tools/design/types/methodology.types.d.ts +53 -0
  146. package/dist/tools/design/types/methodology.types.d.ts.map +1 -0
  147. package/dist/tools/design/types/methodology.types.js +3 -0
  148. package/dist/tools/design/types/methodology.types.js.map +1 -0
  149. package/dist/tools/design/types/pivot.types.d.ts +56 -0
  150. package/dist/tools/design/types/pivot.types.d.ts.map +1 -0
  151. package/dist/tools/design/types/pivot.types.js +3 -0
  152. package/dist/tools/design/types/pivot.types.js.map +1 -0
  153. package/dist/tools/design/types/session.types.d.ts +50 -0
  154. package/dist/tools/design/types/session.types.d.ts.map +1 -0
  155. package/dist/tools/design/types/session.types.js +3 -0
  156. package/dist/tools/design/types/session.types.js.map +1 -0
  157. package/dist/tools/design/types.d.ts +18 -401
  158. package/dist/tools/design/types.d.ts.map +1 -1
  159. package/dist/tools/design/types.js +17 -1
  160. package/dist/tools/design/types.js.map +1 -1
  161. package/dist/tools/guidelines-validator.js +3 -3
  162. package/dist/tools/mermaid-diagram-generator.d.ts.map +1 -1
  163. package/dist/tools/mermaid-diagram-generator.js +712 -58
  164. package/dist/tools/mermaid-diagram-generator.js.map +1 -1
  165. package/dist/tools/mode-switcher.d.ts +21 -0
  166. package/dist/tools/mode-switcher.d.ts.map +1 -0
  167. package/dist/tools/mode-switcher.js +383 -0
  168. package/dist/tools/mode-switcher.js.map +1 -0
  169. package/dist/tools/project-onboarding.d.ts +7 -0
  170. package/dist/tools/project-onboarding.d.ts.map +1 -0
  171. package/dist/tools/project-onboarding.js +344 -0
  172. package/dist/tools/project-onboarding.js.map +1 -0
  173. package/dist/tools/prompt/architecture-design-prompt-builder.d.ts +7 -0
  174. package/dist/tools/prompt/architecture-design-prompt-builder.d.ts.map +1 -0
  175. package/dist/tools/prompt/architecture-design-prompt-builder.js +143 -0
  176. package/dist/tools/prompt/architecture-design-prompt-builder.js.map +1 -0
  177. package/dist/tools/prompt/code-analysis-prompt-builder.d.ts +7 -0
  178. package/dist/tools/prompt/code-analysis-prompt-builder.d.ts.map +1 -0
  179. package/dist/tools/prompt/code-analysis-prompt-builder.js +292 -0
  180. package/dist/tools/prompt/code-analysis-prompt-builder.js.map +1 -0
  181. package/dist/tools/prompt/debugging-assistant-prompt-builder.d.ts +7 -0
  182. package/dist/tools/prompt/debugging-assistant-prompt-builder.d.ts.map +1 -0
  183. package/dist/tools/prompt/debugging-assistant-prompt-builder.js +360 -0
  184. package/dist/tools/prompt/debugging-assistant-prompt-builder.js.map +1 -0
  185. package/dist/tools/prompt/documentation-generator-prompt-builder.d.ts +7 -0
  186. package/dist/tools/prompt/documentation-generator-prompt-builder.d.ts.map +1 -0
  187. package/dist/tools/prompt/documentation-generator-prompt-builder.js +152 -0
  188. package/dist/tools/prompt/documentation-generator-prompt-builder.js.map +1 -0
  189. package/dist/tools/prompt/domain-neutral-prompt-builder.d.ts +39 -39
  190. package/dist/tools/prompt/hierarchical-prompt-builder.d.ts +20 -20
  191. package/dist/tools/prompt/hierarchical-prompt-builder.d.ts.map +1 -1
  192. package/dist/tools/prompt/hierarchical-prompt-builder.js +275 -17
  193. package/dist/tools/prompt/hierarchical-prompt-builder.js.map +1 -1
  194. package/dist/tools/prompt/hierarchy-level-selector.d.ts +7 -0
  195. package/dist/tools/prompt/hierarchy-level-selector.d.ts.map +1 -0
  196. package/dist/tools/prompt/hierarchy-level-selector.js +256 -0
  197. package/dist/tools/prompt/hierarchy-level-selector.js.map +1 -0
  198. package/dist/tools/prompt/prompt-chaining-builder.d.ts +29 -0
  199. package/dist/tools/prompt/prompt-chaining-builder.d.ts.map +1 -0
  200. package/dist/tools/prompt/prompt-chaining-builder.js +212 -0
  201. package/dist/tools/prompt/prompt-chaining-builder.js.map +1 -0
  202. package/dist/tools/prompt/prompt-flow-builder.d.ts +24 -0
  203. package/dist/tools/prompt/prompt-flow-builder.d.ts.map +1 -0
  204. package/dist/tools/prompt/prompt-flow-builder.js +426 -0
  205. package/dist/tools/prompt/prompt-flow-builder.js.map +1 -0
  206. package/dist/tools/prompt/prompting-hierarchy-evaluator.d.ts +13 -0
  207. package/dist/tools/prompt/prompting-hierarchy-evaluator.d.ts.map +1 -0
  208. package/dist/tools/prompt/prompting-hierarchy-evaluator.js +372 -0
  209. package/dist/tools/prompt/prompting-hierarchy-evaluator.js.map +1 -0
  210. package/dist/tools/prompt/spark-prompt-builder.d.ts +54 -54
  211. package/dist/tools/prompt/types/hierarchy.types.d.ts +42 -0
  212. package/dist/tools/prompt/types/hierarchy.types.d.ts.map +1 -0
  213. package/dist/tools/prompt/types/hierarchy.types.js +23 -0
  214. package/dist/tools/prompt/types/hierarchy.types.js.map +1 -0
  215. package/dist/tools/prompt/types/index.d.ts +2 -0
  216. package/dist/tools/prompt/types/index.d.ts.map +1 -0
  217. package/dist/tools/prompt/types/index.js +3 -0
  218. package/dist/tools/prompt/types/index.js.map +1 -0
  219. package/dist/tools/semantic-code-analyzer.d.ts +7 -0
  220. package/dist/tools/semantic-code-analyzer.d.ts.map +1 -0
  221. package/dist/tools/semantic-code-analyzer.js +380 -0
  222. package/dist/tools/semantic-code-analyzer.js.map +1 -0
  223. package/dist/tools/shared/errors.d.ts +101 -0
  224. package/dist/tools/shared/errors.d.ts.map +1 -0
  225. package/dist/tools/shared/errors.js +176 -0
  226. package/dist/tools/shared/errors.js.map +1 -0
  227. package/dist/tools/shared/logger.d.ts +40 -0
  228. package/dist/tools/shared/logger.d.ts.map +1 -0
  229. package/dist/tools/shared/logger.js +53 -0
  230. package/dist/tools/shared/logger.js.map +1 -0
  231. package/dist/tools/shared/prompt-sections.d.ts +3 -7
  232. package/dist/tools/shared/prompt-sections.d.ts.map +1 -1
  233. package/dist/tools/shared/prompt-sections.js +2 -26
  234. package/dist/tools/shared/prompt-sections.js.map +1 -1
  235. package/dist/tools/shared/prompt-utils.d.ts +2 -6
  236. package/dist/tools/shared/prompt-utils.d.ts.map +1 -1
  237. package/dist/tools/shared/prompt-utils.js.map +1 -1
  238. package/dist/tools/shared/types/index.d.ts +3 -0
  239. package/dist/tools/shared/types/index.d.ts.map +1 -0
  240. package/dist/tools/shared/types/index.js +3 -0
  241. package/dist/tools/shared/types/index.js.map +1 -0
  242. package/dist/tools/shared/types/prompt-sections.types.d.ts +8 -0
  243. package/dist/tools/shared/types/prompt-sections.types.d.ts.map +1 -0
  244. package/dist/tools/shared/types/prompt-sections.types.js +28 -0
  245. package/dist/tools/shared/types/prompt-sections.types.js.map +1 -0
  246. package/dist/tools/shared/types/prompt-utils.types.d.ts +7 -0
  247. package/dist/tools/shared/types/prompt-utils.types.d.ts.map +1 -0
  248. package/dist/tools/shared/types/prompt-utils.types.js +3 -0
  249. package/dist/tools/shared/types/prompt-utils.types.js.map +1 -0
  250. package/dist/tools/sprint-timeline-calculator.d.ts.map +1 -1
  251. package/dist/tools/sprint-timeline-calculator.js +134 -28
  252. package/dist/tools/sprint-timeline-calculator.js.map +1 -1
  253. 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
- // Calculate score
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
- score -= issues.length * 10;
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 >= 90)
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 >= 60)
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
- nextSteps.push("Address the identified issues in order of priority");
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,