|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: Evolving SeedFolder with GitHub Copilot - From Personal Tool to Multi-Template System |
| 4 | +description: How GitHub Copilot helped transform a simple dotfile copier into a comprehensive project scaffolding tool with multiple templates and cross-platform support |
| 5 | +tags: |
| 6 | +- dotnet-global-tools |
| 7 | +- github-copilot |
| 8 | +- dotnet |
| 9 | +- csharp |
| 10 | +- productivity |
| 11 | +- templates |
| 12 | + |
| 13 | +--- |
| 14 | +**Overview** ☀ |
| 15 | + |
| 16 | +It's been over 4 years since I first published my [.NET Core Global Tool](/2020/10/05/creating-a.net-core-global-tool.html) blog post about creating SeedFolder. What started as a simple tool to copy my personal dotfiles has evolved into something much more powerful and useful to the broader developer community. |
| 17 | + |
| 18 | +The original version was quite limited - it basically just copied my specific `.editorconfig`, `.gitignore`, and other dotfiles to new project folders. While this was useful for me, it wasn't particularly helpful to other developers who might have different preferences or work with different technology stacks. |
| 19 | + |
| 20 | +**The Evolution Journey** 🌱 |
| 21 | + |
| 22 | +Over the years, I've made several significant improvements to SeedFolder, particularly leveraging GitHub Copilot to help accelerate development and implement features I might not have found time to build otherwise. |
| 23 | + |
| 24 | +**Upgrading Through .NET LTS Versions** ⬆️ |
| 25 | + |
| 26 | +One of the consistent maintenance tasks has been keeping the tool updated with each .NET LTS release. For example, [upgrading to .NET 7](https://github.com/solrevdev/seedfolder/pull/4) involved updating the target framework and ensuring compatibility: |
| 27 | + |
| 28 | +```xml |
| 29 | +<Project Sdk="Microsoft.NET.Sdk"> |
| 30 | + <PropertyGroup> |
| 31 | + <OutputType>Exe</OutputType> |
| 32 | + <TargetFramework>net8.0</TargetFramework> |
| 33 | + <!-- Multi-targeting for backward compatibility --> |
| 34 | + <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks> |
| 35 | + |
| 36 | + <PackAsTool>true</PackAsTool> |
| 37 | + <ToolCommandName>seedfolder</ToolCommandName> |
| 38 | + <!-- ... other properties --> |
| 39 | + </PropertyGroup> |
| 40 | +</Project> |
| 41 | +``` |
| 42 | + |
| 43 | +The tool now uses multi-targeting to support various .NET SDKs, ensuring users can install and use it regardless of which .NET version they have installed. |
| 44 | + |
| 45 | +**GitHub Copilot as a Development Partner** 🤖 |
| 46 | + |
| 47 | +The real transformation happened when I started using GitHub Copilot - both from the web interface and my iOS app - to help implement more ambitious features. This was a game-changer for a side project that I rarely had dedicated time to improve. |
| 48 | + |
| 49 | +Here's how the process typically worked: |
| 50 | + |
| 51 | +1. **Issue Creation**: I'd create a GitHub issue describing what I wanted to achieve |
| 52 | +2. **Copilot Collaboration**: Using GitHub Copilot from the web or iOS app, I'd work through the implementation |
| 53 | +3. **Iterative Development**: Copilot would suggest implementations, and we'd refine them together |
| 54 | + |
| 55 | +For example, [Issue #9](https://github.com/solrevdev/seedfolder/issues/9) outlined a comprehensive roadmap for turning SeedFolder into a proper template system. What would have taken me weeks to implement manually, Copilot helped me accomplish in focused sessions. |
| 56 | + |
| 57 | +**From Single Template to Multi-Template System** 📂 |
| 58 | + |
| 59 | +The biggest transformation was moving from a single set of dotfiles to a comprehensive template system. [Pull Request #10](https://github.com/solrevdev/seedfolder/pull/10) introduced support for six different project types: |
| 60 | + |
| 61 | +```bash |
| 62 | +# Interactive mode - prompts for template selection |
| 63 | +seedfolder |
| 64 | + |
| 65 | +# Specific template usage |
| 66 | +seedfolder --template dotnet MyNewProject |
| 67 | +seedfolder --template node MyNodeApp |
| 68 | +seedfolder --template python data-analysis |
| 69 | +seedfolder --template ruby rails-app |
| 70 | +seedfolder --template markdown blog-posts |
| 71 | +seedfolder --template universal generic-project |
| 72 | + |
| 73 | +# Preview what would be created |
| 74 | +seedfolder --dry-run --template node MyApp |
| 75 | +``` |
| 76 | + |
| 77 | +Each template now includes carefully curated files appropriate for that project type: |
| 78 | + |
| 79 | +- **dotnet**: .editorconfig, .gitignore for C#, omnisharp.json |
| 80 | +- **node**: package.json template, .nvmrc, npm-specific .gitignore |
| 81 | +- **python**: requirements.txt, .python-version, Python .gitignore |
| 82 | +- **ruby**: Gemfile template, .ruby-version, Ruby .gitignore |
| 83 | +- **markdown**: Basic structure for documentation projects |
| 84 | +- **universal**: Generic files useful across all project types |
| 85 | + |
| 86 | +**Enhanced User Experience** ✨ |
| 87 | + |
| 88 | +The tool is now much more user-friendly and customizable. Some key improvements include: |
| 89 | + |
| 90 | +**Interactive Mode**: |
| 91 | +```bash |
| 92 | +$ seedfolder |
| 93 | +? Select a project template: (Use arrow keys) |
| 94 | +❯ dotnet - .NET applications with C# configuration |
| 95 | + node - Node.js applications with npm setup |
| 96 | + python - Python projects with pip requirements |
| 97 | + ruby - Ruby applications with Bundler setup |
| 98 | + markdown - Documentation and static sites |
| 99 | + universal - Generic template for any project type |
| 100 | +``` |
| 101 | + |
| 102 | +**Better CLI Interface**: |
| 103 | +```bash |
| 104 | +# All the standard options you'd expect |
| 105 | +seedfolder --help |
| 106 | +seedfolder --version |
| 107 | +seedfolder --list-templates |
| 108 | +seedfolder --template dotnet --output ./projects MyApi |
| 109 | +``` |
| 110 | + |
| 111 | +**Cross-Platform Compatibility**: The tool now works seamlessly across Windows, macOS, and Linux, with platform-specific optimizations. |
| 112 | + |
| 113 | +**Improved CI/CD Pipeline** 🔄 |
| 114 | + |
| 115 | +[Pull Request #16](https://github.com/solrevdev/seedfolder/pull/16) addressed CI workflow issues and simplified the build process: |
| 116 | + |
| 117 | +```yaml |
| 118 | +# Simplified from complex matrix to reliable single job |
| 119 | +name: CI |
| 120 | +on: |
| 121 | + push: |
| 122 | + branches: [ master ] |
| 123 | + pull_request: |
| 124 | + branches: [ master ] |
| 125 | + |
| 126 | +jobs: |
| 127 | + build: |
| 128 | + runs-on: ubuntu-latest |
| 129 | + steps: |
| 130 | + - uses: actions/checkout@v3 |
| 131 | + |
| 132 | + - name: Setup .NET |
| 133 | + uses: actions/setup-dotnet@v3 |
| 134 | + with: |
| 135 | + dotnet-version: | |
| 136 | + 6.0.x |
| 137 | + 7.0.x |
| 138 | + 8.0.x |
| 139 | + |
| 140 | + - name: Build and Test |
| 141 | + run: | |
| 142 | + dotnet build --configuration Release |
| 143 | + dotnet test --configuration Release --no-build |
| 144 | + |
| 145 | + - name: Pack and Publish |
| 146 | + if: github.ref == 'refs/heads/master' |
| 147 | + run: | |
| 148 | + dotnet pack --configuration Release --no-build |
| 149 | + dotnet nuget push "**/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} |
| 150 | +``` |
| 151 | +
|
| 152 | +**The Power of AI-Assisted Development** 🚀 |
| 153 | +
|
| 154 | +What I found particularly interesting about working with GitHub Copilot was how it helped me think through problems I might not have tackled otherwise. For instance: |
| 155 | +
|
| 156 | +- **Error Handling**: Copilot suggested comprehensive error handling patterns I wouldn't have thought to implement |
| 157 | +- **Cross-Platform Considerations**: It caught platform-specific issues early in development |
| 158 | +- **User Experience**: Proposed CLI interface improvements that made the tool much more pleasant to use |
| 159 | +- **Testing Strategies**: Suggested test cases and scenarios I hadn't considered |
| 160 | +
|
| 161 | +Here's an example of how Copilot helped implement the template selection logic: |
| 162 | +
|
| 163 | +```csharp |
| 164 | +public static class TemplateManager |
| 165 | +{ |
| 166 | + private static readonly Dictionary<string, TemplateInfo> Templates = new() |
| 167 | + { |
| 168 | + ["dotnet"] = new("dotnet", ".NET applications with C# configuration", |
| 169 | + new[] { ".editorconfig", ".gitignore", "omnisharp.json" }), |
| 170 | + ["node"] = new("node", "Node.js applications with npm setup", |
| 171 | + new[] { "package.json", ".nvmrc", ".gitignore" }), |
| 172 | + // ... other templates |
| 173 | + }; |
| 174 | + |
| 175 | + public static TemplateInfo GetTemplate(string name) |
| 176 | + { |
| 177 | + return Templates.TryGetValue(name.ToLowerInvariant(), out var template) |
| 178 | + ? template |
| 179 | + : throw new ArgumentException($"Template '{name}' not found"); |
| 180 | + } |
| 181 | + |
| 182 | + public static void ListTemplates() |
| 183 | + { |
| 184 | + foreach (var (key, template) in Templates) |
| 185 | + { |
| 186 | + Console.WriteLine($" {key,-12} - {template.Description}"); |
| 187 | + } |
| 188 | + } |
| 189 | +} |
| 190 | +``` |
| 191 | + |
| 192 | +**Next Steps: The Marketplace Vision** 🏪 |
| 193 | + |
| 194 | +The next major evolution is planned around [Issue #15](https://github.com/solrevdev/seedfolder/issues/15) - creating a template marketplace. This will allow the community to share and install custom templates: |
| 195 | + |
| 196 | +```bash |
| 197 | +# Future marketplace commands |
| 198 | +seedfolder marketplace search angular |
| 199 | +seedfolder marketplace install solrevdev/vue-typescript |
| 200 | +seedfolder marketplace list --installed |
| 201 | +seedfolder marketplace update |
| 202 | +``` |
| 203 | + |
| 204 | +The marketplace will be hosted as a separate GitHub repository at `solrevdev/seedfolder-marketplace` with this structure: |
| 205 | + |
| 206 | +``` |
| 207 | +solrevdev/seedfolder-marketplace/ |
| 208 | +├── templates/ |
| 209 | +│ ├── angular/ |
| 210 | +│ │ ├── template.json |
| 211 | +│ │ └── files/ |
| 212 | +│ ├── vue/ |
| 213 | +│ └── rust/ |
| 214 | +├── registry.json |
| 215 | +└── README.md |
| 216 | +``` |
| 217 | + |
| 218 | +This will enable developers to: |
| 219 | +- Share their own project templates |
| 220 | +- Override built-in templates with their preferences |
| 221 | +- Fork the marketplace for team-specific template collections |
| 222 | +- Contribute improvements back to the community |
| 223 | + |
| 224 | +**Installation and Usage Today** 📦 |
| 225 | + |
| 226 | +The current version is available on NuGet and much more capable than the original: |
| 227 | + |
| 228 | +```bash |
| 229 | +# Install the latest version |
| 230 | +dotnet tool install --global solrevdev.seedfolder |
| 231 | + |
| 232 | +# Create a new .NET project with proper scaffolding |
| 233 | +seedfolder --template dotnet MyWebApi |
| 234 | + |
| 235 | +# Interactive mode for template selection |
| 236 | +seedfolder MyNewProject |
| 237 | + |
| 238 | +# See all available options |
| 239 | +seedfolder --help |
| 240 | +``` |
| 241 | + |
| 242 | +**Lessons Learned** 💡 |
| 243 | + |
| 244 | +Working on SeedFolder's evolution taught me several valuable lessons: |
| 245 | + |
| 246 | +1. **AI as a Coding Partner**: GitHub Copilot isn't just an autocomplete tool - it's a thinking partner that can help you explore solutions you might not consider |
| 247 | +2. **Incremental Improvement**: Small, consistent improvements over time can transform a simple tool into something genuinely useful |
| 248 | +3. **Community Focus**: Building for your own needs first is fine, but thinking about broader use cases makes tools more valuable |
| 249 | +4. **Template Systems**: Flexibility through templates is much more powerful than hardcoded configurations |
| 250 | + |
| 251 | +The transformation from a personal dotfile copier to a comprehensive project scaffolding tool shows how AI assistance can help maintain and evolve side projects that might otherwise stagnate. |
| 252 | + |
| 253 | +Watch out for the next steps as I work on the marketplace functionality - the goal is to make SeedFolder not just more useful, but a platform for the community to share their own project setup best practices. |
| 254 | + |
| 255 | +Success! 🎉 |
0 commit comments