claude-code-arcane 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +131 -41
  3. package/agents/game/ue-blueprint-specialist.md +125 -0
  4. package/agents/game/ue-gas-specialist.md +133 -0
  5. package/agents/game/ue-umg-specialist.md +131 -0
  6. package/dist/cli.js +642 -478
  7. package/docs/SKILLS-CATALOG.md +42 -3
  8. package/docs/USER-GUIDE.md +28 -54
  9. package/hooks/detect-unreal.sh +90 -0
  10. package/package.json +2 -1
  11. package/profiles/agile.yaml +1 -1
  12. package/profiles/ai.yaml +1 -1
  13. package/profiles/android-native.yaml +1 -1
  14. package/profiles/audio.yaml +1 -1
  15. package/profiles/backend-dotnet.yaml +1 -1
  16. package/profiles/backend-go.yaml +1 -1
  17. package/profiles/backend-nestjs.yaml +1 -1
  18. package/profiles/backend-nextjs.yaml +1 -1
  19. package/profiles/backend-ts.yaml +1 -1
  20. package/profiles/business.yaml +1 -1
  21. package/profiles/clevel.yaml +1 -1
  22. package/profiles/clickup.yaml +1 -1
  23. package/profiles/core.yaml +1 -1
  24. package/profiles/database.yaml +1 -1
  25. package/profiles/design.yaml +1 -1
  26. package/profiles/docs.yaml +1 -1
  27. package/profiles/ecommerce.yaml +1 -1
  28. package/profiles/finance.yaml +1 -1
  29. package/profiles/flutter.yaml +1 -1
  30. package/profiles/freelance.yaml +1 -1
  31. package/profiles/frontend.yaml +1 -1
  32. package/profiles/infra.yaml +1 -1
  33. package/profiles/integrations.yaml +1 -1
  34. package/profiles/ios-native.yaml +1 -1
  35. package/profiles/jira.yaml +1 -1
  36. package/profiles/job-hunt.yaml +1 -1
  37. package/profiles/marketing.yaml +1 -1
  38. package/profiles/mobile.yaml +1 -1
  39. package/profiles/regulatory.yaml +1 -1
  40. package/profiles/second-brain.yaml +1 -1
  41. package/profiles/security.yaml +1 -1
  42. package/profiles/self-improving.yaml +1 -1
  43. package/profiles/statusline.yaml +1 -1
  44. package/profiles/testing.yaml +1 -1
  45. package/profiles/unity-design.yaml +1 -1
  46. package/profiles/unity-dev.yaml +1 -1
  47. package/profiles/unreal-dev.yaml +97 -0
  48. package/profiles/visual-novel.yaml +1 -1
  49. package/rules/gamedev/unreal-code.md +125 -0
  50. package/skills/arcane-list/SKILL.md +12 -7
  51. package/skills/install-mcp/SKILL.md +135 -46
  52. package/skills/install-mcp/references/unreal-operations.md +55 -0
  53. package/skills/ue-actor-component-architecture/SKILL.md +509 -0
  54. package/skills/ue-actor-component-architecture/references/actor-lifecycle.md +301 -0
  55. package/skills/ue-actor-component-architecture/references/component-types.md +592 -0
  56. package/skills/ue-ai-navigation/SKILL.md +526 -0
  57. package/skills/ue-ai-navigation/references/behavior-tree-patterns.md +392 -0
  58. package/skills/ue-ai-navigation/references/behavior-tree-workflow.md +107 -0
  59. package/skills/ue-ai-navigation/references/custom-bttask.md +104 -0
  60. package/skills/ue-ai-navigation/references/eqs-reference.md +423 -0
  61. package/skills/ue-animation-system/SKILL.md +521 -0
  62. package/skills/ue-animation-system/references/anim-notify-reference.md +486 -0
  63. package/skills/ue-animation-system/references/locomotion-setup.md +550 -0
  64. package/skills/ue-async-threading/SKILL.md +433 -0
  65. package/skills/ue-async-threading/references/thread-safety-guide.md +213 -0
  66. package/skills/ue-async-threading/references/threading-patterns.md +345 -0
  67. package/skills/ue-audio-system/SKILL.md +527 -0
  68. package/skills/ue-audio-system/references/audio-setup-patterns.md +700 -0
  69. package/skills/ue-blueprints/SKILL.md +134 -0
  70. package/skills/ue-blueprints/references/communication.md +82 -0
  71. package/skills/ue-character-movement/SKILL.md +475 -0
  72. package/skills/ue-character-movement/references/cmc-extension-patterns.md +335 -0
  73. package/skills/ue-character-movement/references/movement-pipeline.md +189 -0
  74. package/skills/ue-cpp-foundations/SKILL.md +533 -0
  75. package/skills/ue-cpp-foundations/references/components-and-gc.md +107 -0
  76. package/skills/ue-cpp-foundations/references/container-patterns.md +544 -0
  77. package/skills/ue-cpp-foundations/references/delegate-patterns.md +497 -0
  78. package/skills/ue-cpp-foundations/references/gameplay-classes-cpp.md +136 -0
  79. package/skills/ue-cpp-foundations/references/property-specifiers.md +306 -0
  80. package/skills/ue-data-assets-tables/SKILL.md +527 -0
  81. package/skills/ue-data-assets-tables/references/asset-loading-patterns.md +306 -0
  82. package/skills/ue-data-assets-tables/references/data-driven-design.md +378 -0
  83. package/skills/ue-editor-tools/SKILL.md +523 -0
  84. package/skills/ue-editor-tools/references/detail-customization-patterns.md +395 -0
  85. package/skills/ue-editor-tools/references/editor-module-setup.md +480 -0
  86. package/skills/ue-game-features/SKILL.md +477 -0
  87. package/skills/ue-game-features/references/experience-system.md +222 -0
  88. package/skills/ue-game-features/references/game-feature-patterns.md +308 -0
  89. package/skills/ue-gameplay-abilities/SKILL.md +518 -0
  90. package/skills/ue-gameplay-abilities/references/ability-task-reference.md +391 -0
  91. package/skills/ue-gameplay-abilities/references/gameplay-effect-reference.md +397 -0
  92. package/skills/ue-gameplay-abilities/references/gas-setup-patterns.md +369 -0
  93. package/skills/ue-gameplay-framework/SKILL.md +466 -0
  94. package/skills/ue-gameplay-framework/references/framework-class-map.md +243 -0
  95. package/skills/ue-input-system/SKILL.md +394 -0
  96. package/skills/ue-input-system/references/cpp-setup.md +131 -0
  97. package/skills/ue-input-system/references/enhanced-input-workflow.md +117 -0
  98. package/skills/ue-input-system/references/input-action-reference.md +731 -0
  99. package/skills/ue-mass-entity/SKILL.md +476 -0
  100. package/skills/ue-mass-entity/references/mass-entity-patterns.md +319 -0
  101. package/skills/ue-mass-entity/references/mass-fragment-reference.md +119 -0
  102. package/skills/ue-materials-rendering/SKILL.md +526 -0
  103. package/skills/ue-materials-rendering/references/material-parameter-reference.md +216 -0
  104. package/skills/ue-materials-rendering/references/post-process-settings.md +383 -0
  105. package/skills/ue-module-build-system/SKILL.md +487 -0
  106. package/skills/ue-module-build-system/references/build-cs-reference.md +418 -0
  107. package/skills/ue-module-build-system/references/common-build-errors.md +381 -0
  108. package/skills/ue-naming-conventions/SKILL.md +142 -0
  109. package/skills/ue-naming-conventions/references/asset-name-modifiers.md +233 -0
  110. package/skills/ue-naming-conventions/references/content-structure.md +83 -0
  111. package/skills/ue-networking-replication/SKILL.md +452 -0
  112. package/skills/ue-networking-replication/references/replication-patterns.md +526 -0
  113. package/skills/ue-networking-replication/references/rpc-decision-guide.md +393 -0
  114. package/skills/ue-niagara-effects/SKILL.md +531 -0
  115. package/skills/ue-niagara-effects/references/niagara-data-interfaces.md +491 -0
  116. package/skills/ue-niagara-effects/references/niagara-parameter-types.md +153 -0
  117. package/skills/ue-niagara-effects/references/niagara-workflow.md +115 -0
  118. package/skills/ue-packaging/SKILL.md +116 -0
  119. package/skills/ue-physics-collision/SKILL.md +423 -0
  120. package/skills/ue-physics-collision/references/collision-channel-setup.md +218 -0
  121. package/skills/ue-physics-collision/references/trace-patterns.md +499 -0
  122. package/skills/ue-procedural-generation/SKILL.md +505 -0
  123. package/skills/ue-procedural-generation/references/pcg-node-reference.md +381 -0
  124. package/skills/ue-procedural-generation/references/procedural-mesh-patterns.md +940 -0
  125. package/skills/ue-project-context/SKILL.md +305 -0
  126. package/skills/ue-sequencer-cinematics/SKILL.md +506 -0
  127. package/skills/ue-sequencer-cinematics/references/sequencer-patterns.md +629 -0
  128. package/skills/ue-serialization-savegames/SKILL.md +524 -0
  129. package/skills/ue-serialization-savegames/references/save-system-architecture.md +705 -0
  130. package/skills/ue-state-trees/SKILL.md +489 -0
  131. package/skills/ue-state-trees/references/state-tree-mass-integration.md +184 -0
  132. package/skills/ue-state-trees/references/state-tree-patterns.md +321 -0
  133. package/skills/ue-testing-debugging/SKILL.md +520 -0
  134. package/skills/ue-testing-debugging/references/automation-test-patterns.md +387 -0
  135. package/skills/ue-testing-debugging/references/profiling-commands.md +357 -0
  136. package/skills/ue-ui-umg-slate/SKILL.md +431 -0
  137. package/skills/ue-ui-umg-slate/references/common-ui-setup.md +484 -0
  138. package/skills/ue-ui-umg-slate/references/widget-types.md +487 -0
  139. package/skills/ue-world-level-streaming/SKILL.md +518 -0
  140. package/skills/ue-world-level-streaming/references/streaming-patterns.md +414 -0
  141. package/templates/gamedev/unreal-project-context.md +107 -0
@@ -0,0 +1,381 @@
1
+ # Common UE Build Errors: Causes and Solutions
2
+
3
+ This reference maps common Unreal Build Tool (UBT) and compiler/linker error messages to their root causes and concrete fixes.
4
+
5
+ ---
6
+
7
+ ## Linker Errors (LNK)
8
+
9
+ ### LNK2019 — Unresolved External Symbol
10
+
11
+ **Full message pattern**:
12
+ ```
13
+ error LNK2019: unresolved external symbol "public: void __cdecl FSomeClass::SomeMethod(void)"
14
+ referenced in function "..."
15
+ ```
16
+
17
+ **Cause A: Missing module dependency**
18
+
19
+ The module containing `FSomeClass` is not listed as a dependency.
20
+
21
+ Fix: Add the module to `Build.cs`:
22
+ ```csharp
23
+ PrivateDependencyModuleNames.Add("TheModuleThatDefinesFSomeClass");
24
+ ```
25
+
26
+ **Cause B: Missing `MODULENAME_API` export macro**
27
+
28
+ `FSomeClass` exists in another module but was never marked for DLL export.
29
+
30
+ Fix: Add the macro to the class or function declaration:
31
+ ```cpp
32
+ // Before:
33
+ class FSomeClass { void SomeMethod(); };
34
+
35
+ // After:
36
+ class MYMODULE_API FSomeClass { void SomeMethod(); };
37
+ ```
38
+
39
+ **Cause C: Function defined in a .cpp but declared in a header without the macro**
40
+
41
+ ```cpp
42
+ // Header — export the declaration
43
+ MYMODULE_API void SomeFreeFunction();
44
+
45
+ // .cpp — no macro needed here, definition is in the same module
46
+ void SomeFreeFunction() { ... }
47
+ ```
48
+
49
+ **Cause D: Dependency listed in PrivateDependencyModuleNames but type appears in a public header**
50
+
51
+ A type from a private dependency cannot be used in your public headers. Either:
52
+ - Move the type usage to your Private/ .cpp files, OR
53
+ - Promote the dependency to `PublicDependencyModuleNames`
54
+
55
+ ### LNK2001 — Unresolved External Symbol (variant)
56
+
57
+ ```
58
+ error LNK2001: unresolved external symbol __declspec(dllimport) ...
59
+ ```
60
+
61
+ This is the same problem as LNK2019. Follow the same fixes.
62
+
63
+ ### LNK4099 — PDB Not Found
64
+
65
+ ```
66
+ warning LNK4099: PDB 'SomeLib.pdb' was not found
67
+ ```
68
+
69
+ Usually harmless for third-party libraries. Suppress with a linker flag in Build.cs:
70
+ ```csharp
71
+ // Suppress PDB warnings for external libraries
72
+ PublicAdditionalLibraries can omit .pdb — or suppress via:
73
+ // bDisableSymbolLocalization = true (or ignore in project linker settings)
74
+ ```
75
+
76
+ ### LNK1104 — Cannot Open File
77
+
78
+ ```
79
+ fatal error LNK1104: cannot open file 'SomeLib.lib'
80
+ ```
81
+
82
+ **Cause**: A library path in `PublicAdditionalLibraries` points to a file that doesn't exist.
83
+
84
+ **Fix**: Verify the path. Use `Path.Combine` to build platform-correct paths:
85
+ ```csharp
86
+ string LibPath = Path.Combine(ModuleDirectory, "lib", "Win64", "SomeLib.lib");
87
+ if (File.Exists(LibPath))
88
+ {
89
+ PublicAdditionalLibraries.Add(LibPath);
90
+ }
91
+ ```
92
+
93
+ ---
94
+
95
+ ## Compiler Errors (C-series, clang)
96
+
97
+ ### C1083 — Cannot Open Include File
98
+
99
+ ```
100
+ fatal error C1083: Cannot open include file: 'SomeHeader.h': No such file or directory
101
+ ```
102
+
103
+ **Cause A: Missing module dependency**
104
+
105
+ The module that owns `SomeHeader.h` is not a dependency.
106
+
107
+ Fix:
108
+ ```csharp
109
+ PublicDependencyModuleNames.Add("TheModuleThatOwnsSomeHeader");
110
+ // or
111
+ PrivateDependencyModuleNames.Add("TheModuleThatOwnsSomeHeader");
112
+ ```
113
+
114
+ **Cause B: Wrong include path in IWYU mode**
115
+
116
+ UE5 with `PCHUsage = UseExplicitOrSharedPCHs` requires full paths relative to a module's `Public/` root.
117
+
118
+ ```cpp
119
+ // Wrong — works only if PCH pulls it in transitively
120
+ #include "Actor.h"
121
+
122
+ // Correct — explicit path from module root
123
+ #include "GameFramework/Actor.h"
124
+ ```
125
+
126
+ **Cause C: Third-party header not on include path**
127
+
128
+ ```csharp
129
+ // In Build.cs:
130
+ PublicSystemIncludePaths.Add(Path.Combine(ThirdPartyDir, "include"));
131
+ ```
132
+
133
+ **Cause D: Missing header generated by UHT**
134
+
135
+ If the included file is a `.generated.h`, you may need to regenerate project files. Run "Generate Project Files" from the .uproject or from the Unreal Editor.
136
+
137
+ ### C2039 — Member Not Found
138
+
139
+ ```
140
+ error C2039: 'SomeMember': is not a member of 'FSomeClass'
141
+ ```
142
+
143
+ Often caused by:
144
+ - Stale generated header (`.generated.h`) — regenerate project files
145
+ - Forward declaration without full include — add `#include "SomeClass.h"` in the .cpp
146
+ - IWYU violation — the type was previously pulled in by a PCH header that's no longer included
147
+
148
+ ### C2027 / C2371 — Incomplete Type / Type Redefinition
149
+
150
+ ```
151
+ error C2027: use of undefined type 'FSomeClass'
152
+ error C2371: 'FSomeClass': redefinition; different basic types
153
+ ```
154
+
155
+ **Cause**: Forward declaration used where full definition is needed, OR the same header included via two different paths (`SomeClass.h` vs `SubDir/SomeClass.h`).
156
+
157
+ **Fix for incomplete type**: Replace forward declaration with full include in the .cpp:
158
+ ```cpp
159
+ // Header — keep forward declaration for pointer/reference params
160
+ class FSomeClass;
161
+ class MYMODULE_API FMyClass
162
+ {
163
+ void DoThing(FSomeClass* Param);
164
+ };
165
+
166
+ // CPP — include the full definition
167
+ #include "SomeClass.h"
168
+ void FMyClass::DoThing(FSomeClass* Param) { ... }
169
+ ```
170
+
171
+ **Fix for redefinition**: Use consistent paths. Prefer includes from a module root:
172
+ ```cpp
173
+ // Inconsistent — may cause ODR violations
174
+ #include "SomeClass.h" // resolved via PublicIncludePaths
175
+ #include "SubDir/SomeClass.h" // different resolved path, same file
176
+
177
+ // Consistent — always use full path from module root
178
+ #include "SubDir/SomeClass.h"
179
+ ```
180
+
181
+ ---
182
+
183
+ ## UHT Errors (Unreal Header Tool)
184
+
185
+ ### Missing #include for generated header
186
+
187
+ ```
188
+ error: include 'MyClass.generated.h' must be the last include in the header
189
+ ```
190
+
191
+ **Fix**: Move the `.generated.h` include to the very last line of your header's includes:
192
+ ```cpp
193
+ #pragma once
194
+
195
+ #include "CoreMinimal.h"
196
+ #include "GameFramework/Actor.h"
197
+ #include "MyClass.generated.h" // MUST be last
198
+ ```
199
+
200
+ ### UCLASS / USTRUCT not found by UHT
201
+
202
+ ```
203
+ error: Expected type name after 'class' keyword
204
+ ```
205
+
206
+ Common causes:
207
+ - The file is in the wrong directory (UHT only scans `Public/` and `Private/`)
208
+ - The file is not listed in the project (ensure .uproject or .uplugin has the module)
209
+ - `GENERATED_BODY()` or `GENERATED_USTRUCT_BODY()` is missing inside the class/struct
210
+
211
+ ### Missing MODULE_API on exported UCLASS
212
+
213
+ UHT-generated reflection requires that classes with `UCLASS()` macro are exported if they're in a module:
214
+
215
+ ```cpp
216
+ UCLASS()
217
+ class MYMODULE_API UMyObject : public UObject
218
+ {
219
+ GENERATED_BODY()
220
+ // ...
221
+ };
222
+ ```
223
+
224
+ Omitting `MYMODULE_API` here will compile but causes reflection failures when the class is referenced across module boundaries.
225
+
226
+ ---
227
+
228
+ ## IWYU Violations
229
+
230
+ ### Symptom: Builds in unity mode, fails with standalone compile
231
+
232
+ With `bUseUnityBuild = true` (default), UBT combines multiple .cpp files. A violation is only caught when:
233
+ - `bUseUnityBuild = false` (set in Target.cs for iteration)
234
+ - `bEnforceIWYU = true` (set in Build.cs)
235
+ - Building with `-singlefile` flag
236
+
237
+ **Fix pattern**: For each compilation unit, include exactly what it uses:
238
+
239
+ ```cpp
240
+ // MyActor.cpp
241
+ #include "MyActor.h" // own header first — always
242
+ #include "Engine/World.h" // uses GetWorld()
243
+ #include "GameFramework/PlayerController.h" // uses APlayerController
244
+ // Do NOT include "CoreMinimal.h" and rely on it to pull in FString — include what you need
245
+ ```
246
+
247
+ ### Relying on Transitive Includes
248
+
249
+ ```cpp
250
+ // ActorA.h includes Engine.h which includes World.h
251
+ // Your file:
252
+ #include "ActorA.h"
253
+ // ... uses UWorld without including Engine/World.h
254
+
255
+ // This breaks when ActorA.h changes its includes
256
+ ```
257
+
258
+ **Fix**: Include every header you directly use.
259
+
260
+ ---
261
+
262
+ ## Module Not Found at Runtime
263
+
264
+ ### Symptom
265
+
266
+ ```
267
+ LogModuleManager: Warning: ModuleNotFound: Could not find module 'MyModule'
268
+ ```
269
+
270
+ or a crash at startup with module load failure.
271
+
272
+ **Checklist**:
273
+ 1. Module is listed in `.uproject` or `.uplugin` `Modules` array
274
+ 2. `LoadingPhase` is appropriate — if you load the module via C++ at a specific time, the module must have loaded by then
275
+ 3. The module binary exists — rebuild the project
276
+ 4. If it's a plugin module, the plugin is enabled in `.uproject`'s `Plugins` array
277
+
278
+ ---
279
+
280
+ ## Circular Dependency
281
+
282
+ ### Symptom
283
+
284
+ ```
285
+ Error: Circular dependency detected: ModuleA -> ModuleB -> ModuleA
286
+ ```
287
+
288
+ UBT cannot build a static dependency graph that includes cycles.
289
+
290
+ **Resolution strategies**:
291
+
292
+ **Strategy 1: Extract a shared interface module**
293
+
294
+ Before:
295
+ - `ModuleA` depends on `ModuleB` (for `IServiceB`)
296
+ - `ModuleB` depends on `ModuleA` (for `IServiceA`)
297
+
298
+ After:
299
+ - `ModuleInterfaces` defines both `IServiceA` and `IServiceB`
300
+ - `ModuleA` depends on `ModuleInterfaces`
301
+ - `ModuleB` depends on `ModuleInterfaces`
302
+
303
+ **Strategy 2: Use DynamicallyLoadedModuleNames**
304
+
305
+ ```csharp
306
+ // ModuleB.Build.cs — no compile-time dependency on ModuleA
307
+ DynamicallyLoadedModuleNames.Add("ModuleA");
308
+ ```
309
+
310
+ Then at runtime:
311
+ ```cpp
312
+ IModuleA* ModuleA = FModuleManager::GetModulePtr<IModuleA>("ModuleA");
313
+ if (ModuleA) { ModuleA->DoThing(); }
314
+ ```
315
+
316
+ **Strategy 3: Forward declare and use pointers/references**
317
+
318
+ Move full includes from headers to .cpp files and use forward declarations in the header.
319
+
320
+ ---
321
+
322
+ ## Hot Reload Failures
323
+
324
+ ### Symptom: Changes not reflected after recompile
325
+
326
+ Hot Reload (Live Coding in UE5) has limitations:
327
+ - New UPROPERTY fields on existing UClasses are not applied to existing instances
328
+ - New UFUNCTIONs added to existing classes may not bind correctly
329
+ - Changes to class hierarchy require a full restart
330
+
331
+ **Fix**: For structural changes to UObject classes, always do a full restart rather than hot reload.
332
+
333
+ ### Symptom: Crash on hot reload
334
+
335
+ ```
336
+ Assertion failed: Class->ClassDefaultObject ...
337
+ ```
338
+
339
+ Caused by:
340
+ - Adding/removing fields from USTRUCTs without restarting
341
+ - Changing the memory layout of UObjects that already have instances
342
+
343
+ **Fix**: Full rebuild and editor restart.
344
+
345
+ ---
346
+
347
+ ## Packaging / Cooking Errors
348
+
349
+ ### Missing module in cooked build
350
+
351
+ ```
352
+ LogPackageName: Error: DoesPackageExist: DoesPackageExistFast FAILED: 'MyModule'
353
+ ```
354
+
355
+ **Cause**: A module with `Type: "Editor"` or `Type: "Developer"` was referenced from runtime code.
356
+
357
+ **Fix**:
358
+ - In C++: guard editor-only code with `#if WITH_EDITOR`
359
+ - In Build.cs: use `if (Target.bBuildEditor)` for editor-only dependencies
360
+ - In .uproject: ensure the module type matches actual usage
361
+
362
+ ### Blueprint assets referencing stripped modules
363
+
364
+ If Blueprint graphs reference C++ functions from editor-only modules, cooking strips the module and breaks the Blueprint.
365
+
366
+ **Fix**: Move the referenced functions to a Runtime module, or use `CallInEditor = true` UFUNCTION specifier for functions that should only call from editor — ensuring they're never called from game code paths.
367
+
368
+ ---
369
+
370
+ ## Build Configuration Quick Reference
371
+
372
+ | Error type | First thing to check |
373
+ |---|---|
374
+ | LNK2019 unresolved symbol | Missing dependency or missing `MODULENAME_API` |
375
+ | C1083 cannot open include | Missing dependency or wrong include path |
376
+ | IWYU violation | Missing direct include, relying on transitive pull |
377
+ | UHT parse error | Missing `.generated.h` last, missing `GENERATED_BODY()` |
378
+ | Module not found at runtime | Not listed in .uproject/.uplugin, or wrong LoadingPhase |
379
+ | Circular dependency | Extract interface module or use dynamic loading |
380
+ | Cooking failure | Editor-only code/module referenced from runtime path |
381
+ | Hot reload crash | Structural UObject change — full restart required |
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: ue-naming-conventions
3
+ description: "Asset naming y estructura de Content — Prefix_BaseAssetName_Variant_Suffix, prefijos por tipo de asset, layout de carpetas, identifiers seguros"
4
+ category: "gamedev"
5
+ argument-hint: "[asset, folder o review]"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit
8
+ ---
9
+
10
+ # UE Naming Conventions & Content Structure
11
+
12
+ Names and folder layout are the cheapest consistency win in an Unreal project and the most expensive thing to fix later — renaming assets breaks references, and redirectors accumulate. Settle the convention once, record it in the project context, then hold the line.
13
+
14
+ Ask before writing: this skill renames assets and moves folders, which rewrites references across the project. Never rename in bulk without approval, a clean source-control state, and a Fix Up Redirectors pass afterwards.
15
+
16
+ ## Context Check
17
+
18
+ Read `docs/unreal/project-context.md` before proposing anything. Confirm:
19
+
20
+ - **Whether the project already has a naming convention.** If it does, that convention wins — even where it disagrees with this skill. Consistency beats correctness here.
21
+ - The top-level content folder name and whether `Developers/` is in use
22
+ - Source control system, because a rename is a source-control operation before it is an editor one
23
+
24
+ ## The Prime Directive
25
+
26
+ > An existing convention beats a better one. All structure, assets and code in the project should look like a single person created it, no matter how many people contributed.
27
+
28
+ If the project has no convention yet, propose the one below, get it agreed, and write it into `docs/unreal/project-context.md` so every other `ue-*` skill follows it.
29
+
30
+ ## Base Asset Name
31
+
32
+ Every asset follows `Prefix_BaseAssetName_Variant_Suffix`:
33
+
34
+ - **`Prefix`/`Suffix`** — determined by asset type. See the reference table.
35
+ - **`BaseAssetName`** — a short, recognizable name for the logical group. Every asset belonging to the character Bob uses `Bob`.
36
+ - **`Variant`** — either a recognizable name (`Bob_Evil`, `Bob_Retro`) or a two-digit number starting at `01` for generic variations (`Rock_01`, `Rock_02`). Three digits means you should have split the base name instead. Variants can chain: `Flooring_Marble_01`.
37
+
38
+ ```
39
+ SK_Bob Skeletal mesh
40
+ M_Bob Material
41
+ T_Bob_D Diffuse texture
42
+ T_Bob_N Normal texture
43
+ T_Bob_Evil_D Diffuse for the Evil variant
44
+ MI_Rock_Snow Material instance variant
45
+ ```
46
+
47
+ ## Identifier Charset
48
+
49
+ In **any** identifier — asset, folder, C++ symbol, path — restrict to `[A-Za-z0-9_]` and use `_` sparingly. Never use:
50
+
51
+ - Whitespace of any kind
52
+ - Backslashes, or symbols like `#!@$%`
53
+ - Any Unicode character
54
+
55
+ A character named `Zoë` gets a folder named `Zoe`. This is not pedantry: spaces and Unicode break batch tools, cooking, and source control in ways that surface as unexplained failures far from the cause. The same applies to the project's own path on disk — prefer `D:\Project` over a `My Documents` subfolder.
56
+
57
+ ## Content Directory Structure
58
+
59
+ - **One top-level folder named after the project.** All project content lives in `Content/MyProject/`, never loose in `Content/`. This is what makes the project safely mergeable with marketplace and plugin content.
60
+ - **`PascalCase` folder names, no spaces, no Unicode.**
61
+ - **`Maps/`** — every level lives under `Content/MyProject/Maps`, subfolders welcome. Keeps cooking, lighting and QA scripts sane, and means "open this map" needs no directions.
62
+ - **`Core/`** — the fundamental classes: base GameMode, GameState, PlayerController, PlayerState, Character. A visible "don't touch" boundary. Designers tweak child classes elsewhere.
63
+ - **`MaterialLibrary/`** — master materials, layered materials, material functions and shared utility textures. Makes a "material instances only" policy enforceable: any plain material outside this folder is a violation you can grep for. Put debug materials in `MaterialLibrary/Debug` so they are trivial to strip and obvious if referenced.
64
+ - **`Developers/`** — per-person sandbox, hidden in the Content Browser by default. Work here cannot be accidentally depended on. Promote an asset by moving it into the project folder and fixing up redirectors.
65
+ - **No folders named `Assets` or `AssetTypes`** — everything is an asset, and grouping by type instead of purpose fights the Content Browser's own filters.
66
+ - **No empty folders.** They clutter the browser and usually mean a redirector was never fixed up.
67
+
68
+ > → Read references/content-structure.md for the example project layout, the very-large-asset-set exception, and the safe procedure for deleting a stubborn empty folder
69
+
70
+ ## Asset Prefixes
71
+
72
+ > → Read references/asset-name-modifiers.md for the full prefix/suffix tables by asset type, including the UE5 types the original guide predates and the texture packing suffixes
73
+
74
+ The ones worth memorizing:
75
+
76
+ | Type | Prefix | Type | Prefix |
77
+ |------|--------|------|--------|
78
+ | Blueprint | `BP_` | Widget Blueprint | `WBP_` |
79
+ | Blueprint Interface | `BPI_` | Animation Blueprint | `ABP_` |
80
+ | Material | `M_` | Material Instance | `MI_` |
81
+ | Static Mesh | `SM_` | Skeletal Mesh | `SK_` |
82
+ | Texture | `T_` | Niagara System | `NS_` |
83
+ | Data Asset | `DA_` | Data Table | `DT_` |
84
+ | Input Action | `IA_` | Input Mapping Context | `IMC_` |
85
+ | Behavior Tree | `BT_` | Blackboard | `BB_` |
86
+
87
+ ## Two Conflicts To Resolve Explicitly
88
+
89
+ **Static Mesh: `SM_` or `S_`?** The Gamemakin guide specifies `S_` and notes that many teams use `SM_`. Epic's own tooling — including the asset prefixes its MCP server keys off — assumes `SM_`. This skill defaults to **`SM_`** for that reason. If the project already uses `S_`, keep `S_` and record it in the project context.
90
+
91
+ **Structs and enums.** The guide uses `F`/`S` for structs and `E` for enums with no underscore, matching C++. For Blueprint-authored types many teams prefer `F_`/`E_` to keep them visually distinct from C++ types. Either is fine; pick one and record it.
92
+
93
+ ## Common Mistakes
94
+
95
+ - **Renaming assets without a redirector pass**, leaving dangling references that only surface at cook time
96
+ - **Bulk renames without source control clean**, making the change impossible to revert cleanly
97
+ - **Content loose in `Content/`** rather than under a project folder, which collides with plugin and marketplace content
98
+ - **Grouping by asset type** (`Content/Meshes`, `Content/Textures`) instead of by feature — the Content Browser already filters by type
99
+ - **Spaces or Unicode** in a name, a folder, or the project path
100
+ - **Plain materials outside `MaterialLibrary/`**, quietly defeating a material-instance policy
101
+ - **Levels scattered outside `Maps/`**, making cook and lighting scripts fragile
102
+ - **Treating a UE4-era prefix list as current** — Cascade `PS_` is Niagara `NS_`/`NE_` now, Matinee is Sequencer, Destructible Mesh is Chaos
103
+
104
+ ---
105
+
106
+ ## Related Skills
107
+
108
+ - `/ue-project-context` — the document that records which convention this project actually uses
109
+ - `/ue-data-assets-tables` — `DA_`/`DT_` assets and the Asset Manager paths that depend on stable names
110
+ - `/ue-materials-rendering` — the `MaterialLibrary/` policy and `M_`/`MI_` split
111
+ - `/ue-blueprints` — Blueprint variable and function naming inside the graph
112
+ - `/ue-world-level-streaming` — `Maps/` layout, persistent level `_P` suffix, data layers
113
+ - `/asset-audit` — cross-engine audit for naming, size, format and orphaned assets
114
+
115
+ ## Reference Files
116
+
117
+ - `references/asset-name-modifiers.md` — full prefix/suffix tables by asset type, plus UE5 additions and texture packing
118
+ - `references/content-structure.md` — example project layout, folder rules in depth, empty-folder removal procedure
119
+
120
+ ---
121
+
122
+ ## Checklist
123
+
124
+ Validate before considering the work done:
125
+
126
+ - [ ] The project's existing convention was checked first and takes precedence
127
+ - [ ] Every new asset follows `Prefix_BaseAssetName_Variant_Suffix` with the right prefix for its type
128
+ - [ ] No identifier, folder or path contains spaces, Unicode or symbols outside `[A-Za-z0-9_]`
129
+ - [ ] Project content sits under a single top-level project folder, with levels under `Maps/`
130
+ - [ ] Any rename ran with clean source control and a Fix Up Redirectors pass afterwards
131
+ - [ ] The agreed convention is written into `docs/unreal/project-context.md`
132
+ - [ ] Conventions in `docs/unreal/project-context.md` were read and followed
133
+ - [ ] The Common Mistakes section of this skill was reviewed against the change
134
+
135
+ **PASS** — every item holds. **CONCERNS** — the work stands but at least one item is unresolved and worth flagging to the user. **FAIL** — an item is violated in a way that breaks asset references or leaves the project inconsistent; fix it before handing the work over.
136
+
137
+ ## Next Steps
138
+
139
+ - `/ue-project-context` — record the convention so the rest of the `ue-*` skills follow it
140
+ - `/asset-audit` — sweep the existing project for violations
141
+ - `/code-review` — architectural and quality review of the change
142
+ - `/commit` — conventional commit once the change is verified