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>
5.2 KiB
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,.cursorrulesmissing). - Copilot rules: none found (
.github/copilot-instructions.mdmissing). - Follow cross-repo protocol rules in
../AGENTS.mdfor 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/andpackages.configstate.
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 enableor/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
typevalues 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
usingstatements at top of file. - Order with
System*namespaces first, then third-party, then project namespaces. - Remove unused
usingdirectives 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_CASEorPascalCaseaccording 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
typevalues 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.