1315 lines
36 KiB
Markdown
Executable File
1315 lines
36 KiB
Markdown
Executable File
# API Reference
|
|
|
|
## Table of Contents
|
|
|
|
- [Core Components](#core-components)
|
|
- [BaseAIPlugin](#baseaiplugin)
|
|
- [IAIPlugin Interface](#iaiplugin-interface)
|
|
- [AIPluginResult](#aipluginresult)
|
|
- [Pipeline Architecture](#pipeline-architecture)
|
|
- [RefactoringPipeline](#refactoringpipeline)
|
|
- [RefactoringPipelineBuilder](#refactoringpipelinebuilder)
|
|
- [IRefactoringStage](#irefactoringstage)
|
|
- [Configuration Management](#configuration-management)
|
|
- [PluginConfigurationManager](#pluginconfigurationmanager)
|
|
- [Configuration Classes](#configuration-classes)
|
|
- [Caching Infrastructure](#caching-infrastructure)
|
|
- [SyntaxTreeCache](#syntaxtreecache)
|
|
- [AnalysisCache](#analysiscache)
|
|
- [Performance Components](#performance-components)
|
|
- [MemoryEfficientFileProcessor](#memoryefficientfileprocessor)
|
|
- [AdaptiveConcurrencyManager](#adaptiveconcurrencymanager)
|
|
- [Security Components](#security-components)
|
|
- [SecurePathValidator](#securepathvalidator)
|
|
- [InputSanitizer](#inputsanitizer)
|
|
- [Telemetry & Monitoring](#telemetry--monitoring)
|
|
- [RefactoringTelemetry](#refactoringtelemetry)
|
|
- [SystemPerformanceMonitor](#systemperformancemonitor)
|
|
- [Error Handling](#error-handling)
|
|
- [CentralizedErrorHandler](#centralizederrorhandler)
|
|
- [RefactoringException](#refactoringexception)
|
|
- [Refactoring Plugins](#refactoring-plugins)
|
|
- [Core Plugin Types](#core-plugin-types)
|
|
- [Git Repository Management Plugins](#git-repository-management-plugins)
|
|
- [Git Repository Data Models](#git-repository-data-models)
|
|
|
|
---
|
|
|
|
## Core Components
|
|
|
|
### BaseAIPlugin
|
|
|
|
Abstract base class providing common functionality for all refactoring plugins.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Core
|
|
```
|
|
|
|
#### Inheritance
|
|
```csharp
|
|
public abstract class BaseAIPlugin : IAIPlugin, IDisposable
|
|
```
|
|
|
|
#### Constructor
|
|
```csharp
|
|
protected BaseAIPlugin(
|
|
IParameterExtractor? parameterExtractor = null,
|
|
CentralizedErrorHandler? errorHandler = null,
|
|
ILogger? logger = null,
|
|
ISyntaxTreeCache? syntaxTreeCache = null,
|
|
IAnalysisCache? analysisCache = null,
|
|
IMemoryPressureMonitor? memoryMonitor = null)
|
|
```
|
|
|
|
#### Abstract Properties
|
|
```csharp
|
|
public abstract IReadOnlyDictionary<string, Type> SupportedParameters { get; }
|
|
```
|
|
|
|
#### Abstract Methods
|
|
```csharp
|
|
protected abstract Task<AIPluginResult> ExecuteInternalAsync(IReadOnlyDictionary<string, object> parameters);
|
|
```
|
|
|
|
#### Public Methods
|
|
```csharp
|
|
public virtual async Task<AIPluginResult> ExecuteAsync(IReadOnlyDictionary<string, object> parameters)
|
|
```
|
|
|
|
#### Protected Helper Methods
|
|
|
|
##### Parameter Extraction
|
|
```csharp
|
|
protected T GetParameter<T>(IReadOnlyDictionary<string, object> parameters, string key, T defaultValue = default!)
|
|
protected T GetParameter<T>(IReadOnlyDictionary<string, object> parameters, string[] keys, T defaultValue = default!)
|
|
```
|
|
|
|
##### File Processing
|
|
```csharp
|
|
protected async Task<ProcessingResult> ProcessFileAsync(string filePath, CancellationToken cancellationToken = default)
|
|
protected async Task<Microsoft.CodeAnalysis.SyntaxTree> GetSyntaxTreeAsync(string filePath, CancellationToken cancellationToken = default)
|
|
```
|
|
|
|
##### Caching
|
|
```csharp
|
|
protected async Task<TResult> GetOrAnalyzeAsync<TResult>(
|
|
string filePath,
|
|
Func<Task<TResult>> analyzer,
|
|
CancellationToken cancellationToken = default) where TResult : class
|
|
```
|
|
|
|
##### Result Creation
|
|
```csharp
|
|
protected AIPluginResult CreateSuccessResult(object data, string? message = null)
|
|
protected AIPluginResult CreateErrorResult(string message, Exception? exception = null)
|
|
protected AIPluginResult CreateValidationErrorResult(string parameterName, string validationMessage)
|
|
```
|
|
|
|
##### Multi-File Processing
|
|
```csharp
|
|
protected async Task<TResult[]> ProcessMultipleFilesAsync<TResult>(
|
|
IEnumerable<string> filePaths,
|
|
Func<string, Task<TResult>> processor,
|
|
CancellationToken cancellationToken = default)
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
public class CustomAnalysisPlugin : BaseAIPlugin
|
|
{
|
|
public override IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["filePath"] = typeof(string),
|
|
["analysisOptions"] = typeof(AnalysisOptions)
|
|
};
|
|
|
|
protected override async Task<AIPluginResult> ExecuteInternalAsync(
|
|
IReadOnlyDictionary<string, object> parameters)
|
|
{
|
|
var filePath = GetParameter<string>(parameters, "filePath");
|
|
var options = GetParameter<AnalysisOptions>(parameters, "analysisOptions", new AnalysisOptions());
|
|
|
|
var syntaxTree = await GetSyntaxTreeAsync(filePath);
|
|
var result = await GetOrAnalyzeAsync(filePath, () => AnalyzeCode(syntaxTree, options));
|
|
|
|
return CreateSuccessResult(result, "Analysis completed successfully");
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### IAIPlugin Interface
|
|
|
|
Core interface for all AI refactoring plugins.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin
|
|
```
|
|
|
|
#### Interface Definition
|
|
```csharp
|
|
public interface IAIPlugin
|
|
{
|
|
Task<AIPluginResult> ExecuteAsync(IReadOnlyDictionary<string, object> parameters);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### AIPluginResult
|
|
|
|
Represents the result of a plugin execution.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin
|
|
```
|
|
|
|
#### Properties
|
|
```csharp
|
|
public class AIPluginResult
|
|
{
|
|
public bool Success { get; set; }
|
|
public string Message { get; set; }
|
|
public object? Data { get; set; }
|
|
public Dictionary<string, object> Metadata { get; set; }
|
|
public Exception? Exception { get; set; }
|
|
}
|
|
```
|
|
|
|
#### Factory Methods
|
|
```csharp
|
|
public static AIPluginResult Success(object data, string message = "Operation completed successfully")
|
|
public static AIPluginResult Error(string message, Exception? exception = null)
|
|
```
|
|
|
|
---
|
|
|
|
## Pipeline Architecture
|
|
|
|
### RefactoringPipeline
|
|
|
|
Orchestrates multi-stage refactoring workflows with error handling and statistics.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Pipeline
|
|
```
|
|
|
|
#### Constructor
|
|
```csharp
|
|
public RefactoringPipeline(
|
|
ILogger<RefactoringPipeline>? logger = null,
|
|
IRefactoringTelemetry? telemetry = null)
|
|
```
|
|
|
|
#### Methods
|
|
|
|
##### Pipeline Execution
|
|
```csharp
|
|
public async Task<PipelineResult> ExecuteAsync(
|
|
RefactoringContext context,
|
|
CancellationToken cancellationToken = default)
|
|
```
|
|
|
|
##### Stage Management
|
|
```csharp
|
|
public void AddStage(IRefactoringStage stage)
|
|
public void RemoveStage(string stageName)
|
|
public void ConfigureStage(string stageName, IReadOnlyDictionary<string, object> configuration)
|
|
public IEnumerable<IRefactoringStage> GetStages()
|
|
```
|
|
|
|
##### Statistics
|
|
```csharp
|
|
public PipelineStatistics GetStatistics()
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var pipeline = new RefactoringPipeline(logger, telemetry);
|
|
pipeline.AddStage(new ValidationStage());
|
|
pipeline.AddStage(new FileDiscoveryStage());
|
|
pipeline.AddStage(new OperationExecutionStage());
|
|
|
|
var context = new RefactoringContext
|
|
{
|
|
ProjectPath = "/path/to/project",
|
|
Operations = { "analyze", "format" }
|
|
};
|
|
|
|
var result = await pipeline.ExecuteAsync(context);
|
|
```
|
|
|
|
---
|
|
|
|
### RefactoringPipelineBuilder
|
|
|
|
Fluent builder for constructing refactoring pipelines.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Pipeline
|
|
```
|
|
|
|
#### Methods
|
|
|
|
##### Configuration
|
|
```csharp
|
|
public RefactoringPipelineBuilder WithLogger(ILogger<RefactoringPipeline> logger)
|
|
public RefactoringPipelineBuilder WithTelemetry(IRefactoringTelemetry telemetry)
|
|
```
|
|
|
|
##### Stage Addition
|
|
```csharp
|
|
public RefactoringPipelineBuilder AddStage(IRefactoringStage stage)
|
|
public RefactoringPipelineBuilder AddValidation()
|
|
public RefactoringPipelineBuilder AddFileDiscovery()
|
|
public RefactoringPipelineBuilder AddOperationExecution(IServiceProvider? serviceProvider = null)
|
|
```
|
|
|
|
##### Build
|
|
```csharp
|
|
public IRefactoringPipeline Build()
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var pipeline = new RefactoringPipelineBuilder()
|
|
.WithLogger(logger)
|
|
.WithTelemetry(telemetry)
|
|
.AddValidation()
|
|
.AddFileDiscovery()
|
|
.AddOperationExecution()
|
|
.Build();
|
|
```
|
|
|
|
---
|
|
|
|
### IRefactoringStage
|
|
|
|
Interface for pipeline stages.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Pipeline
|
|
```
|
|
|
|
#### Interface Definition
|
|
```csharp
|
|
public interface IRefactoringStage
|
|
{
|
|
string Name { get; }
|
|
int Priority { get; }
|
|
bool IsEnabled { get; set; }
|
|
|
|
Task<RefactoringContext> ProcessAsync(RefactoringContext context, CancellationToken cancellationToken = default);
|
|
Task<bool> CanProcessAsync(RefactoringContext context);
|
|
Task InitializeAsync(IReadOnlyDictionary<string, object> configuration);
|
|
Task CleanupAsync();
|
|
}
|
|
```
|
|
|
|
#### Base Implementation
|
|
```csharp
|
|
public abstract class BaseRefactoringStage : IRefactoringStage
|
|
{
|
|
protected readonly ILogger? Logger;
|
|
|
|
public abstract string Name { get; }
|
|
public abstract int Priority { get; }
|
|
public bool IsEnabled { get; set; } = true;
|
|
|
|
public abstract Task<RefactoringContext> ProcessAsync(RefactoringContext context, CancellationToken cancellationToken = default);
|
|
public virtual Task<bool> CanProcessAsync(RefactoringContext context) => Task.FromResult(IsEnabled);
|
|
public virtual Task InitializeAsync(IReadOnlyDictionary<string, object> configuration) => Task.CompletedTask;
|
|
public virtual Task CleanupAsync() => Task.CompletedTask;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration Management
|
|
|
|
### PluginConfigurationManager
|
|
|
|
Manages hierarchical configuration loading and caching.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Configuration
|
|
```
|
|
|
|
#### Interface
|
|
```csharp
|
|
public interface IPluginConfigurationManager
|
|
{
|
|
Task<TConfig> LoadConfigurationAsync<TConfig>(
|
|
string pluginName,
|
|
string? projectPath = null,
|
|
CancellationToken cancellationToken = default) where TConfig : class, new();
|
|
|
|
Task SaveConfigurationAsync<TConfig>(
|
|
string pluginName,
|
|
TConfig configuration,
|
|
string? projectPath = null,
|
|
CancellationToken cancellationToken = default) where TConfig : class;
|
|
|
|
Task<bool> ConfigurationExistsAsync(
|
|
string pluginName,
|
|
string? projectPath = null,
|
|
CancellationToken cancellationToken = default);
|
|
|
|
void InvalidateCache(string pluginName, string? projectPath = null);
|
|
ConfigurationSources GetConfigurationSources(string pluginName, string? projectPath = null);
|
|
}
|
|
```
|
|
|
|
#### Factory Access
|
|
```csharp
|
|
public static class ConfigurationManagerFactory
|
|
{
|
|
public static IPluginConfigurationManager Default { get; }
|
|
public static IPluginConfigurationManager Create(ILogger<PluginConfigurationManager>? logger = null);
|
|
}
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var configManager = ConfigurationManagerFactory.Default;
|
|
var config = await configManager.LoadConfigurationAsync<RefactoringConfiguration>("CodeAnalysis");
|
|
|
|
// Configuration automatically merges: project -> user -> global
|
|
Console.WriteLine($"Complexity threshold: {config.CodeAnalysis.ComplexityThreshold}");
|
|
```
|
|
|
|
---
|
|
|
|
### Configuration Classes
|
|
|
|
#### RefactoringConfiguration
|
|
```csharp
|
|
public class RefactoringConfiguration
|
|
{
|
|
public CodeAnalysisConfiguration CodeAnalysis { get; set; } = new();
|
|
public FormattingConfiguration Formatting { get; set; } = new();
|
|
public DocumentationConfiguration Documentation { get; set; } = new();
|
|
public NamingConfiguration Naming { get; set; } = new();
|
|
public ExclusionsConfiguration Exclusions { get; set; } = new();
|
|
public PerformanceConfiguration Performance { get; set; } = new();
|
|
}
|
|
```
|
|
|
|
#### CodeAnalysisConfiguration
|
|
```csharp
|
|
public class CodeAnalysisConfiguration
|
|
{
|
|
public int ComplexityThreshold { get; set; } = 10;
|
|
public int MaxMethodLength { get; set; } = 50;
|
|
public int MaxClassSize { get; set; } = 500;
|
|
public AnalysisDepth AnalysisDepth { get; set; } = AnalysisDepth.Detailed;
|
|
public List<string> EnabledRules { get; set; } = new() { "long-method", "god-class", "duplicate-code" };
|
|
public List<string> DisabledRules { get; set; } = new();
|
|
public bool IncludeComplexity { get; set; } = true;
|
|
public bool IncludeCodeSmells { get; set; } = true;
|
|
public bool IncludeSuggestions { get; set; } = true;
|
|
}
|
|
```
|
|
|
|
#### PerformanceConfiguration
|
|
```csharp
|
|
public class PerformanceConfiguration
|
|
{
|
|
public int MaxConcurrency { get; set; } = 3;
|
|
public int MaxFilesPerProject { get; set; } = 100;
|
|
public int CacheExpirationMinutes { get; set; } = 30;
|
|
public bool EnableMemoryOptimization { get; set; } = true;
|
|
public bool EnableProgressReporting { get; set; } = true;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Caching Infrastructure
|
|
|
|
### SyntaxTreeCache
|
|
|
|
File-system-aware caching for Roslyn syntax trees.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Caching
|
|
```
|
|
|
|
#### Interface
|
|
```csharp
|
|
public interface ISyntaxTreeCache
|
|
{
|
|
Task<SyntaxTree> GetOrCreateAsync(string filePath, CancellationToken cancellationToken = default);
|
|
Task<SyntaxTree?> GetAsync(string filePath, CancellationToken cancellationToken = default);
|
|
Task SetAsync(string filePath, SyntaxTree syntaxTree, CancellationToken cancellationToken = default);
|
|
Task InvalidateAsync(string filePath);
|
|
Task ClearAsync();
|
|
CacheStatistics GetStatistics();
|
|
}
|
|
```
|
|
|
|
#### Factory Access
|
|
```csharp
|
|
public static class SyntaxTreeCacheFactory
|
|
{
|
|
public static ISyntaxTreeCache Default { get; }
|
|
public static ISyntaxTreeCache Create(
|
|
TimeSpan? expiration = null,
|
|
long? maxSizeBytes = null,
|
|
ILogger<SyntaxTreeCache>? logger = null);
|
|
}
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var cache = SyntaxTreeCacheFactory.Default;
|
|
var syntaxTree = await cache.GetOrCreateAsync("/path/to/file.cs");
|
|
|
|
// Cache automatically invalidates when file changes
|
|
```
|
|
|
|
---
|
|
|
|
### AnalysisCache
|
|
|
|
Generic caching for analysis results with content-hash based keys.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Caching
|
|
```
|
|
|
|
#### Interface
|
|
```csharp
|
|
public interface IAnalysisCache
|
|
{
|
|
Task<TResult> GetOrAnalyzeAsync<TResult>(
|
|
string filePath,
|
|
Func<Task<TResult>> analyzer,
|
|
CancellationToken cancellationToken = default) where TResult : class;
|
|
|
|
Task<TResult?> GetAsync<TResult>(string filePath, CancellationToken cancellationToken = default) where TResult : class;
|
|
Task SetAsync<TResult>(string filePath, TResult result, CancellationToken cancellationToken = default) where TResult : class;
|
|
Task InvalidateAsync(string filePath);
|
|
Task ClearAsync();
|
|
CacheStatistics GetStatistics();
|
|
}
|
|
```
|
|
|
|
#### Factory Access
|
|
```csharp
|
|
public static class AnalysisCacheFactory
|
|
{
|
|
public static IAnalysisCache Default { get; }
|
|
public static IAnalysisCache Create(
|
|
TimeSpan? memoryExpiration = null,
|
|
TimeSpan? diskExpiration = null,
|
|
long? maxMemorySizeBytes = null,
|
|
string? diskCacheDirectory = null,
|
|
ILogger<AnalysisCache>? logger = null);
|
|
}
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var cache = AnalysisCacheFactory.Default;
|
|
var analysisResult = await cache.GetOrAnalyzeAsync("/path/to/file.cs", async () =>
|
|
{
|
|
// Expensive analysis operation
|
|
return await PerformComplexAnalysis();
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## Performance Components
|
|
|
|
### MemoryEfficientFileProcessor
|
|
|
|
Provides memory-efficient file processing with streaming support.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Performance
|
|
```
|
|
|
|
#### Constructor
|
|
```csharp
|
|
public MemoryEfficientFileProcessor(IMemoryPressureMonitor memoryMonitor)
|
|
```
|
|
|
|
#### Methods
|
|
```csharp
|
|
public async Task<ProcessingResult> ProcessLargeFileAsync(string filePath, CancellationToken cancellationToken = default)
|
|
public async Task<ProcessingResult> ProcessFileInMemoryAsync(string filePath, CancellationToken cancellationToken = default)
|
|
public async Task<ProcessingResult> ProcessFileStreamingAsync(string filePath, CancellationToken cancellationToken = default)
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var processor = new MemoryEfficientFileProcessor(new MemoryPressureMonitor());
|
|
var result = await processor.ProcessLargeFileAsync("/path/to/large-file.cs");
|
|
|
|
// Automatically uses streaming for files > 50MB or under memory pressure
|
|
```
|
|
|
|
---
|
|
|
|
### AdaptiveConcurrencyManager
|
|
|
|
Manages dynamic concurrency based on system resources.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Performance
|
|
```
|
|
|
|
#### Extension Methods
|
|
```csharp
|
|
public static async Task<T[]> ProcessWithAdaptiveConcurrencyAsync<T>(
|
|
this IEnumerable<string> filePaths,
|
|
Func<string, Task<T>> processor,
|
|
CancellationToken cancellationToken = default)
|
|
|
|
public static async Task<T[]> ProcessConcurrentlyAsync<T>(
|
|
this IEnumerable<Func<Task<T>>> tasks,
|
|
CancellationToken cancellationToken = default)
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var filePaths = Directory.GetFiles("/path/to/project", "*.cs");
|
|
var results = await filePaths.ProcessWithAdaptiveConcurrencyAsync(async filePath =>
|
|
{
|
|
return await AnalyzeFile(filePath);
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## Security Components
|
|
|
|
### SecurePathValidator
|
|
|
|
Provides comprehensive path validation and security checks.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Security
|
|
```
|
|
|
|
#### Static Methods
|
|
```csharp
|
|
public static string ValidatePath(string inputPath, string? basePath = null)
|
|
public static string ValidateAndNormalizePath(string inputPath, string basePath)
|
|
public static bool IsPathWithinBase(string fullPath, string basePath)
|
|
public static bool IsFilePathSafeForAnalysis(string filePath)
|
|
public static bool HasSafeFileExtension(string filePath, IEnumerable<string>? allowedExtensions = null)
|
|
public static bool IsInDangerousDirectory(string filePath)
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
try
|
|
{
|
|
var safePath = SecurePathValidator.ValidatePath(userInputPath);
|
|
var isAnalysisSafe = SecurePathValidator.IsFilePathSafeForAnalysis(safePath);
|
|
|
|
if (isAnalysisSafe)
|
|
{
|
|
// Proceed with file processing
|
|
}
|
|
}
|
|
catch (SecurityException ex)
|
|
{
|
|
// Handle security violation
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### InputSanitizer
|
|
|
|
Provides input validation and sanitization for various attack vectors.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Security
|
|
```
|
|
|
|
#### Static Methods
|
|
```csharp
|
|
public static bool IsInputSafe(this string input)
|
|
public static string SanitizeInput(string input)
|
|
public static bool ContainsXssPatterns(string input)
|
|
public static bool ContainsSqlInjectionPatterns(string input)
|
|
public static bool ContainsCommandInjectionPatterns(string input)
|
|
public static string SanitizeFileName(string fileName)
|
|
public static string CreateSafeIdentifier(string input)
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var userInput = GetUserInput();
|
|
|
|
if (userInput.IsInputSafe())
|
|
{
|
|
var sanitized = InputSanitizer.SanitizeInput(userInput);
|
|
// Use sanitized input
|
|
}
|
|
else
|
|
{
|
|
// Reject unsafe input
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Telemetry & Monitoring
|
|
|
|
### RefactoringTelemetry
|
|
|
|
OpenTelemetry-compatible telemetry system for monitoring refactoring operations.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Telemetry
|
|
```
|
|
|
|
#### Interface
|
|
```csharp
|
|
public interface IRefactoringTelemetry
|
|
{
|
|
Task<T> TrackOperationAsync<T>(
|
|
string operationName,
|
|
Func<Task<T>> operation,
|
|
Dictionary<string, object>? tags = null,
|
|
[CallerMemberName] string? callerName = null);
|
|
|
|
void RecordMetric(string metricName, double value, Dictionary<string, object>? tags = null);
|
|
void RecordCounter(string counterName, int value = 1, Dictionary<string, object>? tags = null);
|
|
void RecordDuration(string operationName, TimeSpan duration, Dictionary<string, object>? tags = null);
|
|
|
|
Activity? StartActivity(string activityName, Dictionary<string, object>? tags = null);
|
|
void SetActivityData(Activity? activity, string key, object value);
|
|
|
|
TelemetryStatistics GetStatistics();
|
|
void Flush();
|
|
}
|
|
```
|
|
|
|
#### Factory Access
|
|
```csharp
|
|
public static class TelemetryFactory
|
|
{
|
|
public static IRefactoringTelemetry Default { get; }
|
|
public static IRefactoringTelemetry Create(ILogger<RefactoringTelemetry>? logger = null);
|
|
public static IPerformanceMonitor PerformanceMonitor { get; }
|
|
public static IPerformanceMonitor CreatePerformanceMonitor(ILogger<SystemPerformanceMonitor>? logger = null);
|
|
}
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var telemetry = TelemetryFactory.Default;
|
|
|
|
var result = await telemetry.TrackOperationAsync("CodeAnalysis", async () =>
|
|
{
|
|
return await PerformCodeAnalysis();
|
|
});
|
|
|
|
telemetry.RecordMetric("complexity", 15.5);
|
|
telemetry.RecordCounter("files_processed", 1);
|
|
|
|
var stats = telemetry.GetStatistics();
|
|
Console.WriteLine($"Success rate: {stats.SuccessRate:P2}");
|
|
```
|
|
|
|
---
|
|
|
|
### SystemPerformanceMonitor
|
|
|
|
Real-time system performance monitoring.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Telemetry
|
|
```
|
|
|
|
#### Interface
|
|
```csharp
|
|
public interface IPerformanceMonitor
|
|
{
|
|
SystemPerformanceMetrics GetCurrentMetrics();
|
|
void StartMonitoring();
|
|
void StopMonitoring();
|
|
Task<PerformanceReport> GenerateReportAsync(TimeSpan period);
|
|
}
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var monitor = TelemetryFactory.CreatePerformanceMonitor();
|
|
monitor.StartMonitoring();
|
|
|
|
// ... perform operations ...
|
|
|
|
var report = await monitor.GenerateReportAsync(TimeSpan.FromMinutes(30));
|
|
Console.WriteLine($"Peak memory: {report.PeakMetrics.MemoryUsageBytes / 1024 / 1024}MB");
|
|
Console.WriteLine($"Average CPU: {report.AverageMetrics.CpuUsagePercent:F1}%");
|
|
|
|
monitor.StopMonitoring();
|
|
```
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
### CentralizedErrorHandler
|
|
|
|
Provides centralized error handling with recovery strategies.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Plugins
|
|
```
|
|
|
|
#### Constructor
|
|
```csharp
|
|
public CentralizedErrorHandler(IErrorHandlingService errorService)
|
|
```
|
|
|
|
#### Methods
|
|
```csharp
|
|
public void AddRecoveryStrategy(IErrorRecoveryStrategy strategy)
|
|
public async Task<AIPluginResult> HandleErrorAsync(string pluginName, string operation, Exception exception)
|
|
```
|
|
|
|
#### Global Access
|
|
```csharp
|
|
public static class GlobalErrorHandler
|
|
{
|
|
public static CentralizedErrorHandler Instance { get; }
|
|
}
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var errorHandler = GlobalErrorHandler.Instance;
|
|
errorHandler.AddRecoveryStrategy(new FileAccessRecoveryStrategy());
|
|
|
|
try
|
|
{
|
|
// Risky operation
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
var result = await errorHandler.HandleErrorAsync("MyPlugin", "ProcessFile", ex);
|
|
if (result == null)
|
|
{
|
|
// Error was recovered, continue operation
|
|
}
|
|
else
|
|
{
|
|
// Error could not be recovered, handle gracefully
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### RefactoringException
|
|
|
|
Structured exception with context information.
|
|
|
|
#### Namespace
|
|
```csharp
|
|
MarketAlly.AIPlugin.Refactoring.Plugins
|
|
```
|
|
|
|
#### Constructor
|
|
```csharp
|
|
public RefactoringException(
|
|
string pluginName,
|
|
string operation,
|
|
RefactoringErrorCode errorCode,
|
|
string message,
|
|
Exception innerException = null)
|
|
```
|
|
|
|
#### Properties
|
|
```csharp
|
|
public string PluginName { get; }
|
|
public string Operation { get; }
|
|
public RefactoringErrorCode ErrorCode { get; }
|
|
public Dictionary<string, object> Context { get; }
|
|
```
|
|
|
|
#### Error Codes
|
|
```csharp
|
|
public enum RefactoringErrorCode
|
|
{
|
|
Unknown,
|
|
InvalidInput,
|
|
FileNotFound,
|
|
DirectoryNotFound,
|
|
FileAccessDenied,
|
|
ParseError,
|
|
AnalysisError,
|
|
ConfigurationError,
|
|
TimeoutExceeded,
|
|
OperationCancelled,
|
|
InsufficientMemory,
|
|
GitError,
|
|
NetworkError,
|
|
ApiError,
|
|
SecurityViolation
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Refactoring Plugins
|
|
|
|
### Core Plugin Types
|
|
|
|
#### CodeAnalysisPlugin
|
|
```csharp
|
|
public class CodeAnalysisPlugin : BaseAIPlugin
|
|
{
|
|
public override IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["filePath"] = typeof(string),
|
|
["projectPath"] = typeof(string),
|
|
["analysisDepth"] = typeof(string),
|
|
["includeComplexity"] = typeof(bool),
|
|
["complexityThreshold"] = typeof(int)
|
|
};
|
|
}
|
|
```
|
|
|
|
#### CodeFormatterPlugin
|
|
```csharp
|
|
public class CodeFormatterPlugin : BaseAIPlugin
|
|
{
|
|
public override IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["filePath"] = typeof(string),
|
|
["style"] = typeof(string),
|
|
["indentationSize"] = typeof(int),
|
|
["organizeUsings"] = typeof(bool),
|
|
["createBackup"] = typeof(bool)
|
|
};
|
|
}
|
|
```
|
|
|
|
#### DocumentationGeneratorPlugin
|
|
```csharp
|
|
public class DocumentationGeneratorPlugin : BaseAIPlugin
|
|
{
|
|
public override IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["filePath"] = typeof(string),
|
|
["style"] = typeof(string),
|
|
["includeExamples"] = typeof(bool),
|
|
["scope"] = typeof(string)
|
|
};
|
|
}
|
|
```
|
|
|
|
#### NamingConventionPlugin
|
|
```csharp
|
|
public class NamingConventionPlugin : BaseAIPlugin
|
|
{
|
|
public override IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["filePath"] = typeof(string),
|
|
["convention"] = typeof(string),
|
|
["checkMeaningfulness"] = typeof(bool),
|
|
["aiSuggestions"] = typeof(bool)
|
|
};
|
|
}
|
|
```
|
|
|
|
### Git Repository Management Plugins
|
|
|
|
Specialized plugins for Git repository operations including cloning, validation, status checking, and updates.
|
|
|
|
#### GitHubClonePlugin
|
|
|
|
**Plugin Name**: `github-clone`
|
|
**Description**: Clone and validate GitHub repositories for project analysis with comprehensive options.
|
|
|
|
**Namespace**: `MarketAlly.AIPlugin.Refactoring.Plugins`
|
|
|
|
**Supported Parameters**:
|
|
```csharp
|
|
public class GitHubClonePlugin : IAIPlugin
|
|
{
|
|
public IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["repository_url"] = typeof(string), // Required: GitHub repository URL
|
|
["target_path"] = typeof(string), // Required: Local clone destination
|
|
["branch"] = typeof(string), // Optional: Specific branch (defaults to detected default)
|
|
["shallow_clone"] = typeof(bool), // Optional: Enable shallow clone (default: true)
|
|
["overwrite_existing"] = typeof(bool) // Optional: Overwrite existing directory (default: false)
|
|
};
|
|
}
|
|
```
|
|
|
|
**Features**:
|
|
- Repository URL validation and accessibility checking
|
|
- Automatic default branch detection (main/master)
|
|
- Shallow cloning for faster operations
|
|
- Size and file count tracking
|
|
- Comprehensive error handling with cleanup on failure
|
|
- Timeout protection (configurable, default 30 minutes)
|
|
|
|
**Returns**: `GitCloneResult` with clone metadata, commit information, and repository statistics.
|
|
|
|
**Example Usage**:
|
|
```csharp
|
|
var cloneResult = await registry.CallFunctionAsync("github-clone", new Dictionary<string, object>
|
|
{
|
|
["repository_url"] = "https://github.com/microsoft/typescript.git",
|
|
["target_path"] = "/analysis/projects/typescript",
|
|
["branch"] = "main",
|
|
["shallow_clone"] = true,
|
|
["overwrite_existing"] = false
|
|
});
|
|
|
|
if (cloneResult.Success)
|
|
{
|
|
var data = (GitCloneResult)cloneResult.Data;
|
|
Console.WriteLine($"Cloned {data.FileCount} files ({data.SizeBytes / 1024 / 1024} MB)");
|
|
Console.WriteLine($"Latest commit: {data.CommitHash} by {data.CommitAuthor}");
|
|
}
|
|
```
|
|
|
|
#### GitHubValidatePlugin
|
|
|
|
**Plugin Name**: `github-validate`
|
|
**Description**: Validate GitHub repository accessibility and retrieve metadata without cloning.
|
|
|
|
**Namespace**: `MarketAlly.AIPlugin.Refactoring.Plugins`
|
|
|
|
**Supported Parameters**:
|
|
```csharp
|
|
public class GitHubValidatePlugin : IAIPlugin
|
|
{
|
|
public IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["repository_url"] = typeof(string) // Required: Repository URL to validate
|
|
};
|
|
}
|
|
```
|
|
|
|
**Features**:
|
|
- URL format validation
|
|
- Repository accessibility checking via `git ls-remote`
|
|
- Default branch detection
|
|
- Repository host validation (GitHub, GitLab, Bitbucket)
|
|
- Public/private status detection
|
|
- Owner and repository name parsing
|
|
|
|
**Returns**: `GitRepositoryValidation` with accessibility status and repository metadata.
|
|
|
|
**Example Usage**:
|
|
```csharp
|
|
var validateResult = await registry.CallFunctionAsync("github-validate", new Dictionary<string, object>
|
|
{
|
|
["repository_url"] = "https://github.com/dotnet/aspnetcore.git"
|
|
});
|
|
|
|
if (validateResult.Success)
|
|
{
|
|
var validation = (GitRepositoryValidation)validateResult.Data;
|
|
if (validation.IsValid)
|
|
{
|
|
Console.WriteLine($"Repository: {validation.Owner}/{validation.Repository}");
|
|
Console.WriteLine($"Default branch: {validation.DefaultBranch}");
|
|
Console.WriteLine($"Host: {validation.RepositoryHost}");
|
|
}
|
|
}
|
|
```
|
|
|
|
#### GitHubStatusPlugin
|
|
|
|
**Plugin Name**: `github-status`
|
|
**Description**: Get comprehensive status information for cloned repositories including commit details and remote updates.
|
|
|
|
**Namespace**: `MarketAlly.AIPlugin.Refactoring.Plugins`
|
|
|
|
**Supported Parameters**:
|
|
```csharp
|
|
public class GitHubStatusPlugin : IAIPlugin
|
|
{
|
|
public IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["repository_path"] = typeof(string), // Required: Local repository path
|
|
["check_remote_updates"] = typeof(bool) // Optional: Check for remote updates (default: true)
|
|
};
|
|
}
|
|
```
|
|
|
|
**Features**:
|
|
- Current branch detection
|
|
- Latest commit information (hash, message, author, date)
|
|
- Working directory cleanliness check
|
|
- Remote update availability checking
|
|
- Repository validity verification
|
|
- Comprehensive Git status output
|
|
|
|
**Returns**: `GitRepositoryStatus` with complete repository state information.
|
|
|
|
**Example Usage**:
|
|
```csharp
|
|
var statusResult = await registry.CallFunctionAsync("github-status", new Dictionary<string, object>
|
|
{
|
|
["repository_path"] = "/local/projects/my-repo",
|
|
["check_remote_updates"] = true
|
|
});
|
|
|
|
if (statusResult.Success)
|
|
{
|
|
var status = (GitRepositoryStatus)statusResult.Data;
|
|
Console.WriteLine($"Branch: {status.CurrentBranch}");
|
|
Console.WriteLine($"Latest commit: {status.LatestCommitSha[..8]} - {status.LatestCommitMessage}");
|
|
Console.WriteLine($"Clean: {status.IsClean}, Remote updates: {status.HasRemoteUpdates}");
|
|
}
|
|
```
|
|
|
|
#### GitHubUpdatePlugin
|
|
|
|
**Plugin Name**: `github-update`
|
|
**Description**: Pull latest changes from remote repository with conflict resolution options.
|
|
|
|
**Namespace**: `MarketAlly.AIPlugin.Refactoring.Plugins`
|
|
|
|
**Supported Parameters**:
|
|
```csharp
|
|
public class GitHubUpdatePlugin : IAIPlugin
|
|
{
|
|
public IReadOnlyDictionary<string, Type> SupportedParameters =>
|
|
new Dictionary<string, Type>
|
|
{
|
|
["repository_path"] = typeof(string), // Required: Local repository path
|
|
["force_update"] = typeof(bool) // Optional: Force update despite local changes (default: false)
|
|
};
|
|
}
|
|
```
|
|
|
|
**Features**:
|
|
- Automatic `git pull` execution
|
|
- Uncommitted changes detection
|
|
- Optional stashing of local changes before update
|
|
- Commit hash comparison (before/after)
|
|
- Changed files counting
|
|
- Timeout protection (default 10 minutes)
|
|
- Comprehensive error handling
|
|
|
|
**Returns**: `GitUpdateResult` with update statistics and change information.
|
|
|
|
**Example Usage**:
|
|
```csharp
|
|
var updateResult = await registry.CallFunctionAsync("github-update", new Dictionary<string, object>
|
|
{
|
|
["repository_path"] = "/local/projects/my-repo",
|
|
["force_update"] = false
|
|
});
|
|
|
|
if (updateResult.Success)
|
|
{
|
|
var update = (GitUpdateResult)updateResult.Data;
|
|
if (update.HasChanges)
|
|
{
|
|
Console.WriteLine($"Updated from {update.PreviousCommitHash[..8]} to {update.NewCommitHash[..8]}");
|
|
Console.WriteLine($"Changed files: {update.ChangedFiles}");
|
|
if (update.StashedChanges)
|
|
{
|
|
Console.WriteLine("Local changes were stashed");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("Repository is up to date");
|
|
}
|
|
}
|
|
```
|
|
|
|
### Git Repository Data Models
|
|
|
|
#### GitCloneResult
|
|
```csharp
|
|
public class GitCloneResult
|
|
{
|
|
public bool Success { get; set; }
|
|
public string? Error { get; set; }
|
|
public string? Warning { get; set; }
|
|
public string RepositoryUrl { get; set; } = string.Empty;
|
|
public string TargetPath { get; set; } = string.Empty;
|
|
public string Branch { get; set; } = string.Empty;
|
|
public string CommitHash { get; set; } = string.Empty;
|
|
public string CommitMessage { get; set; } = string.Empty;
|
|
public string CommitAuthor { get; set; } = string.Empty;
|
|
public DateTime ClonedAt { get; set; }
|
|
public long SizeBytes { get; set; }
|
|
public int FileCount { get; set; }
|
|
}
|
|
```
|
|
|
|
#### GitRepositoryValidation
|
|
```csharp
|
|
public class GitRepositoryValidation
|
|
{
|
|
public bool IsValid { get; set; }
|
|
public bool IsAccessible { get; set; }
|
|
public string RepositoryUrl { get; set; } = string.Empty;
|
|
public string? RepositoryHost { get; set; }
|
|
public string? Owner { get; set; }
|
|
public string? Repository { get; set; }
|
|
public string? DefaultBranch { get; set; }
|
|
public bool IsPublic { get; set; }
|
|
public string? Error { get; set; }
|
|
}
|
|
```
|
|
|
|
#### GitRepositoryStatus
|
|
```csharp
|
|
public class GitRepositoryStatus
|
|
{
|
|
public bool IsValid { get; set; }
|
|
public string RepositoryPath { get; set; } = string.Empty;
|
|
public string CurrentBranch { get; set; } = string.Empty;
|
|
public string LatestCommitSha { get; set; } = string.Empty;
|
|
public string LatestCommitMessage { get; set; } = string.Empty;
|
|
public string LatestCommitAuthor { get; set; } = string.Empty;
|
|
public string LatestCommitDate { get; set; } = string.Empty;
|
|
public bool IsClean { get; set; }
|
|
public string StatusOutput { get; set; } = string.Empty;
|
|
public bool HasRemoteUpdates { get; set; }
|
|
public string? Error { get; set; }
|
|
}
|
|
```
|
|
|
|
#### GitUpdateResult
|
|
```csharp
|
|
public class GitUpdateResult
|
|
{
|
|
public bool Success { get; set; }
|
|
public string? Error { get; set; }
|
|
public string RepositoryPath { get; set; } = string.Empty;
|
|
public string PreviousCommitHash { get; set; } = string.Empty;
|
|
public string NewCommitHash { get; set; } = string.Empty;
|
|
public DateTime UpdatedAt { get; set; }
|
|
public bool HasChanges { get; set; }
|
|
public int ChangedFiles { get; set; }
|
|
public bool StashedChanges { get; set; }
|
|
}
|
|
```
|
|
|
|
### Plugin Registration and Usage
|
|
|
|
#### AIPluginRegistry
|
|
```csharp
|
|
public class AIPluginRegistry
|
|
{
|
|
public void RegisterPlugin(IAIPlugin plugin)
|
|
public void RegisterPlugin<T>() where T : IAIPlugin, new()
|
|
public async Task<AIPluginResult> CallFunctionAsync(string pluginName, IReadOnlyDictionary<string, object> parameters)
|
|
public IEnumerable<string> GetRegisteredPluginNames()
|
|
}
|
|
```
|
|
|
|
#### Example Usage
|
|
```csharp
|
|
var registry = new AIPluginRegistry();
|
|
registry.RegisterPlugin(new CodeAnalysisPlugin());
|
|
registry.RegisterPlugin(new CodeFormatterPlugin());
|
|
|
|
// Register Git repository management plugins
|
|
registry.RegisterPlugin(new GitHubClonePlugin());
|
|
registry.RegisterPlugin(new GitHubValidatePlugin());
|
|
registry.RegisterPlugin(new GitHubStatusPlugin());
|
|
registry.RegisterPlugin(new GitHubUpdatePlugin());
|
|
|
|
var parameters = new Dictionary<string, object>
|
|
{
|
|
["filePath"] = "/path/to/file.cs",
|
|
["analysisDepth"] = "comprehensive"
|
|
};
|
|
|
|
var result = await registry.CallFunctionAsync("CodeAnalysis", parameters);
|
|
|
|
// Clone a repository for analysis
|
|
var cloneParameters = new Dictionary<string, object>
|
|
{
|
|
["repository_url"] = "https://github.com/owner/repo.git",
|
|
["target_path"] = "/local/analysis/repo",
|
|
["branch"] = "main",
|
|
["shallow_clone"] = true
|
|
};
|
|
|
|
var cloneResult = await registry.CallFunctionAsync("github-clone", cloneParameters);
|
|
if (cloneResult.Success)
|
|
{
|
|
var cloneData = (GitCloneResult)cloneResult.Data;
|
|
Console.WriteLine($"Repository cloned: {cloneData.CommitHash}");
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### Plugin Development
|
|
1. Always inherit from `BaseAIPlugin` for common functionality
|
|
2. Implement proper parameter validation in `ValidatePluginSpecificParameters`
|
|
3. Use caching methods (`GetSyntaxTreeAsync`, `GetOrAnalyzeAsync`) for performance
|
|
4. Handle errors gracefully with descriptive messages
|
|
5. Use telemetry for monitoring and debugging
|
|
|
|
### Configuration
|
|
1. Use the JSON schema for validation and IntelliSense
|
|
2. Implement hierarchical configuration (project > user > global)
|
|
3. Cache configuration for performance
|
|
4. Validate configuration at startup
|
|
|
|
### Security
|
|
1. Always validate file paths using `SecurePathValidator`
|
|
2. Sanitize all user inputs with `InputSanitizer`
|
|
3. Use the security extension methods for common validations
|
|
4. Implement proper error handling for security violations
|
|
|
|
### Performance
|
|
1. Use memory-efficient processing for large files
|
|
2. Leverage adaptive concurrency for multi-file operations
|
|
3. Implement proper caching strategies
|
|
4. Monitor system resources during operations
|
|
|
|
### Monitoring
|
|
1. Use telemetry for all operations
|
|
2. Implement proper error tracking
|
|
3. Monitor system performance
|
|
4. Use structured logging with context
|
|
|
|
---
|
|
|
|
*This API reference covers the complete public API surface of the MarketAlly.AIPlugin.Refactoring library. For additional examples and advanced usage patterns, refer to the main [README.md](README.md) documentation.* |