## User Preferences - Use `build.py c++` for lightweight C++ rebuilds, `build.py all` for full rebuilds. - Does a lot of refactoring in early development stages. Be ready for frequent renames, restructuring, and changes of mind without pushback. - VS Code is the IDE. Use `code --goto :` to open files/locations in the IDE instead of showing code snippets at the prompt. - When asked to "show me" code, open it in VS Code rather than pasting it in the terminal. - The Unreal Engine source for this project lives at `/home/jyelon/integration.UE` (sibling to the project dir), not `~/UnrealEngine`. Always use this copy when working on the integration project. - Many of Unreal's basic data types (FString, TArray, TSet, TMap, etc.) are in `integration.UE/Engine/Source/Runtime/Core/Public/Containers/`. - Editor log files are at `integration/User/jyelon/Saved/Logs/`. ## Critical: Minimize Diff Noise - The user reviews all changes via `git diff` in VS Code. Every unnecessary diff line costs review time. - **Preserve all existing comments.** Comments describe the logic, not the syntax — they survive refactors. Only remove a comment if the code it described was genuinely deleted. - **Don't rename variables, reorder code, or reformat lines** unless directly required by the task. If a variable name works, leave it. If a comment is in the right place, don't move it. - Don't make gratuitous changes. If it doesn't need to change, don't touch it. ## Coding Style Preferences - **No FREE-FLOATING (file-scope) static functions in Unreal code.** Use class methods (incl. `static` member functions) or namespace-scoped functions instead. A `static` member function inside a class is fine — e.g. a Blueprint-callable factory. The rule is only against file-local `static` free functions. (Corrected 2026-05-26 after I misread this as banning all `static`.) - Prefer in-class member initializers (`int x_ = 0;` in the header) over explicit initialization in constructor bodies. When touching constructors, migrate toward this style. - Inline empty constructors/destructors in the header when possible. - Avoid ternary operator unless very concise (e.g., `x ? 1 : 0`). For longer expressions, use early-return `if` instead. - When asked for a small change, do exactly that. If it turns out to require broader refactoring, STOP and explain the situation instead of silently rewriting the module. ## Tools - `tools/clangd-query.py` — Query clangd for C++ symbols. Uses a background daemon for fast responses after first invocation (~10s cold, milliseconds warm). Commands: - `python3 tools/clangd-query.py symbol ` — Find symbols by name across the whole project. - `python3 tools/clangd-query.py definition ` — Go to definition (1-based line/col). - `python3 tools/clangd-query.py references ` — Find all references (1-based line/col). - `python3 tools/clangd-query.py diagnostics ` — Get errors/warnings for a file. - `python3 tools/clangd-query.py stop` — Stop the daemon. - Prefer this over grep when looking for C++ class/function definitions or references. ## Asset Naming Conventions | Folder | Class | Prefix | Example | |--------|-------|--------|---------| | `/Game/StaticMeshes` | UStaticMesh | `SM_` | `SM_Rock` | | `/Game/SkeletalMeshes` | USkeletalMesh | `SKM_` | `SKM_Character` | | `/Game/AnimSequences` | UAnimSequence | `SEQ_` | `SEQ_Walk` | | `/Game/Tangibles` | UBlueprint (Actor) | `TAN_` | `TAN_Tree` | | `/Game/Widgets` | UWidgetBlueprint | `WB_` | `WB_Hotkeys` | - Blueprints in `/Game/Luprex/` use the `lx` prefix (e.g., `lxPlayerController`) and are loaded directly, not through the asset lookup system. - See `Source/Integration/AssetLookup.cpp` for the indexing logic. ## UE Wingman - UE Wingman is a command-line tool (no longer an MCP server). Plugin lives in `Plugins/UEWingman/`; CLI is `ue-wingman` (on PATH at `/home/jyelon/bin/ue-wingman`). - Invoke directly via Bash. Subcommands are CamelCase, e.g. `ue-wingman Graph_Dump True`. - Start by reading the manual: `ue-wingman Documentation_Manual`. Also useful: `Documentation_Commands` (concise list), `Documentation_Command ` (detailed help for one command). - Common commands: `Blueprint_Dump`, `Graph_Dump`, `Details_Dump`, `Details_Set`, `GraphNode_ShowMenu`, `GraphNode_ChooseMenu`, `Variables_Add`/`Modify`/`Remove`, `TypeName_Search`. - Fetcher path syntax: `/Game/,graph:,node:,pin:` (also `widget:`, `component:`, `levelblueprint:`, `structprop:`). FNames in paths use periods for spaces (e.g. `graph:Handle.Invalid.Lua.Command`, not `HandleInvalidLuaCommand`). Other marks `\"'(),.:;<=>&` use HTML entity escapes like ` `. - ue-wingman is much faster than the LLM — batch multiple commands with `;` instead of running one at a time. ## Project - [Eris addinfo intentionally removed](project_eris_addinfo_removed.md) — `luaG_runerror` no longer prefixes `file:line:`; traceback machinery handles location info ## Feedback - [UE Wingman testing mindset](feedback_wingman_testing.md) — flag tool friction during game work sessions - [Use mv for file renames](feedback_rename_with_mv.md) — mv + targeted edits, don't rewrite from memory - [LLDB formatter style — let lldb do the math](feedback_lldb_formatter_style.md) — typed SBValues, no raw pointer/byte math in Python - [LLDB formatter style — no defensive IsValid checks](feedback_lldb_formatter_no_defensive_checks.md) — let invalid SBValues fail loudly; silent returns conceal bugs - [C++ never depends on Blueprint](feedback_cpp_no_bp_dependency.md) — construct widget trees in C++; don't reference WBP assets from C++ - [Prefer check() over silent-skip](feedback_check_over_silent_skip.md) — invariants use check(); silent continue/return hides bugs - [Don't auto-build after every change](feedback_dont_auto_build.md) — only build when the user asks - [Edit workspace template, not the generated file](feedback_workspace_template.md) — `Integration.code-workspace` is generated; edit `Integration.code-workspace.tpl.json`