generateProjectSummary method

Future<String> generateProjectSummary(
  1. String path
)

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();
}