opencode-ralph-loop-cli 0.1.0

Scaffolder CLI for OpenCode Ralph Loop plugin — one command setup
Documentation
use opencode_ralph_loop_cli::hash::sha256_hex;
use opencode_ralph_loop_cli::templates::{RenderContext, canonical_templates, render_template};
use proptest::prelude::*;

proptest! {
    #[test]
    fn prop_sha256_deterministic(data: Vec<u8>) {
        prop_assert_eq!(sha256_hex(&data), sha256_hex(&data));
    }

    #[test]
    fn prop_sha256_size_64(data: Vec<u8>) {
        prop_assert_eq!(sha256_hex(&data).len(), 64);
    }

    #[test]
    fn prop_sha256_only_hex(data: Vec<u8>) {
        let h = sha256_hex(&data);
        prop_assert!(
            h.chars().all(|c| c.is_ascii_hexdigit()),
            "hash contains invalid character: {h}"
        );
    }

    #[test]
    fn prop_render_context_accepts_any_version(version: String) {
        let ctx = RenderContext::with_version(&version);
        prop_assert_eq!(ctx.plugin_version, version);
    }

    #[test]
    fn prop_canonical_templates_all_render(
        idx in 0usize..canonical_templates().len()
    ) {
        let ctx = RenderContext::default();
        let template = canonical_templates()[idx];
        let result = render_template(template, &ctx);
        prop_assert!(result.is_some(), "template {template} did not render");
        let bytes = result.unwrap();
        prop_assert!(!bytes.is_empty(), "template {template} returned empty");
    }
}