# AGENTS.md This repo is the source of a `dotnet new` template (shortName `labapi-plugin`) that scaffolds SCP: Secret Laboratory LabAPI plugins. This file follows the editor/vendor-agnostic [agents.md](https://agents.md) convention for AI coding tools other than Claude Code (Cursor, Codex, etc.). **`CLAUDE.md` is this repo's primary, detailed instructions file** — read it first if your tooling can. What follows is the condensed subset any agent needs, kept in sync with `CLAUDE.md`. ## This is template source, not a plugin This section applies only while `.template.config/` is present next to this file — i.e. you're editing the template repo itself, not a plugin already generated from it. `.template.config/template.json` makes the dotnet templating engine do a **literal, repo-wide string replacement** at generation time (not semantic renaming): this folder's own name (`sourceName`) becomes whatever project name a consumer picks, the placeholder author name in `EntryPoint.cs` becomes their `--PluginAuthor`, and the LabAPI version pinned in the `.csproj`/`EntryPoint.cs` becomes their `--LabApiVersion`. See `template.json` for the exact current literals — don't repeat them verbatim in prose here, since this file ships inside every generated project and an exact match would get silently rewritten too. Don't introduce an exact match of one of those literals elsewhere in the repo unless you mean for it to be substituted; add a new `template.json` symbol instead of hardcoding a magic string. `EntryPoint`/ `Config` (the class names) are intentionally **not** substituted — only the namespace tracks the project name. ## Never invent LabAPI API surface Don't assume a LabAPI class/namespace/method/property/attribute exists. Verify it against the restored `Northwood.LabAPI` package (`LabApi.dll`/`LabApi.xml` under `%userprofile%\.nuget\packages\northwood.labapi\\lib\net48\`) or https://github.com/northwood-studios/LabAPI first. If you can't verify a member, say so instead of guessing. ## Toolchain choices — don't change without being asked `TargetFramework` is `netstandard2.1` on purpose (LabAPI itself only ships `net48`/`net481`), chosen so the plugin still loads under the game's Mono/.NET Framework 4.8 host. `LangVersion` is pinned to `14.0`. The `.csproj` suppresses exactly `NU1701` (scoped to the `Northwood.LabAPI` `PackageReference`) and `MSB3270` (via `ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch=None`) because of that netstandard2.1/net48-only-package combination — don't broaden either into a blanket suppression or remove them. ## Code style and language No `//`, `/* */`, or `///` comments unless the user explicitly asks for them in that request; don't add comments restating self-explanatory code — `EntryPoint.cs`/ `Config.cs` are already comment-free, follow the same standard for new files. All text embedded in code (log/console messages, exceptions, config descriptions, user-facing strings) defaults to English — e.g. `Logger.Info("Plugin initialized successfully")` — except identifiers the user requested (project name, namespace, class/method/property/variable names), which are never translated, and text the user explicitly asks to be in another language. ## Verifying a change No automated tests exist. Verify by generating a real project and building it: ```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)`. See `CLAUDE.md` for the full verification notes (cache invalidation after editing `template.json`, Windows cleanup caveats).