@syntropysoft/praetorian
Version:
Praetorian CLI β A universal multi-environment configuration validator for DevSecOps teams. Validate, compare, and secure YAML/ENV files with ease.
601 lines (462 loc) β’ 16.1 kB
Markdown
# Praetorian CLI ποΈ
**Guardian of Configurations** β Universal Validation Framework for DevSecOps



---
```
____ _ _ ____ _ ___
| _ \ _ __ __ _ ___| |_ ___ _ __(_) __ _ _ __ / ___| | |_ _|
| |_) | '__/ _` |/ _ \ __/ _ \| '__| |/ _` | '_ \ | | | | | |
| __/| | | (_| | __/ || (_) | | | | (_| | | | | | |___| |___ | |
|_| |_| \__,_|\___|\__\___/|_| |_|\__,_|_| |_| \____|_____|___|
π‘οΈ Guardian of Configurations & Security
```
---
## π **ALPHA-3 RELEASE HIGHLIGHTS**
> **π Praetorian CLI v0.0.2-alpha.4 - Major Improvements!**
>
> **β
NEW FEATURES & IMPROVEMENTS:**
> - **ποΈ Clean Architecture** - Complete codebase reorganization with SOLID principles
> - **π§ͺ Robust Testing** - 205 tests passing with comprehensive coverage
> - **π¦ Optimized Dependencies** - 36 unnecessary packages removed (66% reduction)
> - **π§ Enhanced Build System** - Improved TypeScript compilation and error handling
> - **π Professional Documentation** - Complete English documentation with working examples
> - **π― Perfect Example** - Ready-to-use example that demonstrates best practices
> - **π‘οΈ Plugin System** - Functional plugin architecture for extensibility
> - **β‘ Performance Improvements** - Faster validation and better error handling
> - **π§Ή Automatic Cleanup** - Smart temporary file management
> - **π Advanced Validation** - Improved key comparison and structure validation
> - **π¨ Declarative Programming** - Functional patterns with 100% mutation score
> - **π§ Multi-Format Support** - 9 file formats supported with clean adapters
>
> **β
CORE FEATURES (All Working):**
> - **CLI with professional banner** - Beautiful ASCII art with security colors
> - **Key comparison** - Compare keys across multiple configuration files (JSON/YAML/ENV/TOML/INI/XML/Properties/HCL/PLIST)
> - **Multi-folder support** - Works with files in different directories
> - **C# compatibility** - Supports appsettings.json and other .NET configurations
> - **Configuration file** - `praetorian.yaml` for defining files to compare
> - **Exit codes** - Proper exit codes for CI/CD integration
> - **Missing file detection** - Automatically create empty structure files for missing configurations
> - **Required keys validation** - Ensure mandatory configuration keys are present
> - **Environment mapping** - Support for environment-specific configuration files
>
> **π§ COMING IN FUTURE RELEASES:**
> - Schema validation, pattern matching, security rules
> - Advanced plugin system, custom rules, audit engine
> - Advanced validation features mentioned in examples
>
> **For production use, wait for stable releases (1.0.0+)**
---
## π Description
Praetorian CLI is a multi-environment configuration validation tool designed for **DevSecOps** teams.
It ensures that your configuration files remain **consistent across environments** and detects critical differences before production deployments.
**Perfect for:**
- ποΈ **Microservices architectures** with multiple config files
- π **Multi-environment deployments** (dev, staging, prod)
- π‘οΈ **Security compliance** and configuration drift detection
- π **CI/CD pipelines** requiring config validation
- π **Development workflow** - Auto-create missing configuration structures
---
## β¨ Features
- π‘οΈ **Multi-file, multi-environment validation** (`dev`, `staging`, `prod`)
- π **Detects missing keys or inconsistent values** across files
- π **Multi-folder support** - Compare files in different directories
- π§ **Framework agnostic** - Works with any tech stack
- π **Simple setup** with `praetorian.yaml`
- π¦ **CI/CD friendly** with proper exit codes
- π **Supports ignored keys** and required keys validation
- π **Auto-create missing files** - Generate empty structure files for missing configurations
- π **Environment mapping** - Validate specific environments or all environments
---
## π§ Compatible With
- **Configuration Formats**: JSON, YAML, .env, TOML, INI, XML files
- **Frameworks**: Node.js, .NET (appsettings.json), Python, Java, Go, Rust
- **Environments**: Development, Staging, Production, Testing
- **Architectures**: Monoliths, Microservices, Serverless
- **Platforms**: Docker, Kubernetes, Cloud (AWS, Azure, GCP)
---
## π Supported File Formats
Praetorian supports multiple configuration file formats through its modular adapter system:
| Format | Extensions | Status | Notes |
|--------|------------|--------|-------|
| **JSON** | `.json` | β
Full Support | Native support with nested object validation |
| **YAML** | `.yaml`, `.yml` | β
Full Support | Supports anchors, aliases, and complex structures |
| **Environment** | `.env`, `env.*` | β
Full Support | Key-value pairs with type inference |
| **TOML** | `.toml` | β
Full Support | Table-based configuration format |
| **INI** | `.ini`, `.cfg`, `.conf` | β
Full Support | Section-based configuration |
| **XML** | `.xml` | β
Full Support | Nested element validation |
| **Properties** | `.properties` | β
Full Support | Java-style properties with multiple separators |
| **HCL** | `.hcl`, `.tf`, `.tfvars` | β
Full Support | HashiCorp Configuration Language |
| **PLIST** | `.plist` | β οΈ Partial Support | Apple Property List format |
## π Known Issues
### PLIST File Adapter
**Issue:** Complex nested structures with arrays containing objects are not fully supported.
**Affected:** `PlistFileAdapterV2` (new architecture)
**Details:**
- β
**Simple arrays** work correctly: `<array><string>item1</string><string>item2</string></array>`
- β
**Nested dictionaries** work correctly: `<dict><key>nested</key><dict>...</dict></dict>`
- β οΈ **Arrays with objects** partially work: `<array><dict>...</dict><dict>...</dict></array>`
**Example of affected structure:**
```xml
<dict>
<key>configs</key>
<array>
<dict>
<key>debug</key>
<true/>
<key>env</key>
<string>dev</string>
</dict>
<dict>
<key>debug</key>
<false/>
<key>env</key>
<string>prod</string>
</dict>
</array>
</dict>
```
**Expected:** `{ configs: [{ debug: true, env: 'dev' }, { debug: false, env: 'prod' }] }`
**Actual:** `{ configs: [] }`
**Workaround:** Use the original `PlistFileAdapter` for complex structures until this issue is resolved.
**Status:** π **In Progress** - The new architecture is being refined to handle complex array structures.
---
## π Quick Start
```yaml
# config.yaml
database:
host: localhost
port: 5432
```
```json
// config.json
{
"database": {
"host": "localhost",
"port": 5432
}
}
```
```toml
# config.toml
[database]
host = "localhost"
port = 5432
```
```ini
# config.ini
[database]
host=localhost
port=5432
```
```xml
<!-- config.xml -->
<config>
<database>
<host>localhost</host>
<port>5432</port>
</database>
</config>
```
---
## π¦ Installation
```bash
npm install -g @syntropysoft/praetorian
```
**Prerequisites:**
- Node.js 18+ (recommended: use [NVM](https://github.com/nvm-sh/nvm))
- npm or yarn
---
## βοΈ Basic Configuration
Create a `praetorian.yaml` file:
```yaml
files:
- config-dev.yaml
- config-prod.yaml
- config-staging.yaml
ignore_keys:
- debug
- temp
required_keys:
- database.host
- database.port
- api.version
- api.port
environments:
dev: config-dev.yaml
prod: config-prod.yaml
staging: config-staging.yaml
```
---
## π οΈ Usage
### Available Commands
```bash
# Validate configuration files for key consistency
praetorian validate [FILES] [OPTIONS]
# Generate empty keys report
praetorian empty-keys [FILES] [OPTIONS]
# Initialize a new configuration file
praetorian init [OPTIONS]
```
### Basic Validation
Validate that all configuration files have matching keys:
```bash
praetorian validate
```
**Output example:**
```
π Validation Results:
β
All configuration files are consistent!
π Summary:
β’ Files compared: 3
β’ Total keys: 15
β’ Duration: 2ms
```
**In case of differences:**
```
β Key inconsistencies found:
β’ Key 'database.url' is missing in config-staging.yaml
β’ Key 'api.timeout' is missing in config-dev.yaml
```
### Environment-Specific Validation
Validate a specific environment:
```bash
praetorian validate --env dev
```
Validate all environments:
```bash
praetorian validate --all
```
### Missing File Detection
When files are missing, Praetorian automatically creates empty structure files:
```
β οΈ Missing files detected: config-staging.yaml
π‘ Creating empty structure files...
β
Created 1 empty structure file(s)
```
The created file will have the structure based on `required_keys`:
```yaml
# config-staging.yaml (auto-created)
database:
host: null
port: null
api:
version: null
port: null
```
### Empty Keys Report
Generate a detailed report of empty keys in your configuration files:
```bash
# Basic empty keys report
praetorian empty-keys
# Environment-specific report
praetorian empty-keys --env dev
# Include actual empty values
praetorian empty-keys --include-values
# Group by file for better organization
praetorian empty-keys --group-by-file
# JSON output for automation
praetorian empty-keys --output json
# CSV output for spreadsheet analysis
praetorian empty-keys --output csv
```
**Output example:**
```
π Empty Keys Report:
π Summary:
β’ Files analyzed: 9
β’ Total empty keys: 5
β’ Files with empty keys: 5
π Empty Keys List:
β’ redis.password [config.yaml]
β’ redis.password [config.json]
β’ redis.password [config.toml]
β’ REDIS_PASSWORD [config.env]
β’ redis.password [config.properties]
π‘ Recommendations:
β’ Review empty keys to ensure they are intentional
β’ Consider using environment-specific values for empty keys
β’ Add empty keys to ignore list if they are expected
β’ Use --include-values to see actual empty values
```
**JSON Output:**
```json
{
"summary": {
"totalFiles": 9,
"totalEmptyKeys": 5,
"filesWithEmptyKeys": 5
},
"emptyKeys": [
{
"key": "redis.password",
"file": "config.yaml",
"value": "",
"valueType": "string",
"message": "Key 'redis.password' has empty value in config.yaml"
}
]
}
```
---
## π Examples
### π― **Quick Examples**
#### Example 1: Basic Configuration Files
```yaml
# config-dev.yaml
app:
name: my-app
debug: true
port: 3000
database:
host: localhost
port: 5432
```
```yaml
# config-prod.yaml
app:
name: my-app
port: 80
database:
host: prod-db.example.com
port: 5432
url: postgresql://user:pass@prod-db.example.com:5432/db
```
#### Example 2: C# appsettings.json
```json
// apps/web/appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=WebApp;"
},
"AppSettings": {
"ApiKey": "web-api-key-12345",
"BaseUrl": "https://web.example.com"
}
}
```
#### Example 3: Multi-folder Structure
```yaml
# praetorian.yaml
files:
- configs/frontend/app.config.json
- configs/backend/app.config.json
- apps/web/appsettings.json
- apps/api/appsettings.json
ignore_keys:
- debug
- Logging
- AllowedHosts
required_keys:
- database.host
- api.port
- logging.level
```
#### Example 4: Environment Mapping
```yaml
# environments.yaml
dev: config-dev.yaml
staging: config-staging.yaml
production: config-prod.yaml
```
```bash
# Validate specific environment
praetorian validate --environments environments.yaml --env dev
# Validate all environments
praetorian validate --environments environments.yaml --all
```
### π **Complete Examples**
Check out our **[examples directory](./examples/validation/)** for comprehensive examples:
- **[Perfect Example](./examples/validation/perfect-example/)** - **NEW!** Complete working example with consistent structure
- **[Missing Files Demo](./examples/validation/missing-files-demo/)** - **NEW!** Automatic file creation demonstration
- **[YAML Examples](./examples/validation/yaml/)** - Basic YAML configuration validation
- **[JSON Examples](./examples/validation/json/)** - JSON configuration files
- **[ENV Examples](./examples/validation/env/)** - Environment file validation
- **[.NET Examples](./examples/validation/dotnet/)** - C# appsettings.json and multi-folder validation
Each example includes:
---
## π§ͺ Testing & Quality
### **Comprehensive Test Suite**
- **β
205 tests passing** across 16 test suites
- **β
Unit tests** for all core functionality
- **β
Integration tests** for end-to-end validation
- **β
Mutation testing** configured with Stryker
- **β
Coverage reporting** for quality assurance
### **Test Coverage Highlights**
- **100% coverage** on core validation logic
- **100% coverage** on plugin management
- **100% coverage** on environment management
- **97% coverage** on utility functions
- **86% coverage** on validation rules
- **100% mutation score** on declarative programming patterns
### **Running Tests**
```bash
# Run all tests
npm test
# Run with coverage
npm run test:coverage
# Run integration tests only
npm run test:integration
# Run mutation tests
npm run test:mutation
```
### **Quality Metrics**
- **Clean Architecture** - SOLID principles applied
- **Functional Programming** - Pure functions and immutability
- **Type Safety** - Full TypeScript coverage
- **Error Handling** - Comprehensive error management
- **Performance** - Optimized for speed and efficiency
- Sample configuration files
- `praetorian.yaml` setup
- Expected validation results
- Common use cases
---
## π§© CI/CD Integration
### GitHub Actions Example
```yaml
- name: Validate Configurations
run: |
npm install -g @syntropysoft/praetorian
praetorian validate
```
### GitLab CI Example
```yaml
validate_configs:
stage: test
script:
- npm install -g @syntropysoft/praetorian
- praetorian validate
```
---
## πΊοΈ Roadmap
- [ ] **Schema validation** - Type checking and pattern matching
- [ ] **Security rules** - Detect sensitive data exposure
- [ ] **JSON/HTML reports** - Detailed validation reports
- [ ] **Custom rule plugins** - Extensible validation system
- [ ] **Secret management integration** - AWS Secrets Manager, Azure Key Vault
- [ ] **Performance optimization** - Parallel processing for large configs
---
## π’ About SyntropySoft
**Praetorian CLI** is proudly developed by **[SyntropySoft](https://syntropysoft.com)** - Your trusted partner in DevSecOps solutions.
### Our Products
- π **[SyntropyLog](https://github.com/Syntropysoft/syntropylog)** - Advanced logging and monitoring platform
- π¨ **[SyntropyFront](https://github.com/Syntropysoft/syntropyfront)** - Modern frontend development framework
- π‘οΈ **[Praetorian CLI](https://github.com/Syntropysoft/praetorian)** - Configuration validation framework *(you are here)*
### Connect With Us
- π **[Website](https://syntropysoft.com)**
- π§ **[Contact](mailto:gabriel70@gmail.com)**
- πΌ **[LinkedIn](https://www.linkedin.com/in/gabriel-alejandro-gomez-652a5111/)**
---
## π License
Apache 2.0 Β© [SyntropySoft](https://syntropysoft.com)
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0).
---
## π€ Contributing
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
**Star us on GitHub** β - It helps a lot!