From f97774a1d6d0dd693f2be22ac772f766d2512141 Mon Sep 17 00:00:00 2001 From: martinshub-tech Date: Mon, 1 Jun 2026 17:50:15 +0100 Subject: [PATCH 1/2] feat: enforce CLI version compatibility for templates --- src/commands/new.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/commands/new.rs b/src/commands/new.rs index 667c0252..5a9c3a92 100644 --- a/src/commands/new.rs +++ b/src/commands/new.rs @@ -219,7 +219,10 @@ fn scaffold_contract( p::header(&format!("Scaffolding Soroban contract: {}", name)); println!(" Template: {}\n", template.cyan()); - + // Ensure selected template is compatible with current CLI version + let entry = templates::get_template(&template)?; + templates::assert_template_compatible(&entry)?; + // Roll back the partially-created directory if any step below fails. let mut target_guard = PathCleanup::new(dir.to_path_buf()); From 363277c828d2fa4a673574af56e7318170da4a79 Mon Sep 17 00:00:00 2001 From: martinshub-tech Date: Mon, 1 Jun 2026 18:18:14 +0100 Subject: [PATCH 2/2] Add version compatibility checks for templates in starforge new contract command --- src/commands/new.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/commands/new.rs b/src/commands/new.rs index 5a9c3a92..2151effd 100644 --- a/src/commands/new.rs +++ b/src/commands/new.rs @@ -221,7 +221,30 @@ fn scaffold_contract( println!(" Template: {}\n", template.cyan()); // Ensure selected template is compatible with current CLI version let entry = templates::get_template(&template)?; - templates::assert_template_compatible(&entry)?; + match templates::check_template_compatibility(&entry) { + templates::CompatibilityStatus::Compatible => {} + templates::CompatibilityStatus::TooOld { required_min, running } => { + p::error(&format!( + "Template '{}' requires StarForge >= {} but you are running {}.\nPlease upgrade StarForge: https://github.com/Nanle-code/StarForge#installation", + entry.name, required_min, running + )); + return Ok(()); + } + templates::CompatibilityStatus::TooNew { required_max, running } => { + p::error(&format!( + "Template '{}' only supports StarForge <= {} but you are running {}.\nUse an older StarForge version or choose a compatible template.", + entry.name, required_max, running + )); + return Ok(()); + } + templates::CompatibilityStatus::MalformedMetadata { reason } => { + p::error(&format!( + "Template '{}' has malformed version metadata: {}.\nContact the template author to fix the cli_version_min / cli_version_max fields.", + entry.name, reason + )); + return Ok(()); + } + } // Roll back the partially-created directory if any step below fails. let mut target_guard = PathCleanup::new(dir.to_path_buf());