generateProjectSummary method
Generates a human-readable project summary suitable for system prompts.
Implementation
Future<String> generateProjectSummary(String path) async {
final info = await detectProject(path);
final buf = StringBuffer();
buf.writeln('Project: ${info.name}');
buf.writeln('Type: ${info.type.name}');
if (info.framework != ProjectFramework.none) {
buf.writeln('Framework: ${info.framework.name}');
}
if (info.packageManager != null) {
buf.writeln('Package Manager: ${info.packageManager!.name}');
}
if (info.version != null) {
buf.writeln('Version: ${info.version}');
}
if (info.description != null) {
buf.writeln('Description: ${info.description}');
}
buf.writeln('Dependencies: ${info.dependencyCount}');
buf.writeln('Dev Dependencies: ${info.devDependencyCount}');
if (info.entryPoints.isNotEmpty) {
buf.writeln('Entry Points: ${info.entryPoints.join(", ")}');
}
if (info.testCommand != null) {
buf.writeln('Test Command: ${info.testCommand}');
}
if (info.buildCommand != null) {
buf.writeln('Build Command: ${info.buildCommand}');
}
if (info.scripts.isNotEmpty) {
buf.writeln('Scripts: ${info.scripts.join(", ")}');
}
// Language breakdown.
try {
final languages = await getProjectLanguages(path);
if (languages.isNotEmpty) {
buf.writeln('Languages:');
final sorted = languages.entries.toList()
..sort((a, b) => b.value.lineCount.compareTo(a.value.lineCount));
for (final entry in sorted.take(8)) {
buf.writeln(
' ${entry.key}: ${entry.value.fileCount} files, '
'${entry.value.lineCount} lines '
'(${entry.value.percentage.toStringAsFixed(1)}%)',
);
}
}
} catch (_) {
// Non-critical.
}
return buf.toString();
}