Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a17066c97b | ||
|
|
36a7c28c36 | ||
|
|
9a8bab00c8 | ||
|
|
62cea75016 | ||
|
|
bc0b1c9079 | ||
|
|
e76482e8f6 | ||
|
|
173e5f4aa0 | ||
|
|
68fac5b913 | ||
|
|
2151884527 | ||
|
|
d08c8803af |
+427
-2
@@ -1,4 +1,429 @@
|
|||||||
bin/
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
obj/
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
*.user
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
*.env
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
|
||||||
|
[Dd]ebug/x64/
|
||||||
|
[Dd]ebugPublic/x64/
|
||||||
|
[Rr]elease/x64/
|
||||||
|
[Rr]eleases/x64/
|
||||||
|
bin/x64/
|
||||||
|
obj/x64/
|
||||||
|
|
||||||
|
[Dd]ebug/x86/
|
||||||
|
[Dd]ebugPublic/x86/
|
||||||
|
[Rr]elease/x86/
|
||||||
|
[Rr]eleases/x86/
|
||||||
|
bin/x86/
|
||||||
|
obj/x86/
|
||||||
|
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
[Aa][Rr][Mm]64[Ee][Cc]/
|
||||||
|
bld/
|
||||||
|
[Oo]bj/
|
||||||
|
[Oo]ut/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Build results on 'Bin' directories
|
||||||
|
**/[Bb]in/*
|
||||||
|
# Uncomment if you have tasks that rely on *.refresh files to move binaries
|
||||||
|
# (https://github.com/github/gitignore/pull/3736)
|
||||||
|
#!**/[Bb]in/*.refresh
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
.vs/
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
*.trx
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Approval Tests result files
|
||||||
|
*.received.*
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
.artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.idb
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
# but not Directory.Build.rsp, as it configures directory-level build defaults
|
||||||
|
!Directory.Build.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.tlog
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
||||||
|
*.dsw
|
||||||
|
*.dsp
|
||||||
|
|
||||||
|
# Visual Studio 6 technical files
|
||||||
|
*.ncb
|
||||||
|
*.aps
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
**/.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
**/.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
**/.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
**/__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
#tools/**
|
||||||
|
#!tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
MSBuild_Logs/
|
||||||
|
|
||||||
|
# AWS SAM Build and Temporary Artifacts folder
|
||||||
|
.aws-sam
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
**/.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
**/.localhistory/
|
||||||
|
|
||||||
|
# Visual Studio History (VSHistory) files
|
||||||
|
.vshistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
**/.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
|
|
||||||
|
# VS Code files for those working on multiple tools
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/*.code-snippets
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# Built Visual Studio Code Extensions
|
||||||
|
*.vsix
|
||||||
|
|
||||||
|
# Windows Installer files from build outputs
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
@@ -7,13 +7,8 @@
|
|||||||
"isVisible": "true"
|
"isVisible": "true"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "skipRestore",
|
"id": "PluginDescription",
|
||||||
"name": { "text": "Skip Restore" },
|
"name": { "text": "Plugin Description" },
|
||||||
"isVisible": "true"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "SkipGit",
|
|
||||||
"name": { "text": "Skip Git" },
|
|
||||||
"isVisible": "true"
|
"isVisible": "true"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -10,48 +10,47 @@
|
|||||||
},
|
},
|
||||||
"sourceName": "LabApiPluginTemplate",
|
"sourceName": "LabApiPluginTemplate",
|
||||||
"preferNameDirectory": true,
|
"preferNameDirectory": true,
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"source": "./content",
|
||||||
|
"target": "./"
|
||||||
|
}
|
||||||
|
],
|
||||||
"symbols": {
|
"symbols": {
|
||||||
"PluginAuthor": {
|
"PluginAuthor": {
|
||||||
"type": "parameter",
|
"type": "parameter",
|
||||||
"datatype": "string",
|
"datatype": "string",
|
||||||
"defaultValue": "YourName",
|
"defaultValue": "Your Name",
|
||||||
"replaces": "YourName",
|
"replaces": "YourName",
|
||||||
"description": "Name used as the plugin's author (EntryPoint's Author property)."
|
"description": "Name used as the plugin's author."
|
||||||
},
|
},
|
||||||
"skipRestore": {
|
"PluginDescription": {
|
||||||
"type": "parameter",
|
"type": "parameter",
|
||||||
"datatype": "bool",
|
"datatype": "string",
|
||||||
"description": "If set, skips running 'dotnet restore' automatically after creating the project.",
|
"defaultValue": "Your Description",
|
||||||
"defaultValue": "false"
|
"replaces": "TODO: describe what this plugin does.",
|
||||||
},
|
"description": "Short description of what the plugin does."
|
||||||
"SkipGit": {
|
|
||||||
"type": "parameter",
|
|
||||||
"datatype": "bool",
|
|
||||||
"description": "If set, skips printing the reminder to initialize a git repository.",
|
|
||||||
"defaultValue": "false"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"primaryOutputs": [
|
"primaryOutputs": [
|
||||||
{ "path": "LabApiPluginTemplate.csproj" }
|
{ "path": "LabApiPluginTemplate/LabApiPluginTemplate.csproj" }
|
||||||
],
|
],
|
||||||
"postActions": [
|
"postActions": [
|
||||||
{
|
{
|
||||||
"condition": "(!skipRestore)",
|
"description": "Adds the generated project to the nearest solution file, if one exists.",
|
||||||
"description": "Restores the NuGet packages required by this project (including LabAPI).",
|
"manualInstructions": [
|
||||||
|
{ "text": "Run 'dotnet sln add' manually to add the project to your solution." }
|
||||||
|
],
|
||||||
|
"actionId": "D396686C-DE0E-4DE6-906D-291CD29FC5DE",
|
||||||
|
"continueOnError": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Restores the NuGet packages required by this project.",
|
||||||
"manualInstructions": [
|
"manualInstructions": [
|
||||||
{ "text": "Run 'dotnet restore'" }
|
{ "text": "Run 'dotnet restore'" }
|
||||||
],
|
],
|
||||||
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
|
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
|
||||||
"continueOnError": true
|
"continueOnError": true
|
||||||
},
|
|
||||||
{
|
|
||||||
"condition": "(!SkipGit)",
|
|
||||||
"description": "This project is not a git repository yet.",
|
|
||||||
"manualInstructions": [
|
|
||||||
{ "text": "Run 'git init && git add -A && git commit -m \"Initial commit\"'" }
|
|
||||||
],
|
|
||||||
"actionId": "AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C",
|
|
||||||
"continueOnError": true
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,179 +0,0 @@
|
|||||||
# CLAUDE.md
|
|
||||||
|
|
||||||
This repo **is** a `dotnet new` project template (identity `SCPSL.LabApi.PluginTemplate`,
|
|
||||||
shortName `labapi-plugin`), not a runnable plugin. It scaffolds SCP: Secret Laboratory
|
|
||||||
LabAPI plugins.
|
|
||||||
|
|
||||||
The next section only applies while you're editing **this template repository**
|
|
||||||
(i.e. a `.template.config/` folder is present next to this file). It does not apply
|
|
||||||
if you're instead looking at a plugin someone already generated from this template —
|
|
||||||
that folder never contains `.template.config/`, and its `EntryPoint.cs`/`Config.cs`
|
|
||||||
are ordinary project files at that point, not template scaffolding.
|
|
||||||
|
|
||||||
## Repo is template *source* — read before touching any file
|
|
||||||
|
|
||||||
`.template.config/template.json` sets this folder's name as the template's
|
|
||||||
`sourceName` and defines one text-replacement `symbol`, `PluginAuthor` (plus
|
|
||||||
`skipRestore` and `SkipGit`, which only toggle post-generation actions and replace no
|
|
||||||
text). The dotnet templating engine does a literal, repo-wide **string replacement**
|
|
||||||
at generation time — not semantic renaming — driven by that config:
|
|
||||||
|
|
||||||
- The folder/project name (`sourceName` in `template.json`, currently this repo's own
|
|
||||||
folder name) → whatever `-n`/`--name` the consumer passes to `dotnet new`.
|
|
||||||
- The placeholder value of the `PluginAuthor` symbol (the string currently sitting in
|
|
||||||
`EntryPoint.cs`'s `Author` property) → the consumer's `--PluginAuthor`.
|
|
||||||
|
|
||||||
Open `template.json` to see the exact current literal for each — don't hardcode them
|
|
||||||
again here or anywhere else in prose, because this file itself ships inside every
|
|
||||||
generated project and any exact match gets rewritten too (self-referential text like
|
|
||||||
"the project is called X" would silently turn into nonsense after generation).
|
|
||||||
|
|
||||||
Consequences:
|
|
||||||
- Never introduce an exact match of one of those two literals elsewhere in the repo
|
|
||||||
unless you intend it to be substituted too.
|
|
||||||
- If you add a new thing that should be configurable at generation time, add a symbol
|
|
||||||
to `template.json` (`type: parameter`, `replaces: "<literal>"`) instead of
|
|
||||||
hardcoding a magic string.
|
|
||||||
- `EntryPoint` and `Config` (the class names) are **not** substituted and must stay
|
|
||||||
literally named that — LabAPI's `PluginLoader` discovers plugins by type
|
|
||||||
inheritance, not by name, and the file names `EntryPoint.cs`/`Config.cs` are a fixed
|
|
||||||
part of this template's contract. Only the *namespace* tracks the project name.
|
|
||||||
|
|
||||||
## Repo layout (only what affects decisions)
|
|
||||||
|
|
||||||
- `.template.config/template.json` — template identity, the symbols above plus
|
|
||||||
`SkipGit` (a display-only toggle, see below), `primaryOutputs` (points at the
|
|
||||||
project file using its pre-substitution literal name — that's correct and expected,
|
|
||||||
not a bug), and two `postActions`: the standard dotnet-templating "restore NuGet
|
|
||||||
packages" action (id `210D431B-...`; skipped in Visual Studio, which restores on
|
|
||||||
its own) and a "display manual instructions" action (id `AC1156F7-...`) that prints
|
|
||||||
a reminder to run `git init` — see "Git on generation" below for why it's just a
|
|
||||||
printed reminder and not an executed command.
|
|
||||||
- `.template.config/ide.host.json` — Visual Studio-only UI hints for the New Project
|
|
||||||
wizard. It does **not** rename any symbol (the CLI flags stay `PluginAuthor`/
|
|
||||||
`skipRestore`/`SkipGit` — a flag can't contain a space); it only maps each symbol's
|
|
||||||
`id` to a human-readable `name.text` label (e.g. `SkipGit` → "Skip Git") shown in
|
|
||||||
VS's UI, via `isVisible: "true"` per entry (VS hides a symbol from that UI unless
|
|
||||||
explicitly marked visible here). Ignored entirely by `dotnet new` on the CLI.
|
|
||||||
- The `.csproj` at the repo root — the project file every generated plugin ships with.
|
|
||||||
- `EntryPoint.cs` / `Config.cs` — the scaffolded plugin (`Plugin<Config>`) and its
|
|
||||||
YAML-backed settings class.
|
|
||||||
- `.editorconfig` — formatting/naming only (indentation, brace style). It does **not**
|
|
||||||
enforce the comment/language rules below — those aren't analyzer-checkable.
|
|
||||||
- No `.sln`, no test project, no CI, no packaging (`.nupkg`) project, no GitHub
|
|
||||||
Copilot instructions file currently exist in this folder. Don't assume any of them.
|
|
||||||
This repo itself does have its own git history (see `git log`) — that's unrelated
|
|
||||||
to whether a *generated* project gets one, which is what "Git on generation" below
|
|
||||||
covers.
|
|
||||||
|
|
||||||
## Git on generation — why there's no automated `git init`
|
|
||||||
|
|
||||||
A generated project is **not** a git repository by default; a `postAction` only
|
|
||||||
prints a reminder to run `git init && git add -A && git commit -m "Initial commit"`.
|
|
||||||
This was a deliberate choice after testing the alternative:
|
|
||||||
|
|
||||||
- `dotnet new`'s only postAction capable of running an arbitrary process is the
|
|
||||||
"Run script" action (id `3A7C4B45-...`). Actually wiring it to run `git init`/
|
|
||||||
`git add`/`git commit` was tested and it **hangs forever** in any non-interactive
|
|
||||||
shell: the CLI's script-execution security gate demands an explicit `Y` typed at a
|
|
||||||
`Do you want to run this action [Y(yes)|N(no)]?` prompt, once per script action,
|
|
||||||
with no flag on this SDK to pre-approve it — unlike the NuGet-restore postAction,
|
|
||||||
which the CLI treats as trusted and never gates. Do not reintroduce "Run script"
|
|
||||||
postActions for this without re-verifying that gate no longer applies.
|
|
||||||
- Visual Studio's own "New Project" dialog already has a built-in "Create new Git
|
|
||||||
repository" checkbox that works for any template, including this one, with zero
|
|
||||||
template-side configuration — so VS users get this for free regardless.
|
|
||||||
- CLI users see the printed reminder above (governed by the `SkipGit` symbol) and run
|
|
||||||
the one-liner themselves.
|
|
||||||
|
|
||||||
## LabAPI contract (verified against northwood-studios/LabAPI source, not guessed)
|
|
||||||
|
|
||||||
`Plugin<TConfig>` (`LabApi.Loader.Features.Plugins`) requires implementing:
|
|
||||||
`Name`, `Description`, `Author`, `RequiredApiVersion` (all abstract get-only) plus
|
|
||||||
`Enable()`/`Disable()`. Overridable but optional: `Version` (defaults to the
|
|
||||||
assembly's version), `Priority` (`LoadPriority`, defaults to `Medium`),
|
|
||||||
`ConfigFileName` (defaults to `"config.yml"`). `Config` is a plain `class` with a
|
|
||||||
public parameterless constructor and public get/set properties — the base class
|
|
||||||
(de)serializes it via YamlDotNet automatically; don't hand-roll config I/O.
|
|
||||||
|
|
||||||
**Never invent a LabAPI class/namespace/method/property/attribute.** Before using one
|
|
||||||
you haven't already seen in this repo, check the restored package (`LabApi.dll` +
|
|
||||||
`LabApi.xml` under `%userprofile%\.nuget\packages\northwood.labapi\<version>\lib\net48\`)
|
|
||||||
or https://github.com/northwood-studios/LabAPI. If you can't verify a member exists,
|
|
||||||
say so instead of guessing. No Skill/plugin specific to C#, .NET, MSBuild, NuGet, or
|
|
||||||
LabAPI exists in the Claude Code skill catalog as of this writing — check
|
|
||||||
`ToolSearch`/`SearchSkills` for one before editing in case that has changed, but don't
|
|
||||||
assume one exists.
|
|
||||||
|
|
||||||
## Toolchain choices — don't "fix" these without being asked
|
|
||||||
|
|
||||||
- The project's `TargetFramework` is `netstandard2.1` on purpose, even though
|
|
||||||
LabAPI's own docs and the `Northwood.LabAPI` NuGet package only target
|
|
||||||
`net48`/`net481`. This is a deliberate compatibility choice (compiled output still
|
|
||||||
loads under the game's Mono/.NET Framework 4.8 host) that trades away some
|
|
||||||
netstandard2.1 BCL/language surface .NET Framework can't actually run (e.g. default
|
|
||||||
interface members). Don't switch it to `net48`, don't add multi-targeting, unless
|
|
||||||
the user asks.
|
|
||||||
- `LangVersion` is pinned explicitly (currently `14.0`) — don't let it drift to
|
|
||||||
`latest`.
|
|
||||||
- The `.csproj` suppresses exactly two warnings, both scoped as narrowly as MSBuild
|
|
||||||
allows, because of the netstandard2.1/net48-only-package combination above:
|
|
||||||
`NU1701` (via a per-`PackageReference` `<NoWarn>`, not a project-wide one) and
|
|
||||||
`MSB3270` (via `ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch=None`). Don't
|
|
||||||
broaden either into a blanket suppression and don't remove them without
|
|
||||||
understanding why (comments sit next to both in the `.csproj`).
|
|
||||||
- The `Northwood.LabAPI` `PackageReference` uses a floating `Version="*"` on purpose,
|
|
||||||
so every `dotnet restore` always pulls whatever is the latest stable release on
|
|
||||||
NuGet at that moment — there's no version to bump here. This is intentionally
|
|
||||||
**not** wired to `EntryPoint.cs`'s `RequiredApiVersion`, which can't be a floating
|
|
||||||
value (`System.Version` has no such concept and would throw at runtime if it tried).
|
|
||||||
`RequiredApiVersion` is a separate, manually-maintained literal representing the
|
|
||||||
minimum LabAPI version the scaffolded code is known to work with — bump it by hand
|
|
||||||
if you verify compatibility with a newer release, don't try to auto-sync it with the
|
|
||||||
floating restore. Also be aware a floating version means a plugin generated today can
|
|
||||||
restore a different (newer) LabAPI release than one generated last week, with no
|
|
||||||
pinning — that's the deliberate trade-off of "always latest" over reproducibility.
|
|
||||||
|
|
||||||
## Code style for anything you write here
|
|
||||||
|
|
||||||
- No `//`, `/* */`, or `///` comments unless the user explicitly asks for
|
|
||||||
comments/documentation in that request. No comments restating self-explanatory code.
|
|
||||||
`EntryPoint.cs`/`Config.cs` are already comment-free — keep them that way and follow
|
|
||||||
the same standard for any new file.
|
|
||||||
- All text embedded in code defaults to **English**: string/log/console messages,
|
|
||||||
exception messages, `[Description]`/config text, any user-facing string. Example:
|
|
||||||
`Logger.Info("Plugin initialized successfully")`, not a Spanish equivalent.
|
|
||||||
- This never applies to identifiers the user picked — project name, namespace,
|
|
||||||
class/method/property/variable names stay exactly as requested (standard C# casing
|
|
||||||
rules aside). Honor an explicit request for a specific piece of text in another
|
|
||||||
language.
|
|
||||||
|
|
||||||
## How to verify a change (no test suite exists — this is the actual check)
|
|
||||||
|
|
||||||
There is no automated test project. Verify any template change by actually
|
|
||||||
generating a project from it and building that output. Replace `<repo-name>` below
|
|
||||||
with this repo's actual folder name (the value you'd see in `sourceName`):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
dotnet new uninstall .
|
|
||||||
dotnet new install .
|
|
||||||
dotnet new labapi-plugin -n VerifyPlugin -o ../_verify/VerifyPlugin
|
|
||||||
cd ../_verify/VerifyPlugin
|
|
||||||
dotnet build
|
|
||||||
```
|
|
||||||
|
|
||||||
Expect `Build succeeded. 0 Warning(s) 0 Error(s)`. If it isn't 0/0, the change broke
|
|
||||||
either the template's own warning suppressions or something in `EntryPoint.cs`/
|
|
||||||
`Config.cs`/the `.csproj`.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
- Re-run `dotnet new uninstall .` + `dotnet new install .` after **any** edit to
|
|
||||||
`.template.config/template.json` or the scaffolded files — the template cache
|
|
||||||
keys off the installed path and stale content otherwise gets regenerated.
|
|
||||||
- `dotnet build` also works directly inside `<repo-name>` (the placeholder project
|
|
||||||
is itself valid and compilable), but that only proves the *unsubstituted*
|
|
||||||
placeholder compiles — it does not exercise symbol substitution. Always additionally
|
|
||||||
verify through an actual `dotnet new` generation before calling a change done.
|
|
||||||
- On Windows, if cleaning up `../_verify` fails with "resource busy", run
|
|
||||||
`dotnet build-server shutdown` first, then retry.
|
|
||||||
- Delete the `../_verify` scratch output when done; it isn't part of the template.
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<!-- .NET Standard 2.1: the most modern ABI that can still be loaded inside the
|
|
||||||
.NET Framework 4.8 / Mono process the SCP:SL dedicated server uses, letting the
|
|
||||||
project use recent C# syntax (see LangVersion) while still producing an
|
|
||||||
assembly compatible with the game's host runtime. -->
|
|
||||||
<TargetFramework>netstandard2.1</TargetFramework>
|
|
||||||
|
|
||||||
<!-- C# language version explicitly requested by the project. -->
|
|
||||||
<LangVersion>14.0</LangVersion>
|
|
||||||
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>disable</ImplicitUsings>
|
|
||||||
<RootNamespace>LabApiPluginTemplate</RootNamespace>
|
|
||||||
<AssemblyName>LabApiPluginTemplate</AssemblyName>
|
|
||||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
|
||||||
|
|
||||||
<!-- Northwood.LabAPI only ships net48/net481 binaries. Restoring it into a
|
|
||||||
netstandard2.1 project makes NuGet fall back to that asset group and raise
|
|
||||||
NU1701 to flag it. That's expected and safe here (the resulting assembly is
|
|
||||||
still loaded by the server's .NET Framework/Mono runtime either way), so this
|
|
||||||
suppresses just that one warning and only for this package. -->
|
|
||||||
<NoWarn>$(NoWarn);NU1701</NoWarn>
|
|
||||||
|
|
||||||
<!-- LabAPI's prebuilt assembly (and the game's own managed assemblies it depends
|
|
||||||
on) are built for .NET Framework, which on some SDK/platform combinations
|
|
||||||
triggers a processor-architecture mismatch warning (MSB3270) when resolving
|
|
||||||
references. It isn't an actual runtime problem, so this turns off just that
|
|
||||||
specific check instead of every MSBuild warning. -->
|
|
||||||
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<!-- Floating version: restore always resolves to the latest stable Northwood.LabAPI
|
|
||||||
release published on NuGet at the time, instead of a version pinned here. -->
|
|
||||||
<PackageReference Include="Northwood.LabAPI" Version="*">
|
|
||||||
<NoWarn>NU1701</NoWarn>
|
|
||||||
</PackageReference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
SCP: Secret Laboratory LabAPI plugin generated from the `labapi-plugin` template.
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
|
||||||
|
* The plugin targets `netstandard2.1` intentionally.
|
||||||
|
* LabAPI runs on the game's .NET Framework 4.8 environment, but the Unity version used by SCP: Secret Laboratory supports loading plugins targeting `netstandard2.1`.
|
||||||
|
* The official LabAPI repository is [LabApi GitHub](https://github.com/northwood-studios/LabAPI). Use it to verify LabAPI APIs, behavior, and implementation details instead of guessing.
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
* Do not change `TargetFramework`.
|
||||||
|
* Do not add multi-targeting.
|
||||||
|
* Do not change `LangVersion`.
|
||||||
|
* Do not remove or broaden the existing warning handling.
|
||||||
|
* Do not replace the floating `Northwood.LabAPI` version with a pinned version unless explicitly requested.
|
||||||
|
* Do not automatically synchronize `RequiredApiVersion` with the NuGet package version.
|
||||||
|
* Do not add comments unless explicitly requested.
|
||||||
|
* Do not invent LabAPI APIs, namespaces, classes, methods, properties, events, or attributes.
|
||||||
|
* Do not hand-roll configuration serialization or file I/O.
|
||||||
|
* Do not make unrelated changes to project configuration.
|
||||||
|
* Do not scan or read the repository broadly at the start of a task.
|
||||||
|
* Only inspect files relevant to the current request.
|
||||||
|
* Prefer targeted searches over broad repository exploration.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
* The `docs` directory contains project documentation and must be consulted before starting any task.
|
||||||
|
* Use the relevant documentation in `docs` to understand the project's architecture, conventions, design decisions, and non-obvious behavior before making changes.
|
||||||
|
* Do not create documentation that merely restates what the code already makes obvious.
|
||||||
|
* Document architecture, non-obvious behavior, important design decisions, and conventions that cannot be understood easily from the code alone.
|
||||||
|
* Keep documentation concise and focused on useful context.
|
||||||
|
* Update the relevant documentation when a change affects documented behavior, architecture, conventions, or design decisions.
|
||||||
|
* Keep documentation consistent with the current state of the code.
|
||||||
|
* Do not create unnecessary documentation files.
|
||||||
|
|
||||||
|
## LabAPI API Guidelines
|
||||||
|
|
||||||
|
`Plugin<TConfig>` requires the following members:
|
||||||
|
|
||||||
|
* `Name`
|
||||||
|
* `Description`
|
||||||
|
* `Author`
|
||||||
|
* `RequiredApiVersion`
|
||||||
|
* `Enable()`
|
||||||
|
* `Disable()`
|
||||||
|
|
||||||
|
Optional overridable members include:
|
||||||
|
|
||||||
|
* `Version`
|
||||||
|
* `Priority`
|
||||||
|
* `ConfigFileName`
|
||||||
|
|
||||||
|
`Config` is automatically serialized and deserialized by LabAPI using YamlDotNet.
|
||||||
|
|
||||||
|
Before using a LabAPI API that is not already present in the project, verify that it exists and confirm its signature using one of these sources:
|
||||||
|
|
||||||
|
1. The restored `LabApi.dll` and `LabApi.xml` from the NuGet package.
|
||||||
|
2. The official LabAPI source: https://github.com/northwood-studios/LabAPI.
|
||||||
|
|
||||||
|
Never guess an API. If an API or member cannot be verified, say so.
|
||||||
|
|
||||||
|
## Code Style
|
||||||
|
|
||||||
|
* Keep code simple and direct.
|
||||||
|
* Prefer existing project patterns over introducing new abstractions.
|
||||||
|
* Do not add unnecessary wrappers, helpers, interfaces, or dependencies.
|
||||||
|
* All text embedded in code must be in English.
|
||||||
|
* Identifiers do not need to be in English when a specific name has been requested.
|
||||||
|
* Avoid comments unless explicitly requested.
|
||||||
|
|
||||||
|
## Project Configuration
|
||||||
|
|
||||||
|
The following settings are intentional and must not be changed unless explicitly requested:
|
||||||
|
|
||||||
|
* `TargetFramework`
|
||||||
|
* `LangVersion`
|
||||||
|
* `Northwood.LabAPI` version
|
||||||
|
* `NU1701` warning handling
|
||||||
|
* `MSB3270` warning handling
|
||||||
|
|
||||||
|
`RequiredApiVersion` is a manually maintained minimum compatible LabAPI version. Update it only after compatibility with a newer LabAPI version has been verified.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
After making changes, run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dotnet build
|
||||||
|
```
|
||||||
|
|
||||||
|
The expected result is:
|
||||||
|
|
||||||
|
`Build succeeded. 0 Warning(s) 0 Error(s).`
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
@AGENTS.md
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<Solution>
|
||||||
|
</Solution>
|
||||||
@@ -13,11 +13,6 @@ dotnet_sort_system_directives_first = true
|
|||||||
csharp_new_line_before_open_brace = all
|
csharp_new_line_before_open_brace = all
|
||||||
csharp_prefer_braces = true:suggestion
|
csharp_prefer_braces = true:suggestion
|
||||||
|
|
||||||
# Naming and language conventions here reflect this project's own style; they
|
|
||||||
# do not by themselves enforce the "no unsolicited comments" / "English by
|
|
||||||
# default" rules in CLAUDE.md, which apply to any human or AI contributor
|
|
||||||
# regardless of what an analyzer can mechanically check.
|
|
||||||
|
|
||||||
[*.{csproj,json,yml,yaml}]
|
[*.{csproj,json,yml,yaml}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using LabApi.Features.Console;
|
using LabApi.Features.Console;
|
||||||
using LabApi.Loader.Features.Plugins;
|
using LabApi.Loader.Features.Plugins;
|
||||||
using LabApi.Loader.Features.Plugins.Enums;
|
|
||||||
|
|
||||||
namespace LabApiPluginTemplate
|
namespace LabApiPluginTemplate
|
||||||
{
|
{
|
||||||
@@ -9,22 +8,20 @@ namespace LabApiPluginTemplate
|
|||||||
{
|
{
|
||||||
public override string Name => "LabApiPluginTemplate";
|
public override string Name => "LabApiPluginTemplate";
|
||||||
|
|
||||||
public override string Description => "TODO: describe what this plugin does.";
|
public override string Description => "YourDescription";
|
||||||
|
|
||||||
public override string Author => "YourName";
|
public override string Author => "YourName";
|
||||||
|
|
||||||
public override Version RequiredApiVersion { get; } = new Version("1.1.7");
|
public override Version Version => new Version(1, 0, 0);
|
||||||
|
|
||||||
public override LoadPriority Priority => LoadPriority.Medium;
|
public override Version RequiredApiVersion { get; } = new Version(LabApiProperties.CompiledVersion);
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
Logger.Info($"{Name} has been enabled.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Disable()
|
public override void Disable()
|
||||||
{
|
{
|
||||||
Logger.Info($"{Name} has been disabled.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netstandard2.1</TargetFramework>
|
||||||
|
<LangVersion>14.0</LangVersion>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<NoWarn>$(NoWarn);NU1701;MSB3277</NoWarn>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Northwood.LabAPI" Version="1.1.7" Private="false" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Assembly-CSharp-publicized" HintPath="$(ScpDeps)\Assembly-CSharp-Publicized.dll" Private="false" />
|
||||||
|
<Reference Include="CommandSystem.Core" HintPath="$(ScpDeps)\CommandSystem.Core.dll" Private="false" />
|
||||||
|
<Reference Include="Mirror" HintPath="$(ScpDeps)\Mirror.dll" Private="false" />
|
||||||
|
<Reference Include="Pooling" HintPath="$(ScpDeps)\Pooling.dll" Private="false" />
|
||||||
|
<Reference Include="UnityEngine.CoreModule" HintPath="$(ScpDeps)\UnityEngine.CoreModule.dll" Private="false" />
|
||||||
|
<Reference Include="UnityEngine.PhysicsModule" HintPath="$(ScpDeps)\UnityEngine.PhysicsModule.dll" Private="false" />
|
||||||
|
<Reference Include="ThaumielMapEditor" HintPath="$(ScpDeps)\ThaumielMapEditor.dll" Private="false" />
|
||||||
|
<Reference Include="SecretLabNAudio.Core" HintPath="$(ScpDeps)\SecretLabNAudio.Core.dll" Private="false" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
Reference in New Issue
Block a user