mcp-ai-agent-guidelines
Version:
A comprehensive Model Context Protocol server providing advanced tools, resources, and prompts for implementing AI agent best practices
106 lines • 4.3 kB
JavaScript
import { BaseDiagramHandler } from "./base.handler.js";
/**
* Class diagram handler.
* Generates UML class diagrams showing class structures and relationships.
*/
export class ClassHandler extends BaseDiagramHandler {
diagramType = "class";
generate(description, theme, _advancedFeatures) {
const lines = ["classDiagram"];
if (theme)
lines.unshift(`%%{init: {'theme':'${theme}'}}%%`);
// Parse description to extract classes and relationships
const { classes, relationships } = this.parseClassDescription(description);
if (classes.length > 0) {
// Add parsed classes
for (const cls of classes) {
if (cls.properties.length > 0 || cls.methods.length > 0) {
lines.push(`class ${cls.name} {`);
for (const prop of cls.properties) {
lines.push(` ${prop}`);
}
for (const method of cls.methods) {
lines.push(` ${method}`);
}
lines.push("}");
}
else {
lines.push(`class ${cls.name}`);
}
}
// Add relationships
for (const rel of relationships) {
lines.push(rel);
}
}
else {
// Fallback to default template
lines.push("class User {", " +String name", " +String email", " +login()", " +logout()", "}", "class System {", " +processRequest()", " +validateUser()", "}", "User --> System : uses");
}
return lines.join("\n");
}
parseClassDescription(description) {
const classes = [];
const relationships = [];
const classNames = new Set();
// Extract class names (capitalized words or explicit mentions)
const words = description.split(/\s+/);
for (const word of words) {
const clean = word.replace(/[^a-zA-Z]/g, "");
if (clean.length > 2 && clean[0] === clean[0].toUpperCase()) {
classNames.add(clean);
}
}
// Look for common class-related keywords
const commonClasses = [
"User",
"Product",
"Order",
"Customer",
"Account",
"Item",
"Service",
"Manager",
];
for (const cls of commonClasses) {
if (description.toLowerCase().includes(cls.toLowerCase())) {
classNames.add(cls);
}
}
// Create class definitions
for (const name of classNames) {
const properties = [];
const methods = [];
// Extract properties (look for "has", "contains", "with" patterns)
const lower = description.toLowerCase();
if (lower.includes(`${name.toLowerCase()} has`) ||
lower.includes(`${name.toLowerCase()} contains`)) {
properties.push("+String id");
properties.push("+String name");
}
// Extract methods (look for action verbs)
if (lower.includes(`${name.toLowerCase()} can`) ||
lower.includes(`${name.toLowerCase()} does`)) {
methods.push("+process()");
}
classes.push({ name, properties, methods });
}
// Extract relationships
const classArray = Array.from(classNames);
for (let i = 0; i < classArray.length - 1; i++) {
const lower = description.toLowerCase();
const cls1 = classArray[i].toLowerCase();
const cls2 = classArray[i + 1].toLowerCase();
if (lower.includes(`${cls1} has ${cls2}`) ||
lower.includes(`${cls1} contains ${cls2}`)) {
relationships.push(`${classArray[i]} --> ${classArray[i + 1]} : has`);
}
else if (lower.includes(`${cls1} uses ${cls2}`) ||
lower.includes(`${cls1} depends on ${cls2}`)) {
relationships.push(`${classArray[i]} --> ${classArray[i + 1]} : uses`);
}
}
return { classes, relationships };
}
}
//# sourceMappingURL=class.handler.js.map