run method

  1. @override
Future<void> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<void> run() async {
  logger.info('Mapping existing repository...');

  final currentDir = Directory.current;
  final allFiles = currentDir
      .listSync(recursive: true)
      .whereType<File>()
      .where(
        (f) => !f.path.contains('.git/') && !f.path.contains('.spectra/'),
      );

  final fileStructure = allFiles
      .map((f) => f.path.replaceFirst(currentDir.path, ''))
      .toList();

  // Use planning provider for architecture analysis
  final provider = await _llmService.getProviderForUsage(
    LLMUsageType.planning,
  );
  if (provider == null) {
    logger.err('No planning provider configured.');
    return;
  }

  logger.info(
    'Analyzing architecture using ${provider.name} (Strategic Analysis)...',
  );

  final prompt =
      '''
Analyze the following file structure and summarize the project's tech stack, architecture, and core modules.
FILE STRUCTURE:
${fileStructure.join('\n')}

Return a markdown summary with sections: ## Tech Stack, ## Architecture, ## Core Modules.
''';

  try {
    final analysis = await provider.generateResponse(prompt);

    logger.info('\n--- Analysis Results ---\n');
    logger.info(analysis);

    final confirm = Confirm(
      prompt: 'Generate .spectra context based on this analysis?',
    ).interact();

    if (confirm) {
      _generateSpectraFromMap(analysis);
      logger.success('Spectra context generated from repository map!');
    }
  } catch (e) {
    logger.err('Error mapping repository: $e');
  }
}