| Crates.io | kodegen_utils |
| lib.rs | kodegen_utils |
| version | 0.8.0 |
| created_at | 2025-10-29 00:15:39.813116+00 |
| updated_at | 2025-12-06 13:52:11.932055+00 |
| description | KODEGEN.ᴀɪ: Memory-efficient, Blazing-Fast, MCP tools for code generation agents. |
| homepage | https://kodegen.ai |
| repository | https://github.com/cyrup-ai/kodegen-utils |
| max_upload_size | |
| id | 1905811 |
| size | 135,107 |
Memory-efficient, blazing-fast utilities for code generation agents. Part of the KODEGEN.ᴀɪ ecosystem.
kodegen_utils provides high-performance text processing utilities designed specifically for AI coding assistants and MCP (Model Context Protocol) tools. It focuses on solving the invisible character problems that plague AI-generated code edits through sophisticated character-level analysis and fuzzy string matching.
prefix{-removed-}{+added+}suffixAdd to your Cargo.toml:
[dependencies]
kodegen_utils = "0.1.0"
This crate requires Rust nightly:
rustup install nightly
rustup default nightly
Find approximate matches in text using Levenshtein distance:
use kodegen_utils::fuzzy_search::{
recursive_fuzzy_index_of_with_defaults,
get_similarity_ratio,
levenshtein_distance,
};
let text = "The quick brown fox jumps over the lazy dog";
let result = recursive_fuzzy_index_of_with_defaults(text, "qwick");
println!("Match: {} at position {}-{}", result.value, result.start, result.end);
println!("Distance: {}", result.distance);
// Calculate similarity ratio (0.0 to 1.0)
let similarity = get_similarity_ratio("hello", "hallo");
println!("Similarity: {:.1}%", similarity * 100.0);
Generate visual diffs to identify invisible character differences:
use kodegen_utils::char_diff::CharDiff;
let expected = "function getUserData()";
let actual = "function getUserData()"; // Extra space
let diff = CharDiff::new(expected, actual);
println!("{}", diff.format());
// Output: function {--}{+ +}getUserData()
if diff.is_whitespace_only() {
println!("Difference is only whitespace");
}
Deep analysis for diagnosing invisible character issues:
use kodegen_utils::char_analysis::{
CharCodeData,
WhitespaceIssue,
EncodingIssue,
};
// Analysis is automatically cached in LRU cache
let analysis: CharCodeData = analyze_string_diff("expected", "actual");
println!("Report: {}", analysis.report);
println!("Unique chars: {}", analysis.unique_count);
// Check for specific issues
if analysis.has_zero_width {
println!("Warning: Contains zero-width Unicode characters");
}
for issue in &analysis.whitespace_issues {
match issue {
WhitespaceIssue::TabsVsSpaces => println!("Mixed tabs and spaces detected"),
WhitespaceIssue::MixedLineEndings => println!("Inconsistent line endings"),
_ => {}
}
}
Non-blocking telemetry for edit operations:
use kodegen_utils::edit_log::{get_edit_logger, EditBlockLogEntry, EditBlockResult};
use chrono::Utc;
let logger = get_edit_logger();
let entry = EditBlockLogEntry {
timestamp: Utc::now(),
search_text: "old_text".to_string(),
found_text: Some("old_text".to_string()),
similarity: Some(1.0),
execution_time_ms: 15.3,
exact_match_count: 1,
expected_replacements: 1,
fuzzy_threshold: 0.8,
below_threshold: false,
diff: None,
search_length: 8,
found_length: Some(8),
file_extension: "rs".to_string(),
character_codes: None,
unique_character_count: None,
diff_length: None,
result: EditBlockResult::ExactMatch,
};
// Fire-and-forget logging (never blocks)
logger.log(entry);
println!("Logs written to: {}", logger.log_path().display());
Generate actionable error messages:
use kodegen_utils::suggestions::{
EditFailureReason,
SuggestionContext,
Suggestion,
};
let context = SuggestionContext {
file_path: "src/main.rs".to_string(),
search_string: "function foo()".to_string(),
line_number: Some(42),
log_path: None,
execution_time_ms: Some(12.5),
};
let reason = EditFailureReason::FuzzyMatchBelowThreshold {
similarity: 0.65,
threshold: 0.8,
found_text: "function bar()".to_string(),
};
let suggestion = Suggestion::for_failure(&reason, &context);
println!("{}\n{}", suggestion.message, suggestion.format());
The library is organized into focused modules:
fuzzy_search: Levenshtein distance and recursive fuzzy matchingchar_diff: Character-level diff generationchar_analysis: Deep character diagnostics with LRU cachingedit_log: Async telemetry for edit operationsfuzzy_logger: Async fuzzy search loggingusage_tracker: MCP tool usage statisticssuggestions: User-facing error messagesline_endings: Cross-platform line ending handlingAll logging operations use fire-and-forget async patterns:
# Build library
cargo build
# Build with optimizations
cargo build --release
# Run all tests
cargo test
# Run specific test
cargo test --test test_fuzzy_search
# Show test output
cargo test -- --nocapture
# Format code
cargo fmt
# Run clippy
cargo clippy
# Check without building
cargo check
x86_64-apple-darwin, wasm32-unknown-unknownrustfmt, clippySee rust-toolchain.toml for exact configuration.
Licensed under either of:
at your option.
Contributions are welcome! This library is part of the KODEGEN.ᴀɪ project.
See the repository for contribution guidelines.
Built with ❤️ by the KODEGEN.ᴀɪ team