Added
------

- Added cli arguments without changing the default behaviour of the application which is to automatically scan the current directory upon execution and work in one depth
- Added cli arguments to env variable handling making cli arguments override environment variables
- Added support for single-file processing instead of automatic batch processing. The default is still to scan automatically and batch process all files in the working directory
- Added aggressive optimization profile for CI builds in Cargo.toml
- Added re-export paths for some crate paths to simplify things for consumers
- Added `VEX2PDF_OUTPUT_DIR` environment variable to override destination directory
- Added Processor and Renderer trait system for improved extensibility
- Added `--max-jobs` CLI argument to control concurrent processing (1 for single-threaded, 2-255 for specific job count, 0 or unset for max parallelism)
- Added `VEX2PDF_MAX_JOBS` environment variable to configure concurrency (CLI argument takes precedence)
- Added custom threadpool implementation for fine-grained control over worker lifecycle, logging, and error handling
- Added single-threaded mode (`--max-jobs 1`) for debugging and sequential processing with graceful fallback
- Added graceful threadpool shutdown that waits for all jobs to complete
- Added handling for working with single files
- Added handling for a distinct working directory definition
- Added handling for passing an input path or file whichever is needed. This is optional and the tool reverts to default behaviour if this option is not used
- Added integration tests for PDF generation covering JSON/XML inputs, VEX/VDR formats, analysis states, and edge cases
- Added threading integration tests (`tests/threading_integration_tests.rs`) to verify concurrency modes from user perspective via CLI
- Added unit tests for threadpool module (creation modes, single/multi-threaded execution, graceful shutdown)
- Added unit tests for worker module (creation, job execution, shutdown on channel close)
- Added unit tests for processor module (creation, state management, Send trait verification)
- Added test helper utilities in `tests/common.rs` to reduce code duplication across test files
- Added conditional PDF content comparison in tests using `#[cfg(debug_assertions)]` to handle binary differences between debug and release builds
- Added `#![forbid(unsafe_code)]` to library code to enforce memory safety
- Added a vulnerability analysis section to PDF reports displaying CycloneDX analysis data with color-coded states and responses
- Added color-coded analysis state indicators (Exploitable=red, Resolved=green, In Triage=orange, False Positive=blue, Not Affected=green, Resolved With Pedigree=dark green)
- Added color-coded response action indicators (Update/Rollback=blue, Workaround Available=orange, Can Not Fix/Will Not Fix=red)
- Added utility functions for analysis formatting (`get_style_analysis_state`, `get_style_analysis_response`, `get_styled_vector_as_paragraph`, `get_formatted_key_val_text`, `prettify_string_analysis`)
- Added unit tests for analysis utility functions in generator module
- Added structured logging system using `log` and `env_logger` crates with intelligent output routing (info/debug → stdout, warn/error → stderr)
- Added compile-time debug log stripping in release builds for improved performance and binary size
- Added default info-level logging without requiring RUST_LOG environment variable configuration

Fixed
------

- Fixed GitLab CI not able to test due to missing rustup dependencies
- Fixed GitLab CI test failures when running as root by skipping readonly directory permission test in gitlab-ci environments
- Fixed the rendering issue for the newline character

Changed
--------

- Changed Env_vars as_str() method to be const to allow some compile time operations
- Changed signature of `vex2pdf::pdf::generator::PdfGenerator::new(Option<'a str>, Option<'a str>, bool, bool, bool)` to `PdfGenerator::new(Arc<crate::lib_utils::config::Config>)`
- Changed signature of `vex2pdf::run(config: &Config)` to `crate::run(config::Config)`, i.e. run now owns the configuration struct
- Changed signature of `vex2pdf::utils::get_output_pdf_path` to return a `Result<T,E>`
- Migrated from `println!`/`eprintln!` statements to structured logging with log levels (error, warn, info, debug)
- Changed log output routing: informational logs now go to stdout, errors and warnings to stderr for better Unix compatibility
- Updated README.md with `--max-jobs` CLI argument documentation, usage examples, and `VEX2PDF_MAX_JOBS` environment variable details
- Updated DEVELOPER_NOTES.md with threading implementation details, test structure documentation, and debug vs release testing behavior

Deprecated
-----------

- `VEX2PDF_VERSION_INFO` is now replaced with a cli argument and has entered a deprecation phase (will be removed by the next minor release)
- `VEX2PDF_SHOW_OSS_LICENSES` is now replaced with a cli argument and has entered a deprecation phase (will be removed by the next minor release)