diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..3fbd696
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+# EditorConfig for .NET template
+root = true
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 4
diff --git a/.envrc b/.envrc
new file mode 100644
index 0000000..ea35353
--- /dev/null
+++ b/.envrc
@@ -0,0 +1,2 @@
+# Direnv configuration for Nix flakes
+use flake
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a9341db
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+# .NET build artifacts
+bin/
+obj/
+*.user
+*.suo
+.vs/
+
+# IDE
+.vscode/
+.idea/
+
+# Nix
+result
+.direnv/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..93d696f
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,8 @@
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.4.0
+ hooks:
+ - id: trailing-whitespace
+ - id: end-of-file-fixer
+ - id: check-yaml
+ - id: check-added-large-files
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..a94fcb9
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,9 @@
+# Contributing
+
+Thank you for considering contributing!
+
+- Please follow the project coding style and directory structure.
+- Submit issues or pull requests for bugs, features, or improvements.
+- Add tests for new features where possible.
+- Ensure your code builds and passes tests before submitting.
+- Contributions are licensed under CC BY-SA 4.0.
diff --git a/EoMRedux.csproj b/EoMRedux.csproj
new file mode 100644
index 0000000..35f1b43
--- /dev/null
+++ b/EoMRedux.csproj
@@ -0,0 +1,12 @@
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..eae17d3
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,17 @@
+Creative Commons Attribution-ShareAlike 4.0 International
+
+
+
+You are free to:
+
+- Share — copy and redistribute the material in any medium or format
+- Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+
+Under the following terms:
+
+- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made.
+- ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
+
+See the full license at the link above.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c4d0342
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,17 @@
+# Makefile for .NET template
+.PHONY: build run clean
+
+build:
+ dotnet build
+
+run:
+ dotnet run
+
+clean:
+ dotnet clean
+
+
+# Flatpak build target
+.PHONY: flatpak-build
+flatpak-build:
+ flatpak-builder --force-clean build-flatpak flatpak/app.flatpak.json
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..69b3e52
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,9 @@
+using System;
+
+class Program
+{
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello from .NET skeletal app. Edit Program.cs to get started!");
+ }
+}
diff --git a/agents.md b/agents.md
new file mode 100644
index 0000000..6dbad2a
--- /dev/null
+++ b/agents.md
@@ -0,0 +1,16 @@
+# Coding Agent Instructions
+
+This project is intended for educational purposes. To support this, please adhere to the following guidelines:
+
+## Allowed Actions
+- **Environment Maintenance:** Feel free to update Nix flakes, shell configurations, or other environment-related setup.
+- **Project Housekeeping:** Maintain a standard project layout, keep `README.md` up-to-date, and clean up temporary or build-related files.
+- **Documentation:** Add comments, manage project documentation, and add links to relevant external resources.
+
+## Restricted Actions
+- **Source Code Editing:** You are NOT allowed to edit the executable source code (project root) except to improve documentation..
+- **Code Generation:** Do not provide example code unless explicitly asked by the user.
+
+## Communication Guidelines
+- **Educational Focus:** When asked about code, prioritize explaining the concepts and providing advice over writing code.
+- **Documentation Links:** Always include links to official language or library documentation for references.
diff --git a/default.nix b/default.nix
new file mode 100644
index 0000000..9bfc4d3
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,29 @@
+{ pkgs }:
+let
+ lib = pkgs.lib;
+ templateName = builtins.baseNameOf (toString ./.);
+in
+{
+ ${templateName} = pkgs.stdenvNoCC.mkDerivation {
+ pname = templateName;
+ version = "0.1.0";
+ src = ./.;
+ dontBuild = true;
+ installPhase = ''
+ mkdir -p $out/share/${templateName}
+ if [ -d src ]; then
+ cp -r src $out/share/${templateName}/
+ fi
+ for f in README.md project.toml flake.nix default.nix shell.nix Makefile .editorconfig .gitignore; do
+ if [ -f "$f" ]; then
+ cp "$f" $out/share/${templateName}/
+ fi
+ done
+ '';
+ meta = with lib; {
+ description = "Template project: ${templateName}";
+ license = licenses.unfreeRedistributable;
+ platforms = platforms.all;
+ };
+ };
+}
diff --git a/deps.nix b/deps.nix
new file mode 100644
index 0000000..2d56c10
--- /dev/null
+++ b/deps.nix
@@ -0,0 +1,2 @@
+# Generated by nuget-to-nix (empty template for projects without external NuGet dependencies)
+[]
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..8e8f6d5
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,27 @@
+{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1783776592,
+ "narHash": "sha256-UgCQzxeWI75XM8G+hPrPh+MKzEPjG3SpAj7dtqSbksA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "e7a3ca8092b61ff85b6a45bf863ea2b2d6a661b3",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..5f58570
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,138 @@
+# flake.nix
+{
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+ };
+
+ outputs = {
+ self,
+ nixpkgs,
+ }: {
+ templates = {
+ default = {
+ description = ".NET dev environment (FHS) with SDK, EF Core, and optional Rider support";
+ welcomeText = ''
+ .NET skeletal project created.
+ - Build: dotnet build
+ - Run: dotnet run
+ - Rider: rider . (inside nix develop)
+ '';
+ path = ./.;
+ };
+ };
+
+ devShells = let
+ supportedSystems = [
+ "x86_64-linux"
+ "aarch64-linux"
+ "x86_64-darwin"
+ "aarch64-darwin"
+ ];
+ in
+ nixpkgs.lib.genAttrs supportedSystems (
+ system: let
+ pkgs = import nixpkgs {
+ inherit system;
+ config.allowUnfree = true;
+ };
+ fhs = pkgs.buildFHSEnv {
+ name = "dotnet-fhs-shell";
+ targetPkgs = pkgs: [
+ pkgs.dotnet-sdk
+ pkgs.dotnet-ef
+ pkgs.dotnet-aspnetcore
+ pkgs.csharpier
+ pkgs.icu
+ pkgs.openssl
+ pkgs.krb5
+ pkgs.zlib
+ pkgs.git
+ pkgs.gnumake
+ ];
+ runScript = "bash";
+ profile = ''
+ export DOTNET_ROOT=${pkgs.dotnet-sdk}
+ export DOTNET_CLI_HOME=$HOME/.dotnet
+ export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+ export DOTNET_CLI_TELEMETRY_OPTOUT=1
+ export PATH=${pkgs.dotnet-sdk}/bin:$PATH
+ '';
+ };
+ in {
+ default = fhs.env.overrideAttrs (_: {
+ shellHook = ''
+ # Initialize git repository if not already present
+ if [ ! -d .git ]; then
+ git init
+ echo "✓ Initialized git repository"
+ fi
+
+ export DOTNET_ROOT=${pkgs.dotnet-sdk}
+ export DOTNET_CLI_HOME=$HOME/.dotnet
+ export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+ export DOTNET_CLI_TELEMETRY_OPTOUT=1
+ export PATH=${pkgs.dotnet-sdk}/bin:$PATH
+ echo "FHS shell for .NET development"
+ echo "DOTNET_ROOT=$DOTNET_ROOT"
+ '';
+ });
+ }
+ );
+
+ packages = let
+ supportedSystems = [
+ "x86_64-linux"
+ "aarch64-linux"
+ "x86_64-darwin"
+ "aarch64-darwin"
+ ];
+ in
+ nixpkgs.lib.genAttrs supportedSystems (
+ system: let
+ pkgs = import nixpkgs {
+ inherit system;
+ config.allowUnfree = true;
+ };
+ in {
+ default = pkgs.buildDotnetModule {
+ pname = "sample-dotnet-app";
+ version = "0.1.0";
+ src = ./.;
+ projectFile = "SampleApp.csproj";
+ nugetDeps = ./deps.nix;
+ selfContainedBuild = false;
+ meta.mainProgram = "SampleApp";
+ };
+
+ devHelper = pkgs.writeShellScriptBin "dev-helper" ''
+ echo ".NET dev environment"
+ command -v dotnet >/dev/null 2>&1 && dotnet --version || true
+ echo "This binary is built by Nix (packages.devHelper)."
+ '';
+ }
+ );
+
+ apps = let
+ supportedSystems = [
+ "x86_64-linux"
+ "aarch64-linux"
+ "x86_64-darwin"
+ "aarch64-darwin"
+ ];
+ in
+ nixpkgs.lib.genAttrs supportedSystems (
+ system: let
+ pkgs = nixpkgs.legacyPackages.${system};
+ in {
+ default = {
+ type = "app";
+ program = pkgs.lib.getExe self.packages.${system}.default;
+ };
+ dev-helper = {
+ type = "app";
+ program = pkgs.lib.getExe self.packages.${system}.devHelper;
+ };
+ }
+ );
+ };
+}
diff --git a/flatpak/app.flatpak.json b/flatpak/app.flatpak.json
new file mode 100644
index 0000000..f86f76d
--- /dev/null
+++ b/flatpak/app.flatpak.json
@@ -0,0 +1,22 @@
+{
+ "app-id": "org.example.dotnetdevshell",
+ "runtime": "org.freedesktop.Platform",
+ "runtime-version": "23.08",
+ "sdk": "org.freedesktop.Sdk",
+ "command": "dotnetdevshell-app",
+ "modules": [
+ {
+ "name": "dotnetdevshell-app",
+ "buildsystem": "simple",
+ "build-commands": [
+ "dotnet publish -c Release -o out"
+ ],
+ "sources": [
+ {
+ "type": "dir",
+ "path": ".."
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/install-templates.sh b/install-templates.sh
new file mode 100644
index 0000000..cbf32a7
--- /dev/null
+++ b/install-templates.sh
@@ -0,0 +1,155 @@
+#!/usr/bin/env bash
+# Helper script to install popular .NET templates from NuGet
+
+set -e
+
+echo "🔧 .NET Template Installer"
+echo "=========================="
+echo ""
+
+# Function to install a template
+install_template() {
+ local name="$1"
+ local package="$2"
+ echo "📦 Installing $name..."
+ dotnet new install "$package" || echo "⚠️ Failed to install $name"
+ echo ""
+}
+
+# Parse arguments
+if [ "$#" -eq 0 ]; then
+ echo "Usage: $0 [all|web|cloud|testing|mobile|list]"
+ echo ""
+ echo "Categories:"
+ echo " all - Install all popular templates"
+ echo " web - Web development templates"
+ echo " cloud - Cloud & AWS templates"
+ echo " testing - Testing frameworks"
+ echo " mobile - Mobile development"
+ echo " list - Show available categories"
+ echo ""
+ echo "Individual templates:"
+ echo " aws - AWS Lambda templates"
+ echo " blazor - Blazor templates"
+ echo " nunit - NUnit 3 test templates"
+ echo " xunit - xUnit test templates"
+ echo " reqnroll - Reqnroll BDD templates"
+ echo " avalonia - Avalonia UI (cross-platform)"
+ echo " boxed - ASP.NET Core Boxed templates"
+ echo " clean - Clean Architecture templates"
+ echo " giraffe - Giraffe F# web framework"
+ echo " safe - SAFE Stack (F#)"
+ exit 0
+fi
+
+case "$1" in
+ all)
+ echo "Installing all popular templates..."
+ install_template "AWS Lambda" "Amazon.Lambda.Templates"
+ install_template "NUnit 3" "NUnit3.DotNetNew.Template"
+ install_template "Reqnroll" "Reqnroll.Templates.DotNet"
+ install_template ".NET Boxed" "Boxed.Templates"
+ install_template "Avalonia UI" "Avalonia.Templates"
+ install_template "Clean Architecture (Manga)" "Paulovich.Manga"
+ ;;
+
+ web)
+ echo "Installing web development templates..."
+ install_template ".NET Boxed" "Boxed.Templates"
+ install_template "Carter" "CarterTemplate"
+ install_template "Giraffe (F#)" "giraffe-template"
+ ;;
+
+ cloud)
+ echo "Installing cloud templates..."
+ install_template "AWS Lambda" "Amazon.Lambda.Templates"
+ install_template "Azure Functions" "Microsoft.Azure.Functions.Templates"
+ ;;
+
+ testing)
+ echo "Installing testing templates..."
+ install_template "NUnit 3" "NUnit3.DotNetNew.Template"
+ install_template "Reqnroll" "Reqnroll.Templates.DotNet"
+ install_template "NSpec" "dotnet-new-nspec"
+ install_template "Expecto (F#)" "Expecto.Template"
+ ;;
+
+ mobile)
+ echo "Installing mobile development templates..."
+ install_template "Avalonia UI" "Avalonia.Templates"
+ install_template "Fabulous Xamarin.Forms" "Fabulous.XamarinForms.Templates"
+ ;;
+
+ aws)
+ install_template "AWS Lambda" "Amazon.Lambda.Templates"
+ ;;
+
+ blazor)
+ install_template "Blazor" "Microsoft.AspNetCore.Blazor.Templates::3.0.0-*"
+ ;;
+
+ nunit)
+ install_template "NUnit 3" "NUnit3.DotNetNew.Template"
+ ;;
+
+ xunit)
+ install_template "xUnit Test File" "GatewayProgrammingSchool.xUnit.CSharp"
+ ;;
+
+ reqnroll)
+ install_template "Reqnroll" "Reqnroll.Templates.DotNet"
+ ;;
+
+ avalonia)
+ install_template "Avalonia UI" "Avalonia.Templates"
+ ;;
+
+ boxed)
+ install_template ".NET Boxed" "Boxed.Templates"
+ ;;
+
+ clean)
+ install_template "Clean Architecture (Manga)" "Paulovich.Manga"
+ install_template "Clean Architecture (Caju)" "Paulovich.Caju"
+ ;;
+
+ giraffe)
+ install_template "Giraffe (F#)" "giraffe-template"
+ ;;
+
+ safe)
+ install_template "SAFE Stack (F#)" "SAFE.Template"
+ ;;
+
+ list)
+ echo "Available categories and templates:"
+ echo ""
+ echo "Categories:"
+ echo " all - Install all popular templates"
+ echo " web - Web development (Boxed, Carter, Giraffe)"
+ echo " cloud - Cloud platforms (AWS Lambda, Azure Functions)"
+ echo " testing - Testing frameworks (NUnit, Reqnroll, NSpec)"
+ echo " mobile - Mobile development (Avalonia, Fabulous)"
+ echo ""
+ echo "Individual templates:"
+ echo " aws - AWS Lambda templates"
+ echo " blazor - Blazor templates"
+ echo " nunit - NUnit 3 test templates"
+ echo " xunit - xUnit test templates"
+ echo " reqnroll - Reqnroll BDD templates"
+ echo " avalonia - Avalonia UI (cross-platform)"
+ echo " boxed - ASP.NET Core Boxed templates"
+ echo " clean - Clean Architecture templates"
+ echo " giraffe - Giraffe F# web framework"
+ echo " safe - SAFE Stack (F#)"
+ ;;
+
+ *)
+ echo "❌ Unknown option: $1"
+ echo "Run '$0' without arguments to see usage."
+ exit 1
+ ;;
+esac
+
+echo ""
+echo "✅ Done! List installed templates with: dotnet new list"
diff --git a/project.toml b/project.toml
new file mode 100644
index 0000000..8d08708
--- /dev/null
+++ b/project.toml
@@ -0,0 +1,7 @@
+# Project metadata for .NET template
+[project]
+name = "dotnet-template"
+description = "Nix flake template for .NET projects"
+authors = ["Your Name "]
+version = "0.1.0"
+license = "MIT"
diff --git a/shell.nix b/shell.nix
new file mode 100644
index 0000000..fdef55b
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,13 @@
+# Legacy shell.nix for .NET template
+{
+ pkgs ? import { },
+}:
+pkgs.mkShell {
+ buildInputs = [
+ pkgs.dotnet-sdk
+ pkgs.git
+ ];
+ shellHook = "" "
+echo 'Welcome to the .NET devShell!'
+" "";
+}
diff --git a/tests/SampleTest.cs b/tests/SampleTest.cs
new file mode 100644
index 0000000..58b0163
--- /dev/null
+++ b/tests/SampleTest.cs
@@ -0,0 +1,9 @@
+using Xunit;
+public class SampleTest
+{
+ [Fact]
+ public void TestSample()
+ {
+ Assert.Equal(1, 1);
+ }
+}