Add initial project structure with configuration and sample files

- Create .envrc for Direnv configuration
- Add .pre-commit-config.yaml for pre-commit hooks
- Include CONTRIBUTING.md with contribution guidelines
- Implement Makefile for build, run, and clean commands
- Set up Program.cs with a basic Hello World message
- Define SampleApp.csproj for .NET project configuration
- Add agents.md for coding agent instructions
- Create default.nix for Nix flake setup
- Initialize deps.nix for NuGet dependencies
- Configure Flatpak app with app.flatpak.json
- Implement install-templates.sh for installing .NET templates
- Define project.toml for project metadata
- Set up shell.nix for development shell environment
- Add SampleTest.cs for basic unit testing
This commit is contained in:
2026-09-27 10:12:18 -05:00
parent bf1ee307c4
commit 852ae835d1
25 changed files with 517 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
# Direnv configuration for Nix flakes
use flake
+8
View File
@@ -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
+9
View File
@@ -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.
+16
View File
@@ -0,0 +1,16 @@
# Makefile for .NET template
.PHONY: build run clean
build:
dotnet build
run:
dotnet run
clean:
dotnet clean
# Flatpak build target
.PHONY: flatpak-build:
flatpak-builder --force-clean build-flatpak flatpak/app.flatpak.json
+9
View File
@@ -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!");
}
}
+12
View File
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Include="flake.nix" />
<None Include=".envrc" />
</ItemGroup>
</Project>
+16
View File
@@ -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.
+27
View File
@@ -0,0 +1,27 @@
{pkgs}: let
inherit (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;
};
};
}
+2
View File
@@ -0,0 +1,2 @@
# Generated by nuget-to-nix (empty template for projects without external NuGet dependencies)
[]
+22
View File
@@ -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": ".."
}
]
}
]
}
+155
View File
@@ -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"
@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("SampleApp")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+bf1ee307c4685b53b646d2fe5262a387f7f4436b")]
[assembly: System.Reflection.AssemblyProductAttribute("SampleApp")]
[assembly: System.Reflection.AssemblyTitleAttribute("SampleApp")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.
@@ -0,0 +1 @@
edc3f47facf5fd644d86f80cd978eaba671a3b1162e7912252145921f18c4a43
@@ -0,0 +1,13 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = SampleApp
build_property.ProjectDir = /home/gooba42/Documents/Projects/Coding/dotnet/flaky/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
Binary file not shown.
+67
View File
@@ -0,0 +1,67 @@
{
"format": 1,
"restore": {
"/home/gooba42/Documents/Projects/Coding/dotnet/flaky/SampleApp.csproj": {}
},
"projects": {
"/home/gooba42/Documents/Projects/Coding/dotnet/flaky/SampleApp.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/gooba42/Documents/Projects/Coding/dotnet/flaky/SampleApp.csproj",
"projectName": "SampleApp",
"projectPath": "/home/gooba42/Documents/Projects/Coding/dotnet/flaky/SampleApp.csproj",
"packagesPath": "/home/gooba42/.nuget/packages/",
"outputPath": "/home/gooba42/Documents/Projects/Coding/dotnet/flaky/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/gooba42/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {},
"https://git.moturpin.com/api/packages/<owner>/nuget/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/nix/store/z9k3zizjvnvc7la71zlm7amz7fyz5wi4-dotnet-sdk-8.0.424/share/dotnet/sdk/8.0.424/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/gooba42/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/gooba42/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/home/gooba42/.nuget/packages/" />
</ItemGroup>
</Project>
+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
+72
View File
@@ -0,0 +1,72 @@
{
"version": 3,
"targets": {
"net8.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net8.0": []
},
"packageFolders": {
"/home/gooba42/.nuget/packages/": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/gooba42/Documents/Projects/Coding/dotnet/flaky/SampleApp.csproj",
"projectName": "SampleApp",
"projectPath": "/home/gooba42/Documents/Projects/Coding/dotnet/flaky/SampleApp.csproj",
"packagesPath": "/home/gooba42/.nuget/packages/",
"outputPath": "/home/gooba42/Documents/Projects/Coding/dotnet/flaky/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/gooba42/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {},
"https://git.moturpin.com/api/packages/<owner>/nuget/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/nix/store/z9k3zizjvnvc7la71zlm7amz7fyz5wi4-dotnet-sdk-8.0.424/share/dotnet/sdk/8.0.424/PortableRuntimeIdentifierGraph.json"
}
}
}
}
+8
View File
@@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "YHNJGPxTJZ8=",
"success": true,
"projectFilePath": "/home/gooba42/Documents/Projects/Coding/dotnet/flaky/SampleApp.csproj",
"expectedPackageFiles": [],
"logs": []
}
+7
View File
@@ -0,0 +1,7 @@
# Project metadata for .NET template
[project]
name = "dotnet-template"
description = "Nix flake template for .NET projects"
authors = ["Your Name <you@example.com>"]
version = "0.1.0"
license = "MIT"
+11
View File
@@ -0,0 +1,11 @@
# Legacy shell.nix for .NET template
{pkgs ? import <nixpkgs> {}}:
pkgs.mkShell {
buildInputs = [
pkgs.dotnet-sdk
pkgs.git
];
shellHook = "" "
echo 'Welcome to the .NET devShell!'
" "";
}
+9
View File
@@ -0,0 +1,9 @@
using Xunit;
public class SampleTest
{
[Fact]
public void TestSample()
{
Assert.Equal(1, 1);
}
}