nushell-plugins/nu_plugin_kms/IMPLEMENTATION_STATUS.md
Jesús Pérez be62c8701a feat: Add ARGUMENTS documentation and interactive update mode
- Add `show-arguments` recipe documenting all version update commands
- Add `complete-update-interactive` recipe for manual confirmations
- Maintain `complete-update` as automatic mode (no prompts)
- Update `update-help` to reference new recipes and modes
- Document 7-step workflow and step-by-step differences

Changes:
- complete-update: Automatic mode (recommended for CI/CD)
- complete-update-interactive: Interactive mode (with confirmations)
- show-arguments: Complete documentation of all commands and modes
- Both modes share same 7-step workflow with different behavior in Step 4
2025-10-19 00:05:16 +01:00

9.0 KiB

nu_plugin_kms Implementation Status

Phase 1: Base Structure (COMPLETED )

Date: 2025-10-08 Agent: Agente 4 (Base Structure)

Files Created

File Lines Status Description
Cargo.toml 23 Complete Dependencies with path references
src/main.rs 194 Complete Plugin entry point with 4 commands
src/helpers.rs 23 🟡 Stub Backend implementations (for Agente 5)
src/tests.rs 7 🟡 Stub Test suite (for Agente 5)
README.md 24 Complete Basic documentation
Total 271 - -

Build Verification

✅ cargo check: PASSED (5 non-critical warnings)
✅ cargo build: PASSED (32.18s)
✅ Binary created: target/debug/nu_plugin_kms (23MB)
✅ Protocol handshake: SUCCESS
✅ MsgPack serialization: Working

Commands Implemented (Placeholder)

1. kms encrypt

kms encrypt <data> --backend <backend> --key <key>
  • Input: String
  • Output: String (placeholder: "ENCRYPTED_PLACEHOLDER")
  • Backends: rustyvault, age, cosmian
  • Status: Stub implementation

2. kms decrypt

kms decrypt <encrypted> --backend <backend> --key <key>
  • Input: String
  • Output: String (placeholder: "DECRYPTED_PLACEHOLDER")
  • Backends: rustyvault, age, cosmian
  • Status: Stub implementation

3. kms generate-key

kms generate-key --spec <AES256|AES128> --backend <backend>
  • Input: Nothing
  • Output: Record {plaintext: string, ciphertext: string}
  • Key Specs: AES128, AES256
  • Status: Stub implementation

4. kms status

kms status
  • Input: Nothing
  • Output: Record {backend: string, available: bool}
  • Status: Stub implementation

Dependencies Configured

Path Dependencies (Nushell Integration)

nu-plugin = { version = "0.107.1", path = "../nushell/crates/nu-plugin" }
nu-protocol = { version = "0.107.1", path = "../nushell/crates/nu-protocol", features = ["plugin"] }

External Dependencies (KMS Backends)

rusty_vault = "0.2.1"          # RustyVault client
age = "0.10"                   # Age encryption
base64 = "0.22"                # Base64 encoding
serde = "1.0"                  # Serialization
serde_json = "1.0"             # JSON support
reqwest = "0.12"               # HTTP client (fallback)
tokio = "1.40"                 # Async runtime
tempfile = "3.10"              # Temporary files

Helper Functions (Stub)

// src/helpers.rs
pub enum Backend {
    RustyVault,
    Age,
    Cosmian,
    Fallback,
}

pub fn detect_backend() -> Backend
pub fn encode_base64(data: &[u8]) -> String
pub fn decode_base64(data: &str) -> Result<Vec<u8>, String>

Pattern Compliance

Follows nu_plugin_tera structure exactly:

  • Same Cargo.toml pattern (path dependencies to ../nushell/)
  • Same Plugin trait implementation
  • Same SimplePluginCommand pattern
  • Same module organization (helpers.rs, tests.rs)
  • Same category: Custom("provisioning".into())
  • Same serializer: MsgPackSerializer

Phase 2: Backend Implementation (PENDING 🟡)

Assigned To: Agente 5 (KMS Backend Implementation)

Tasks for Agente 5

1. RustyVault Backend

  • Implement encrypt_with_rustyvault(data, key) -> Result<String>
  • Implement decrypt_with_rustyvault(encrypted, key) -> Result<String>
  • Implement generate_key_rustyvault(spec) -> Result<(Vec<u8>, Vec<u8>)>
  • Add RustyVault client initialization
  • Add error handling and retries
  • Add connection pooling

2. Age Backend

  • Implement encrypt_with_age(data, recipient) -> Result<String>
  • Implement decrypt_with_age(encrypted, identity_path) -> Result<String>
  • Implement generate_age_keypair() -> Result<(String, String)>
  • Add age recipient handling
  • Add identity file management
  • Add age armor format support

3. Cosmian Backend

  • Implement encrypt_with_cosmian(data, key) -> Result<String>
  • Implement decrypt_with_cosmian(encrypted, key) -> Result<String>
  • Add Cosmian client initialization
  • Add CoverCrypt support
  • Add policy-based encryption

4. HTTP Fallback Backend

  • Implement encrypt_via_http(data, endpoint) -> Result<String>
  • Implement decrypt_via_http(encrypted, endpoint) -> Result<String>
  • Add HTTP client with retry logic
  • Add authentication (API keys, JWT)
  • Add TLS certificate validation

5. Backend Detection

  • Implement detect_backend() -> Backend
    • Check environment variables (KMS_BACKEND)
    • Check RustyVault connectivity
    • Check Age key availability
    • Check Cosmian configuration
    • Fallback to HTTP endpoint
  • Add backend health checks
  • Add backend failover logic

6. Command Implementation

  • Update KmsEncrypt::run() with real encryption
  • Update KmsDecrypt::run() with real decryption
  • Update KmsGenerateKey::run() with real key generation
  • Update KmsStatus::run() with real health checks
  • Add proper error handling (LabeledError)
  • Add input validation

7. Testing

  • Unit tests for each backend
  • Integration tests with mock KMS services
  • Error case testing
  • Performance benchmarks
  • Documentation tests (examples)

8. Documentation

  • Add command examples to README
  • Add backend configuration guide
  • Add troubleshooting section
  • Add performance considerations
  • Add security best practices

Expected File Structure After Phase 2

nu_plugin_kms/
├── Cargo.toml
├── README.md
├── src/
│   ├── main.rs (commands)
│   ├── helpers.rs (→ backends/)
│   ├── backends/
│   │   ├── mod.rs
│   │   ├── rustyvault.rs
│   │   ├── age.rs
│   │   ├── cosmian.rs
│   │   ├── http.rs
│   │   └── common.rs
│   ├── tests.rs
│   └── lib.rs (optional)
├── tests/
│   ├── integration_tests.rs
│   ├── backend_tests.rs
│   └── fixtures/
├── examples/
│   ├── basic_encryption.rs
│   ├── key_generation.rs
│   └── backend_selection.rs
└── benches/
    └── encryption_benchmarks.rs

Integration Points

1. Config System Integration

Plugin should read configuration from provisioning config:

[kms]
backend = "rustyvault"  # or "age", "cosmian", "http"
rustyvault_addr = "http://localhost:8200"
age_recipients_file = "~/.config/provisioning/age/recipients.txt"
cosmian_endpoint = "https://cosmian.example.com"
http_fallback_url = "http://localhost:8080/kms"

2. Environment Variables

KMS_BACKEND=rustyvault|age|cosmian|http
VAULT_ADDR=http://localhost:8200
VAULT_TOKEN=...
AGE_RECIPIENTS_FILE=...
AGE_IDENTITY_FILE=...
COSMIAN_ENDPOINT=...
KMS_HTTP_ENDPOINT=...

3. Nushell Integration

After building, register the plugin:

plugin add target/release/nu_plugin_kms
plugin use kms

Usage examples:

# Encrypt data
"my secret" | kms encrypt --backend rustyvault

# Decrypt data
"ENCRYPTED_DATA" | kms decrypt --backend rustyvault

# Generate key
kms generate-key --spec AES256

# Check status
kms status

4. CLI Integration

The provisioning CLI can use this plugin for:

  • Config file encryption (provisioning config encrypt)
  • Secret management (provisioning secrets encrypt)
  • Dynamic secret generation
  • KMS health monitoring

Success Criteria

Phase 1 (Completed )

  • Plugin structure created following nu_plugin_tera pattern
  • All 4 commands defined with proper signatures
  • Plugin compiles without errors
  • Plugin responds to protocol handshake
  • Dependencies configured with path references
  • README documentation complete

Phase 2 (Pending 🟡)

  • All 4 backends implemented (RustyVault, Age, Cosmian, HTTP)
  • Backend auto-detection working
  • All commands perform real encryption/decryption
  • Comprehensive test suite (unit + integration)
  • Error handling complete
  • Documentation with examples
  • Performance benchmarks passing
  • Security audit passed

Timeline Estimate

Phase Tasks Estimated Time
Phase 1: Base Structure 5 files, basic structure Completed
Phase 2: Backend Implementation 4 backends, tests, docs ~8-12 hours
Phase 3: Integration Testing End-to-end testing ~2-4 hours
Phase 4: Documentation User guide, examples ~2-3 hours
Total - 12-19 hours

References

Similar Plugins

  • nu_plugin_tera - Template rendering (structure pattern)
  • Existing KMS service - HTTP API reference
  • Config encryption module - Use case examples

External Documentation


Status: Ready for Agente 5 (Backend Implementation) Last Updated: 2025-10-08 Next Agent: Agente 5 - KMS Backend Implementation