From 914996cb6d9f2b73271c4f724fcd2c91bcab7976 Mon Sep 17 00:00:00 2001 From: Kyle J Turpin Date: Sun, 12 Jul 2026 11:56:23 -0500 Subject: [PATCH] Initial Pile Of Files --- .editorconfig | 9 +++ .envrc | 2 + .gitignore | 14 ++++ .pre-commit-config.yaml | 8 ++ CONTRIBUTING.md | 9 +++ EoMRedux.csproj | 12 +++ LICENSE | 17 +++++ Makefile | 17 +++++ Program.cs | 9 +++ agents.md | 16 ++++ default.nix | 29 ++++++++ deps.nix | 2 + flake.lock | 27 +++++++ flake.nix | 138 ++++++++++++++++++++++++++++++++++ flatpak/app.flatpak.json | 22 ++++++ install-templates.sh | 155 +++++++++++++++++++++++++++++++++++++++ project.toml | 7 ++ shell.nix | 13 ++++ tests/SampleTest.cs | 9 +++ 19 files changed, 515 insertions(+) create mode 100644 .editorconfig create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 CONTRIBUTING.md create mode 100644 EoMRedux.csproj create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 Program.cs create mode 100644 agents.md create mode 100644 default.nix create mode 100644 deps.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 flatpak/app.flatpak.json create mode 100644 install-templates.sh create mode 100644 project.toml create mode 100644 shell.nix create mode 100644 tests/SampleTest.cs 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); + } +}