async fn read_all(
        &self,
        file_paths: &[PathBuf],
        cwd: &Path,
    ) -> anyhow::Result<Vec<(String, String)>> {
        let futures = file_paths.iter().map(|template_path| async {
            let template_name = template_path
                .file_name()
                .and_then(|name| name.to_str())
                .with_context(|| format!("Invalid filename: {}", template_path.display()))?
                .to_string();
            let template_path = cwd.join(template_path.clone());
            let content = self
                .infra
                .file_read_service()
                .read_utf8(&template_path)
                .await?;
            Ok::<_, anyhow::Error>((template_name, content))
        });

        future::join_all(futures)
            .await
            .into_iter()
            .collect::<Result<Vec<_>, _>>()
    }
Reads multiple template files in parallel and returns their names and
contents.

Takes a list of file paths and the current working directory, then reads
all files concurrently using async futures. Returns a vector of
(name, content) tuples.
crates/forge_services/src/template.rs