# AGENTS.md ## Project Overview - **Primary Language**: C# (.NET 8 Console Application) - **Key Libraries**: RestSharp, Newtonsoft.Json, System.Data.SQLite, Microsoft.Extensions.Configuration - **Purpose**: Tumblr API data harvester for collecting notes, posts, likes, and replies, storing results in SQLite. ## Architectural Patterns - CLI entry point in `Program.cs` with workflow orchestration - `DataAccess.cs`: Database operations, `ApiKeyPool` (API key management), `APIAccess` (Tumblr client) - `ResponseNotes.cs`: Tumblr API response models - Round-robin API key rotation with rate-limit tracking - Automatic console color assignment per API key for output differentiation - No-argument mode (`Program.TraverseDirectory`) ingests `.txt` blog export files into `Posts` via `DataAccess.AddPost`. Recognized field prefixes live in `TraverseDirectoryFieldPrefixes`; `Body:` and `Downloaded files:` collect every following line up to the next recognized prefix (multi-line values). `RootURL` is populated from a `Reblog root url:` line the same way it's populated from the API-based `--likes` flow — both paths converge on `DataAccess.AddPost`'s `rootURL` parameter, which `UpdatePost` only overwrites when the incoming value is non-empty (existing `RootURL` is preserved otherwise) ## Developer Guidelines ### Code Formatting - 4-space indentation, no tabs, match existing C# style - PascalCase for public members, camelCase for locals - Minimize code comments unless explicitly requested - Use only existing project libraries; no new dependencies without confirmation - Match accessibility modifiers (`public` for models, `internal` for helpers) ### Error Handling - Wrap file/network operations in `try-catch` - Log non-critical errors (e.g., config write failures) with `[Warning]` prefix - Preserve console color state: use save/restore pattern for temporary color changes - API rate limits must use `ApiKeyPool.MarkRateLimited()`/`MarkAvailable()` ### Testing - No existing test suite; use xUnit if adding tests - Test critical logic: `ApiKeyPool` init, color parsing, config persistence - Avoid testing one-off CLI workflows ### Git Commit Messages - Imperative mood ("Add feature" not "Added feature") - Prefix with type: `feat:`, `fix:`, `chore:`, `docs:` - Keep messages under 72 characters - Never commit sensitive data (API keys/tokens) ### API Key Color Rules - Unconfigured keys auto-assign colors from a preset palette - Auto-assigned colors persist to `appsettings.json` - All output for an active key uses its assigned color - Temporary color changes (e.g., errors) must restore the key's color afterward