7.8 KiB
AGENTS.md - AI Coding Agent Guidelines for Aaru
This document provides guidelines for AI coding assistants working with the Aaru Data Preservation Suite codebase.
Project Overview
Aaru is an open-source Data Preservation Suite for creating, managing, and preserving digital media images. It supports dumping media from various drives (magnetic disks, optical discs, tapes, flash devices), converting between image formats, and analyzing filesystems.
- Language: C# 8+ (latest features enabled)
- Framework: .NET 10
- Solution File:
Aaru.slnx - Build System: MSBuild with
dotnetCLI
Repository Structure
The repository is organized into multiple modules:
| Module | Purpose |
|---|---|
Aaru/ |
Main CLI application and entry point |
Aaru.Archives/ |
Archive format support (AMG, Arc, Ha, Stfs, Symbian, Zoo) |
Aaru.Checksums/ |
Checksum, hashing, and error correction algorithms |
Aaru.CommonTypes/ |
Shared interfaces, structures, and enumerations |
Aaru.Compression/ |
Compression algorithm implementations |
Aaru.Console/ |
Console abstraction for CLI/GUI output |
Aaru.Core/ |
Core functionality: dumping, conversion, filesystem operations |
Aaru.Database/ |
Database models and access |
Aaru.Decoders/ |
Protocol structures and decoder implementations |
Aaru.Decryption/ |
Media decryption (CSS, CPRM, etc.) |
Aaru.Devices/ |
Hardware device communication across platforms |
Aaru.Dto/ |
Data Transfer Objects for client-server communication |
Aaru.EntityFramework/ |
Entity Framework integration |
Aaru.Filesystems/ |
Filesystem identification and extraction |
Aaru.Filters/ |
Data filters (compression, encoding transformations) |
Aaru.Generators/ |
Source generators |
Aaru.Gui/ |
Avalonia-based graphical user interface |
Aaru.Helpers/ |
Utility functions (marshalling, byte manipulation, etc.) |
Aaru.Images/ |
Disk/disc image format readers and writers |
Aaru.Localization/ |
Localized strings (shared resources) |
Aaru.Logging/ |
Logging infrastructure |
Aaru.Partitions/ |
Partition scheme readers |
Aaru.Settings/ |
Application settings management |
Aaru.Tests/ |
Unit tests (xUnit) |
Aaru.Tests.Devices/ |
Device command testing (menu-driven) |
Aaru.Tui/ |
Terminal UI implementation |
Coding Style Guidelines
The project follows strict coding conventions. An .editorconfig file is included to enforce these.
General Rules
- Braces: BSD style (braces on new line, unindented)
- Empty braces: Open and close on same line:
{ } - Single-statement blocks: No braces required
- Indentation: 4 spaces (soft tabs)
- Line length: 120 characters maximum
- Line endings: UNIX (
\n) - Final newline: Do NOT end files with a newline
- Blank lines: Do not use more than one consecutive blank line
Naming Conventions
- Constants:
ALL_UPPER_CASE - Instance/static fields (private):
lowerCamelCase(often prefixed with_) - Public fields:
UpperCamelCase - Properties/Methods:
UpperCamelCase
C# Specific
- Do NOT use
var- always use explicit types - Use built-in type keywords:
uintinstead ofUInt32,stringinstead ofString - Expression bodies: Only for properties, indexers, and events; use block bodies for methods
- Use inline variable declaration:
if(Foo(out var result)) - Keywords order:
public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required else,while,catch,finally: Always on new lines- No spaces around parentheses:
if(condition)notif (condition) - Prefer structs over classes when only storing data; use nullable structs when needed
- Avoid unnecessary OOP abstractions - this is low-level code
LINQ
LINQ is acceptable and commonly used throughout the codebase.
Localization
All user-facing strings must be localized:
- Shared strings:
Aaru.Localization/UI.resxandAaru.Localization/Core.resx - Project-specific strings: In each project's
Localization/folder - Translations: Currently English (
*.resx) and Spanish (*.es.resx) - Resource ID conventions:
Title_*- Table/section headersButtonLabel_*- Action buttons (use appropriate verb tense)*_Q- Questions*_WithMarkup- Contains Spectre.Console markup- Numbers in IDs (e.g.,
_0,_1) indicate string format arguments{0},{1}
For enum values, use [LocalizedDescription(nameof(UI.EnumName_Value))] attribute.
Testing
- Framework: xUnit
- Location:
Aaru.Tests/project - Note: Full test suite requires ~900+ GiB of test images; not all tests can be run locally
- Device tests:
Aaru.Tests.Devices/provides interactive device command testing
Building
# Build all configurations
dotnet build
# Build specific configuration
dotnet build -c Release
# Publish for specific platform
dotnet publish -f net10.0 -r osx-arm64 -c Release
# Run tests
dotnet test
Supported runtime identifiers: linux-arm64, linux-arm, linux-x64, osx-x64, osx-arm64, win-arm64, win-x64, win-x86
Key Interfaces
When working with the codebase, be aware of these core interfaces in Aaru.CommonTypes:
IMediaImage/IWritableImage- Disk/disc image reading/writingIOpticalMediaImage/IWritableOpticalImage- Optical media specificITapeImage/IWritableTapeImage- Tape media specificIFluxImage/IWritableFluxImage- Flux-level dataIFilesystem/IReadOnlyFilesystem- Filesystem operationsIPartition- Partition scheme readingIFilter- Data transformation filtersIArchive- Archive format support
Error Handling
- Use
ErrorNumberenum for return values indicating success/failure - Check for
ErrorNumber.NoErrorfor success - Propagate errors up the call stack with appropriate context
Events and Progress Reporting
Many operations use event-based progress reporting:
public event InitProgressHandler InitProgress;
public event UpdateProgressHandler UpdateProgress;
public event EndProgressHandler EndProgress;
public event UpdateStatusHandler UpdateStatus;
public event ErrorMessageHandler ErrorMessage;
public event ErrorMessageHandler StoppingErrorMessage;
Platform Considerations
- Avoid platform-dependent code unless absolutely necessary
- For system calls, only use
System.*namespaces when possible - Device communication uses OS-specific interop in
Aaru.Devices/:- Windows:
KERNEL32.DLL,WinUsb - Unix/Linux/macOS:
libc,libusb
- Windows:
Pull Request Guidelines
- Do not modify interfaces without discussion
- Follow the code style guide strictly
- Include XML documentation for new public APIs
- Add tests for new functionality when possible
- Do not include copyrighted content in test files
- Keep commits focused and well-described
External Dependencies
- Dependencies are managed via central package management (
Directory.Packages.props) - Minimize external library usage - prefer .NET built-in functionality
- Compression: Use
SharpCompresslibrary - Mac Resource Forks: Use
Claunia.RsrcFork - Encodings: Use
Claunia.Encodingfor legacy codepages - Property Lists: Use
plist-cil
Common Patterns
Plugin Registration
Plugins (images, filesystems, partitions, etc.) register through PluginRegister.Singleton.
Reading/Writing Images
// Reading
(ErrorNumber errno, IMediaImage image) = GetInputImage(imagePath);
if(image is null) return errno;
// Writing
IWritableImage outputFormat = FindOutputFormat(PluginRegister.Singleton, format, outputPath);
Metadata and Dump Hardware
- Use
Metadataclass for image metadata - Use
DumpHardwarefor recording dump device information - Use
Resumefor dump session resumption data