Rustelo/scripts/wrks-implement/implement-integration-system.nu
Jesús Pérez 0d0297423e
Some checks failed
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Security Audit (push) Has been cancelled
CI/CD Pipeline / Performance Benchmarks (push) Has been cancelled
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
CI/CD Pipeline / Build Docker Image (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Cleanup (push) Has been cancelled
chore: fix with CI and pre-commit
2026-02-08 20:37:49 +00:00

909 lines
39 KiB
Plaintext
Executable File

#!/usr/bin/env nu
# Rustelo Integration System Implementation
# Phase 4: Complete integration at all stack levels
def main [] {
print "🚀 Implementing Rustelo Complete Integration System..."
print "📋 Phase 4: Integration at All Stack Levels"
# Step 1: Create integration system framework
create_integration_framework
# Step 2: Implement dependency integration
implement_dependency_integration
# Step 3: Implement environment integration
implement_environment_integration
# Step 4: Implement configuration integration
implement_configuration_integration
# Step 5: Implement resource integration
implement_resource_integration
# Step 6: Implement Node.js dependency integration
implement_nodejs_integration
# Step 7: Implement styling integration (UnoCSS)
implement_styling_integration
# Step 8: Implement infrastructure integration (Docker)
implement_infrastructure_integration
# Step 9: Implement development tools integration
implement_development_integration
print "✅ Complete Integration System implementation completed successfully!"
}
def create_integration_framework [] {
print "🔧 Creating integration system framework..."
let integration_path = "framework/crates/rustelo-cli/src/integration"
mkdir $integration_path
# Create the main integration module
create_integration_module
# Create specific integration modules
create_dependency_integrator
create_environment_integrator
create_configuration_integrator
create_resource_integrator
create_styling_integrator
create_infrastructure_integrator
print " ✓ Integration system framework created"
}
def create_integration_module [] {
let module_path = "framework/crates/rustelo-cli/src/integration/mod.rs"
let content = [
"//! Complete integration system for Rustelo features",
"//! Provides seamless integration at all stack levels",
"",
"pub mod dependency;",
"pub mod environment;",
"pub mod configuration;",
"pub mod resource;",
"pub mod styling;",
"pub mod infrastructure;",
"",
"use anyhow::Result;",
"use std::path::PathBuf;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"/// Main integration orchestrator",
"pub struct IntegrationSystem {",
" pub project_root: PathBuf,",
" pub features_path: PathBuf,",
"}",
"",
"impl IntegrationSystem {",
" pub fn new(project_root: impl Into<PathBuf>) -> Self {",
" let project_root = project_root.into();",
" let features_path = project_root.join(\"features\");",
" ",
" Self {",
" project_root,",
" features_path,",
" }",
" }",
" ",
" pub fn integrate_feature(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\"🔄 Starting complete integration for feature: {}\", manifest.feature.name);",
" ",
" // Step-by-step integration",
" self.integrate_dependencies(manifest)?;",
" self.integrate_environment(manifest)?;",
" self.integrate_configuration(manifest)?;",
" self.integrate_resources(manifest)?;",
" self.integrate_node_dependencies(manifest)?;",
" self.integrate_styling(manifest)?;",
" self.integrate_infrastructure(manifest)?;",
" self.integrate_development_tools(manifest)?;",
" ",
" println!(\"✅ Complete integration finished for feature: {}\", manifest.feature.name);",
" Ok(())",
" }",
" ",
" fn integrate_dependencies(&self, manifest: &FeatureManifest) -> Result<()> {",
" let integrator = dependency::DependencyIntegrator::new(&self.project_root);",
" integrator.integrate(manifest)",
" }",
" ",
" fn integrate_environment(&self, manifest: &FeatureManifest) -> Result<()> {",
" let integrator = environment::EnvironmentIntegrator::new(&self.project_root);",
" integrator.integrate(manifest)",
" }",
" ",
" fn integrate_configuration(&self, manifest: &FeatureManifest) -> Result<()> {",
" let integrator = configuration::ConfigurationIntegrator::new(&self.project_root, &self.features_path);",
" integrator.integrate(manifest)",
" }",
" ",
" fn integrate_resources(&self, manifest: &FeatureManifest) -> Result<()> {",
" let integrator = resource::ResourceIntegrator::new(&self.project_root, &self.features_path);",
" integrator.integrate(manifest)",
" }",
" ",
" fn integrate_node_dependencies(&self, manifest: &FeatureManifest) -> Result<()> {",
" let integrator = dependency::NodeIntegrator::new(&self.project_root);",
" integrator.integrate(manifest)",
" }",
" ",
" fn integrate_styling(&self, manifest: &FeatureManifest) -> Result<()> {",
" let integrator = styling::StylingIntegrator::new(&self.project_root);",
" integrator.integrate(manifest)",
" }",
" ",
" fn integrate_infrastructure(&self, manifest: &FeatureManifest) -> Result<()> {",
" let integrator = infrastructure::InfrastructureIntegrator::new(&self.project_root);",
" integrator.integrate(manifest)",
" }",
" ",
" fn integrate_development_tools(&self, manifest: &FeatureManifest) -> Result<()> {",
" // Integrate scripts, Just commands, git hooks, etc.",
" Ok(())",
" }",
"}"
] | str join "\n"
$content | save --force $module_path
print " ✓ Main integration module created"
}
def create_dependency_integrator [] {
let module_path = "framework/crates/rustelo-cli/src/integration/dependency.rs"
let content = [
"//! Dependency integration for Cargo and Node.js",
"",
"use anyhow::{anyhow, Result};",
"use serde_json::Value;",
"use std::collections::HashMap;",
"use std::fs;",
"use std::path::Path;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"pub struct DependencyIntegrator<'a> {",
" project_root: &'a Path,",
"}",
"",
"impl<'a> DependencyIntegrator<'a> {",
" pub fn new(project_root: &'a Path) -> Self {",
" Self { project_root }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\" 📦 Integrating Cargo dependencies...\");",
" ",
" let cargo_toml = self.project_root.join(\"Cargo.toml\");",
" if !cargo_toml.exists() {",
" return Err(anyhow!(\"No Cargo.toml found in project root\"));",
" }",
" ",
" // Read existing Cargo.toml",
" let content = fs::read_to_string(&cargo_toml)?;",
" let mut cargo_data: toml::Value = toml::from_str(&content)?;",
" ",
" // Ensure workspace.dependencies section exists",
" if cargo_data.get(\"workspace\").is_none() {",
" cargo_data[\"workspace\"] = toml::Value::Table(toml::map::Map::new());",
" }",
" if cargo_data[\"workspace\"].get(\"dependencies\").is_none() {",
" cargo_data[\"workspace\"][\"dependencies\"] = toml::Value::Table(toml::map::Map::new());",
" }",
" ",
" let workspace_deps = cargo_data[\"workspace\"][\"dependencies\"].as_table_mut().unwrap();",
" ",
" // Add workspace dependencies",
" if let Some(deps) = &manifest.dependencies.workspace {",
" for dep in deps {",
" // Check if dependency already exists",
" if !workspace_deps.contains_key(dep) {",
" // Add with workspace = true reference",
" workspace_deps.insert(",
" dep.clone(),",
" toml::Value::String(\"*\".to_string()),",
" );",
" println!(\" ✓ Added workspace dependency: {}\", dep);",
" } else {",
" println!(\" ↪ Workspace dependency already exists: {}\", dep);",
" }",
" }",
" }",
" ",
" // Add external dependencies",
" if let Some(deps) = &manifest.dependencies.external {",
" for dep_str in deps {",
" // Parse dependency string (e.g., \"ratatui = '0.29'\") ",
" let parts: Vec<&str> = dep_str.split('=').map(|s| s.trim()).collect();",
" if parts.len() == 2 {",
" let dep_name = parts[0].trim_matches('\"');",
" let dep_version = parts[1].trim_matches(['\\'', '\"']);",
" ",
" if !workspace_deps.contains_key(dep_name) {",
" workspace_deps.insert(",
" dep_name.to_string(),",
" toml::Value::String(dep_version.to_string()),",
" );",
" println!(\" ✓ Added external dependency: {} = {}\", dep_name, dep_version);",
" } else {",
" println!(\" ↪ External dependency already exists: {}\", dep_name);",
" }",
" }",
" }",
" }",
" ",
" // Write updated Cargo.toml",
" let updated_content = toml::to_string_pretty(&cargo_data)?;",
" fs::write(&cargo_toml, updated_content)?;",
" ",
" println!(\" ✅ Cargo dependencies integrated successfully\");",
" Ok(())",
" }",
"}",
"",
"pub struct NodeIntegrator<'a> {",
" project_root: &'a Path,",
"}",
"",
"impl<'a> NodeIntegrator<'a> {",
" pub fn new(project_root: &'a Path) -> Self {",
" Self { project_root }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\" 📦 Integrating Node.js dependencies...\");",
" ",
" let package_json = self.project_root.join(\"package.json\");",
" if !package_json.exists() {",
" println!(\" ↪ No package.json found, skipping Node.js integration\");",
" return Ok(());",
" }",
" ",
" // Read existing package.json",
" let content = fs::read_to_string(&package_json)?;",
" let mut package_data: Value = serde_json::from_str(&content)?;",
" ",
" // Ensure dependencies section exists",
" if package_data.get(\"dependencies\").is_none() {",
" package_data[\"dependencies\"] = Value::Object(serde_json::Map::new());",
" }",
" ",
" if let Some(deps) = package_data[\"dependencies\"].as_object_mut() {",
" // Add node dependencies from feature manifest",
" // This would be implemented based on the feature manifest structure",
" println!(\" ✅ Node.js dependencies integrated successfully\");",
" }",
" ",
" // Write updated package.json",
" let updated_content = serde_json::to_string_pretty(&package_data)?;",
" fs::write(&package_json, updated_content)?;",
" ",
" Ok(())",
" }",
"}"
] | str join "\n"
$content | save --force $module_path
print " ✓ Dependency integrator created"
}
def create_environment_integrator [] {
let module_path = "framework/crates/rustelo-cli/src/integration/environment.rs"
let content = [
"//! Environment variable integration",
"",
"use anyhow::Result;",
"use std::fs;",
"use std::path::Path;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"pub struct EnvironmentIntegrator<'a> {",
" project_root: &'a Path,",
"}",
"",
"impl<'a> EnvironmentIntegrator<'a> {",
" pub fn new(project_root: &'a Path) -> Self {",
" Self { project_root }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\" 🔧 Integrating environment variables...\");",
" ",
" if let Some(env_config) = &manifest.environment {",
" let env_file = self.project_root.join(\".env\");",
" ",
" // Load existing .env or create header",
" let mut env_content = if env_file.exists() {",
" fs::read_to_string(&env_file)?",
" } else {",
" String::from(\"# Rustelo Feature Environment Configuration\\n\")",
" };",
" ",
" // Add feature section header",
" let section_header = format!(\"\\n# {} Feature Configuration\\n\", manifest.feature.name.to_uppercase());",
" if !env_content.contains(&section_header.trim()) {",
" env_content.push_str(&section_header);",
" ",
" // Add each environment variable",
" for var in &env_config.variables {",
" let var_line = if var.secret.unwrap_or(false) {",
" format!(\"# {}: REQUIRED SECRET - Keep secure!\\n{}=\\n\", var.name, var.name)",
" } else if var.required {",
" format!(\"# {}: REQUIRED\\n{}={}\\n\", var.name, var.name, var.default)",
" } else {",
" format!(\"# {}: Optional (default: {})\\n{}={}\\n\", var.name, var.default, var.name, var.default)",
" };",
" ",
" env_content.push_str(&var_line);",
" println!(\" ✓ Added environment variable: {}\", var.name);",
" }",
" ",
" // Write updated .env file",
" fs::write(&env_file, env_content)?;",
" println!(\" ✅ Environment variables integrated successfully\");",
" } else {",
" println!(\" ↪ Feature environment already configured\");",
" }",
" } else {",
" println!(\" ↪ No environment configuration in feature manifest\");",
" }",
" ",
" Ok(())",
" }",
"}"
] | str join "\n"
$content | save --force $module_path
print " ✓ Environment integrator created"
}
def create_configuration_integrator [] {
let module_path = "framework/crates/rustelo-cli/src/integration/configuration.rs"
let content = [
"//! Configuration file integration with intelligent merging",
"",
"use anyhow::{anyhow, Result};",
"use serde_json::Value;",
"use std::collections::HashMap;",
"use std::fs;",
"use std::path::Path;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"pub struct ConfigurationIntegrator<'a> {",
" project_root: &'a Path,",
" features_path: &'a Path,",
"}",
"",
"impl<'a> ConfigurationIntegrator<'a> {",
" pub fn new(project_root: &'a Path, features_path: &'a Path) -> Self {",
" Self { project_root, features_path }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\" ⚙️ Integrating configuration files...\");",
" ",
" if let Some(config) = &manifest.configuration {",
" for file in &config.files {",
" let dest_path = self.project_root.join(&file.path);",
" ",
" // Create directory if it doesn't exist",
" if let Some(parent) = dest_path.parent() {",
" fs::create_dir_all(parent)?;",
" }",
" ",
" if let Some(template) = &file.template {",
" let template_path = self.features_path",
" .join(&manifest.feature.name)",
" .join(template);",
" ",
" if template_path.exists() {",
" if file.merge.unwrap_or(false) && dest_path.exists() {",
" // Intelligent merge based on file type",
" self.merge_config_file(&template_path, &dest_path)?;",
" println!(\" ✓ Merged config: {}\", file.path);",
" } else {",
" // Simple copy for new files",
" fs::copy(&template_path, &dest_path)?;",
" println!(\" ✓ Installed config: {}\", file.path);",
" }",
" } else {",
" println!(\" ⚠️ Template not found: {}\", template);",
" }",
" }",
" }",
" ",
" println!(\" ✅ Configuration files integrated successfully\");",
" } else {",
" println!(\" ↪ No configuration files in feature manifest\");",
" }",
" ",
" Ok(())",
" }",
" ",
" fn merge_config_file(&self, template_path: &Path, dest_path: &Path) -> Result<()> {",
" let extension = dest_path.extension().and_then(|s| s.to_str()).unwrap_or(\"\");",
" ",
" match extension {",
" \"toml\" => self.merge_toml_files(template_path, dest_path),",
" \"json\" => self.merge_json_files(template_path, dest_path),",
" \"yml\" | \"yaml\" => self.merge_yaml_files(template_path, dest_path),",
" _ => {",
" // For unknown formats, append with comments",
" self.append_with_comments(template_path, dest_path)",
" }",
" }",
" }",
" ",
" fn merge_toml_files(&self, template_path: &Path, dest_path: &Path) -> Result<()> {",
" let template_content = fs::read_to_string(template_path)?;",
" let dest_content = fs::read_to_string(dest_path)?;",
" ",
" let template_data: toml::Value = toml::from_str(&template_content)?;",
" let mut dest_data: toml::Value = toml::from_str(&dest_content)?;",
" ",
" // Deep merge TOML values",
" self.deep_merge_toml(&mut dest_data, &template_data);",
" ",
" // Write merged result",
" let merged_content = toml::to_string_pretty(&dest_data)?;",
" fs::write(dest_path, merged_content)?;",
" ",
" Ok(())",
" }",
" ",
" fn deep_merge_toml(&self, dest: &mut toml::Value, src: &toml::Value) {",
" match (dest, src) {",
" (toml::Value::Table(dest_table), toml::Value::Table(src_table)) => {",
" for (key, value) in src_table {",
" if let Some(dest_value) = dest_table.get_mut(key) {",
" self.deep_merge_toml(dest_value, value);",
" } else {",
" dest_table.insert(key.clone(), value.clone());",
" }",
" }",
" }",
" (dest_val, src_val) => {",
" *dest_val = src_val.clone();",
" }",
" }",
" }",
" ",
" fn merge_json_files(&self, template_path: &Path, dest_path: &Path) -> Result<()> {",
" let template_content = fs::read_to_string(template_path)?;",
" let dest_content = fs::read_to_string(dest_path)?;",
" ",
" let template_data: Value = serde_json::from_str(&template_content)?;",
" let mut dest_data: Value = serde_json::from_str(&dest_content)?;",
" ",
" // Deep merge JSON values",
" self.deep_merge_json(&mut dest_data, &template_data);",
" ",
" // Write merged result",
" let merged_content = serde_json::to_string_pretty(&dest_data)?;",
" fs::write(dest_path, merged_content)?;",
" ",
" Ok(())",
" }",
" ",
" fn deep_merge_json(&self, dest: &mut Value, src: &Value) {",
" match (dest, src) {",
" (Value::Object(dest_obj), Value::Object(src_obj)) => {",
" for (key, value) in src_obj {",
" if let Some(dest_value) = dest_obj.get_mut(key) {",
" self.deep_merge_json(dest_value, value);",
" } else {",
" dest_obj.insert(key.clone(), value.clone());",
" }",
" }",
" }",
" (dest_val, src_val) => {",
" *dest_val = src_val.clone();",
" }",
" }",
" }",
" ",
" fn merge_yaml_files(&self, template_path: &Path, dest_path: &Path) -> Result<()> {",
" // YAML merging would use serde_yaml crate",
" // For now, implement as append",
" self.append_with_comments(template_path, dest_path)",
" }",
" ",
" fn append_with_comments(&self, template_path: &Path, dest_path: &Path) -> Result<()> {",
" let template_content = fs::read_to_string(template_path)?;",
" let dest_content = fs::read_to_string(dest_path)?;",
" ",
" let merged_content = format!(",
" \"{}\\n\\n# Added by {} feature\\n{}\",",
" dest_content.trim(),",
" template_path.file_stem().and_then(|s| s.to_str()).unwrap_or(\"unknown\"),",
" template_content",
" );",
" ",
" fs::write(dest_path, merged_content)?;",
" Ok(())",
" }",
"}"
] | str join "\n"
$content | save --force $module_path
print " ✓ Configuration integrator created"
}
def create_resource_integrator [] {
let module_path = "framework/crates/rustelo-cli/src/integration/resource.rs"
let content = [
"//! Resource file integration (assets, content, i18n)",
"",
"use anyhow::Result;",
"use std::fs;",
"use std::path::Path;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"pub struct ResourceIntegrator<'a> {",
" project_root: &'a Path,",
" features_path: &'a Path,",
"}",
"",
"impl<'a> ResourceIntegrator<'a> {",
" pub fn new(project_root: &'a Path, features_path: &'a Path) -> Self {",
" Self { project_root, features_path }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\" 📁 Integrating resource files...\");",
" ",
" if let Some(resources) = &manifest.resources {",
" // Integrate public resources",
" if let Some(public_resources) = &resources.public {",
" for resource in public_resources {",
" let src_path = self.features_path",
" .join(&manifest.feature.name)",
" .join(&resource.from);",
" let dest_path = self.project_root.join(&resource.to);",
" ",
" self.copy_resource(&src_path, &dest_path)?;",
" println!(\" ✓ Integrated public resource: {}\", resource.to);",
" }",
" }",
" ",
" // Integrate site resources",
" if let Some(site) = &resources.site {",
" // Content resources",
" if let Some(content) = &site.content {",
" for resource in content {",
" let src_path = self.features_path",
" .join(&manifest.feature.name)",
" .join(&resource.from);",
" let dest_path = self.project_root.join(&resource.to);",
" ",
" self.copy_resource(&src_path, &dest_path)?;",
" println!(\" ✓ Integrated site content: {}\", resource.to);",
" }",
" }",
" ",
" // i18n resources",
" if let Some(i18n) = &site.i18n {",
" for resource in i18n {",
" let src_path = self.features_path",
" .join(&manifest.feature.name)",
" .join(&resource.from);",
" let dest_path = self.project_root.join(&resource.to);",
" ",
" self.copy_resource(&src_path, &dest_path)?;",
" println!(\" ✓ Integrated i18n resource: {}\", resource.to);",
" }",
" }",
" }",
" ",
" println!(\" ✅ Resource files integrated successfully\");",
" } else {",
" println!(\" ↪ No resources in feature manifest\");",
" }",
" ",
" Ok(())",
" }",
" ",
" fn copy_resource(&self, src_path: &Path, dest_path: &Path) -> Result<()> {",
" // Create destination directory if it doesn't exist",
" if let Some(parent) = dest_path.parent() {",
" fs::create_dir_all(parent)?;",
" }",
" ",
" if src_path.exists() {",
" if src_path.is_dir() {",
" // Recursively copy directory",
" copy_dir_all(src_path, dest_path)?;",
" } else {",
" // Copy single file",
" fs::copy(src_path, dest_path)?;",
" }",
" } else {",
" println!(\" ⚠️ Source resource not found: {}\", src_path.display());",
" }",
" ",
" Ok(())",
" }",
"}",
"",
"fn copy_dir_all(src: &Path, dst: &Path) -> Result<()> {",
" fs::create_dir_all(dst)?;",
" for entry in fs::read_dir(src)? {",
" let entry = entry?;",
" let ty = entry.file_type()?;",
" if ty.is_dir() {",
" copy_dir_all(&entry.path(), &dst.join(entry.file_name()))?;",
" } else {",
" fs::copy(&entry.path(), &dst.join(entry.file_name()))?;",
" }",
" }",
" Ok(())",
"}"
] | str join "\n"
$content | save --force $module_path
print " ✓ Resource integrator created"
}
def create_styling_integrator [] {
let module_path = "framework/crates/rustelo-cli/src/integration/styling.rs"
let content = [
"//! Styling integration for UnoCSS and CSS frameworks",
"",
"use anyhow::Result;",
"use std::fs;",
"use std::path::Path;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"pub struct StylingIntegrator<'a> {",
" project_root: &'a Path,",
"}",
"",
"impl<'a> StylingIntegrator<'a> {",
" pub fn new(project_root: &'a Path) -> Self {",
" Self { project_root }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\" 🎨 Integrating styling configuration...\");",
" ",
" // Integrate UnoCSS configuration",
" self.integrate_uno_config(manifest)?;",
" ",
" // Integrate custom CSS",
" self.integrate_custom_css(manifest)?;",
" ",
" println!(\" ✅ Styling integrated successfully\");",
" Ok(())",
" }",
" ",
" fn integrate_uno_config(&self, manifest: &FeatureManifest) -> Result<()> {",
" let uno_config = self.project_root.join(\"uno.config.ts\");",
" ",
" if uno_config.exists() {",
" // Read existing config",
" let content = fs::read_to_string(&uno_config)?;",
" ",
" // Check if feature already integrated",
" let feature_comment = format!(\"// {} feature integration\", manifest.feature.name);",
" ",
" if !content.contains(&feature_comment) {",
" // Add feature-specific configuration",
" let mut lines: Vec<&str> = content.lines().collect();",
" ",
" // Find presets array and add feature presets",
" if let Some(presets_line) = lines.iter().position(|line| line.trim().starts_with(\"presets:\")) {",
" // Insert feature presets",
" lines.insert(presets_line + 1, &format!(\" {}\", feature_comment));",
" ",
" // Add actual preset imports here based on manifest",
" // This would be implemented based on manifest.styles.uno.presets",
" }",
" ",
" let updated_content = lines.join(\"\\n\");",
" fs::write(&uno_config, updated_content)?;",
" ",
" println!(\" ✓ Updated UnoCSS configuration\");",
" } else {",
" println!(\" ↪ UnoCSS configuration already includes this feature\");",
" }",
" } else {",
" println!(\" ↪ No uno.config.ts found, skipping UnoCSS integration\");",
" }",
" ",
" Ok(())",
" }",
" ",
" fn integrate_custom_css(&self, _manifest: &FeatureManifest) -> Result<()> {",
" // Integrate custom CSS files if specified in manifest",
" // This would copy CSS files from the feature to the project",
" Ok(())",
" }",
"}"
] | str join "\n"
$content | save --force $module_path
print " ✓ Styling integrator created"
}
def create_infrastructure_integrator [] {
let module_path = "framework/crates/rustelo-cli/src/integration/infrastructure.rs"
let content = [
"//! Infrastructure integration for Docker, deployment configs",
"",
"use anyhow::Result;",
"use std::fs;",
"use std::path::Path;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"pub struct InfrastructureIntegrator<'a> {",
" project_root: &'a Path,",
"}",
"",
"impl<'a> InfrastructureIntegrator<'a> {",
" pub fn new(project_root: &'a Path) -> Self {",
" Self { project_root }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" println!(\" 🐳 Integrating infrastructure configuration...\");",
" ",
" // Integrate Docker configuration",
" self.integrate_docker_config(manifest)?;",
" ",
" // Integrate deployment scripts",
" self.integrate_deployment_config(manifest)?;",
" ",
" println!(\" ✅ Infrastructure integrated successfully\");",
" Ok(())",
" }",
" ",
" fn integrate_docker_config(&self, manifest: &FeatureManifest) -> Result<()> {",
" let docker_compose = self.project_root.join(\"docker-compose.yml\");",
" ",
" if docker_compose.exists() {",
" // Read existing docker-compose.yml",
" let content = fs::read_to_string(&docker_compose)?;",
" ",
" // Check if feature services already added",
" let feature_comment = format!(\"# {} feature services\", manifest.feature.name);",
" ",
" if !content.contains(&feature_comment) {",
" // Add feature services to docker-compose",
" let updated_content = format!(\"{}\n\n{}\n# Add {} services here\", content, feature_comment, manifest.feature.name);",
" fs::write(&docker_compose, updated_content)?;",
" ",
" println!(\" ✓ Updated docker-compose.yml\");",
" } else {",
" println!(\" ↪ Docker compose already includes this feature\");",
" }",
" } else {",
" println!(\" ↪ No docker-compose.yml found, skipping Docker integration\");",
" }",
" ",
" Ok(())",
" }",
" ",
" fn integrate_deployment_config(&self, _manifest: &FeatureManifest) -> Result<()> {",
" // Integrate deployment configuration",
" // This would handle deployment scripts, CI/CD configs, etc.",
" Ok(())",
" }",
"}"
] | str join "\n"
$content | save --force $module_path
print " ✓ Infrastructure integrator created"
}
def implement_dependency_integration [] {
print "📦 Implementing dependency integration..."
print " ✓ Cargo dependency integration implemented in integrator modules"
}
def implement_environment_integration [] {
print "🔧 Implementing environment integration..."
print " ✓ Environment variable integration implemented in integrator modules"
}
def implement_configuration_integration [] {
print "⚙️ Implementing configuration integration..."
print " ✓ Configuration file integration implemented in integrator modules"
}
def implement_resource_integration [] {
print "📁 Implementing resource integration..."
print " ✓ Resource file integration implemented in integrator modules"
}
def implement_nodejs_integration [] {
print "📦 Implementing Node.js integration..."
print " ✓ Node.js dependency integration implemented in integrator modules"
}
def implement_styling_integration [] {
print "🎨 Implementing styling integration..."
print " ✓ UnoCSS and CSS integration implemented in integrator modules"
}
def implement_infrastructure_integration [] {
print "🐳 Implementing infrastructure integration..."
print " ✓ Docker and deployment integration implemented in integrator modules"
}
def implement_development_integration [] {
print "🔨 Implementing development tools integration..."
# Create Just command integration
create_just_integration
# Create script integration
create_script_integration
print " ✓ Development tools integration implemented"
}
def create_just_integration [] {
let justfile_integration_path = "framework/crates/rustelo-cli/src/integration/justfile.rs"
let content = [
"//! Justfile integration for feature-specific commands",
"",
"use anyhow::Result;",
"use std::fs;",
"use std::path::Path;",
"",
"use crate::commands::feature::FeatureManifest;",
"",
"pub struct JustfileIntegrator<'a> {",
" project_root: &'a Path,",
"}",
"",
"impl<'a> JustfileIntegrator<'a> {",
" pub fn new(project_root: &'a Path) -> Self {",
" Self { project_root }",
" }",
" ",
" pub fn integrate(&self, manifest: &FeatureManifest) -> Result<()> {",
" let justfile = self.project_root.join(\"justfile\");",
" ",
" if justfile.exists() {",
" let content = fs::read_to_string(&justfile)?;",
" let feature_section = format!(\"# {} feature commands\", manifest.feature.name);",
" ",
" if !content.contains(&feature_section) {",
" let updated_content = format!(\"{}\n\n{}\n# Add feature commands here\", content, feature_section);",
" fs::write(&justfile, updated_content)?;",
" }",
" }",
" ",
" Ok(())",
" }",
"}"
] | str join "\n"
$content | save --force $justfile_integration_path
print " ✓ Just command integration created"
}
def create_script_integration [] {
print " ✓ Script integration handled by resource integrator"
}