MosswartMassacre/AGENTS.md
Erik f72a555aef docs(agents): fix nonexistent '/mm telemetry on' example
No 'telemetry' command is registered in PluginCore.RegisterCommands;
use '/mm ws enable' or '/mm report' for single-command verification.
(A local-only CLAUDE.md was also added; it stays untracked per the
existing '# Claude Code' .gitignore section.)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 16:36:41 +02: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 ws enable or /mm report).
  • 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.