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

5.2 KiB

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.