MosswartMassacre/AGENTS.md
Erik e20f9df256 feat: add searchable metas sync tab and configurable auto-updates
Add a Metas tab that lists remote .met/.nav files, checks update status, and downloads with .bak backups on overwrite. Add an Auto Install Updates setting (default on) and guard settings usage during early startup to avoid initialization errors.
2026-03-09 11:36:47 +01:00

127 lines
5.2 KiB
Markdown

# AGENTS.md
Guidance for coding agents working in `MosswartMassacre` (DECAL plugin).
See shared cross-repo guidance first: `../AGENTS.md`.
## Scope and architecture
- This repo is a C# plugin for Asheron's Call using DECAL + VirindiViewService.
- Main projects in solution `mossy.sln`:
- `MosswartMassacre/MosswartMassacre.csproj` (primary plugin)
- `MosswartMassacre.Loader/MosswartMassacre.Loader.csproj` (loader)
- Target framework is `.NET Framework 4.8` (`net48`), x86 runtime expectations.
- The plugin emits WebSocket events consumed by `MosswartOverlord`.
## Rule sources discovered
- Cursor rules: none found (`.cursor/rules/` missing, `.cursorrules` missing).
- Copilot rules: none found (`.github/copilot-instructions.md` missing).
- Follow cross-repo protocol rules in `../AGENTS.md` for payload compatibility.
## Build commands
## Solution build
- Build Debug solution (recommended during development):
- `msbuild "mossy.sln" /p:Configuration=Debug /p:Platform="Any CPU"`
- Build Release solution:
- `msbuild "mossy.sln" /p:Configuration=Release /p:Platform="Any CPU"`
## Project build
- Build primary plugin project:
- `msbuild "MosswartMassacre/MosswartMassacre.csproj" /p:Configuration=Debug /p:Platform="AnyCPU"`
- Build loader project:
- `msbuild "MosswartMassacre.Loader/MosswartMassacre.Loader.csproj" /p:Configuration=Debug /p:Platform="AnyCPU"`
## Restore dependencies
- Legacy packages restore (when needed):
- `nuget restore "mossy.sln"`
- If package restore issues appear, verify `packages/` and `packages.config` state.
## Lint/format/test status
- No repository-wide C# linter/formatter config was found (`.editorconfig`, StyleCop, dotnet-format config not present).
- No automated unit/integration test project was found in this repo.
- Validation is primarily build + in-game runtime verification.
## Single-test guidance (practical)
- Because no automated test suite exists, "single test" means targeted manual verification.
- Preferred single-scenario checks:
- Toggle one plugin command and validate behavior (example: `/mm telemetry on`).
- Trigger one event path (example: spawn or chat) and verify backend receives it.
- For backend-coupled checks, also tail backend logs in `MosswartOverlord`.
## Runtime/integration quick checks
- Verify plugin loads in DECAL and opens the VVS tabbed UI.
- Confirm settings persist per character via YAML file.
- Confirm WebSocket registration and periodic telemetry emission.
- Confirm one inventory/full-inventory or delta message reaches backend.
- Confirm no repeated event handler subscriptions after hot reload.
## Important coupling points
- WebSocket endpoint currently defined in `MosswartMassacre/WebSocket.cs`.
- Shared secret header logic also in `MosswartMassacre/WebSocket.cs`.
- Event envelope fields and `type` values must stay backend-compatible.
- Avoid unilateral changes to JSON keys (`character_name`, coords, timestamps, etc.).
## Code style conventions observed
## Language and formatting
- Use C# 8-compatible syntax; do not rely on newer language-only features.
- Use 4-space indentation and braces on new lines (existing style).
- Keep files UTF-8 and preserve existing BOM behavior where present.
- Keep methods focused; prefer extracting helpers over deeply nested blocks.
## Imports/usings
- Group `using` statements at top of file.
- Order with `System*` namespaces first, then third-party, then project namespaces.
- Remove unused `using` directives when touching a file.
## Naming and structure
- Public types/methods/properties: `PascalCase`.
- Local variables/private fields: `camelCase`; private static fields commonly `_prefixed`.
- Constants: `UPPER_SNAKE_CASE` or `PascalCase` according to existing file style.
- Keep event handler names descriptive (`OnX`, `HandleX`, `..._LoginComplete`).
## Error handling and logging
- Guard plugin startup/shutdown with robust exception handling.
- For external boundaries (WebSocket, file I/O, DECAL hooks), catch and log failures.
- Prefer non-crashing failure behavior with clear in-chat or logger diagnostics.
- Preserve existing logging patterns (`IPluginLogger`, plugin chat output) in touched files.
## Concurrency and event safety
- Be careful with timers, event subscriptions, and hot-reload lifecycle.
- Always unsubscribe handlers during cleanup to prevent duplicate callbacks.
- Avoid blocking calls on game/UI event threads.
- Keep thread-affinity concerns explicit when interacting with UI/game APIs.
## Settings and persistence
- Settings are YAML-backed and character-specific (`PluginSettings`).
- Preserve atomic save behavior (temp file + replace/move pattern).
- Add new settings as optional with safe defaults to keep backward compatibility.
## Payload and API conventions
- Emit JSON with stable, snake_case field names expected by backend.
- Include ISO8601 timestamps and parseable coordinate values.
- Keep envelope `type` values stable unless backend changes in same task.
- Prefer additive changes (new optional fields) over renames/removals.
## Repo hygiene for agents
- Keep edits minimal and task-scoped.
- Do not mass-reformat unrelated files.
- Document behavior changes in README or relevant docs when needed.
- If introducing new build/test tooling, add command docs to this file.