Skip to content

Commit 9efabe9

Browse files
committed
Add marketplace packaging assets and script
1 parent 527825a commit 9efabe9

9 files changed

Lines changed: 177 additions & 0 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ Saved
1414
*.xcodeproj
1515
*.xcworkspace
1616
**/.DS_Store
17+
PackedForMarketplace/
18+
*_Marketplace.zip

.tasks.jsonl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"id":"FoGYRJM_","description":"Commit RuntimeAssetImportPlugin marketplace packaging assets and script after verifying the package step","stage":"committed","createdAt":"2026-04-11T23:57:46.222Z","updatedAt":"2026-04-11T23:58:52.554Z","committedEventId":"fY1giYB9v6YCjCoZ"}

AGENTS.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<!-- markdownlint-disable MD025 -->
2+
# Tool Rules (compose-agentsmd)
3+
4+
- **Session gate**: before responding to ANY user message, run `compose-agentsmd` from the project root. AGENTS.md contains the rules you operate under; stale rules cause rule violations. If you discover you skipped this step mid-session, stop, run it immediately, re-read the diff, and adjust your behavior before continuing.
5+
- `compose-agentsmd` intentionally regenerates `AGENTS.md`; any resulting `AGENTS.md` diff is expected and must not be treated as an unexpected external change.
6+
- If `compose-agentsmd` is not available, install it via npm: `npm install -g compose-agentsmd`.
7+
- To update shared/global rules, use `compose-agentsmd edit-rules` to locate the writable rules workspace, make changes only in that workspace, then run `compose-agentsmd apply-rules` (do not manually clone or edit the rules source repo outside this workflow).
8+
- If you find an existing clone of the rules source repo elsewhere, do not assume it is the correct rules workspace; always treat `compose-agentsmd edit-rules` output as the source of truth.
9+
- `compose-agentsmd apply-rules` pushes the rules workspace when `source` is GitHub (if the workspace is clean), then regenerates `AGENTS.md` with refreshed rules.
10+
- Do not edit `AGENTS.md` directly; update the source rules and regenerate.
11+
- `tools/tool-rules.md` is the shared rule source for all repositories that use compose-agentsmd.
12+
- Before applying any rule updates, present the planned changes first with an ANSI-colored diff-style preview, ask for explicit approval, then make the edits.
13+
- These tool rules live in tools/tool-rules.md in the compose-agentsmd repository; do not duplicate them in other rule modules.
14+
15+
Source: github:metyatech/agent-rules@HEAD/rules/domains/unreal/unreal-engine-core-guidelines.md
16+
17+
# Unreal Engine project rules
18+
19+
## Baseline
20+
21+
- Implement in C++ when possible; avoid Blueprint Event Graphs.
22+
- Use Slate for widgets.
23+
- Follow the UE coding standard and the C++ Core Guidelines:
24+
- [Epic C++ Coding Standard for Unreal Engine](https://dev.epicgames.com/documentation/en-us/unreal-engine/epic-cplusplus-coding-standard-for-unreal-engine)
25+
- [C++ Core Guidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)
26+
27+
## Architecture and design
28+
29+
- Apply SOLID proportionally to context; enforce strictly for public
30+
APIs/plugins.
31+
- Keep layers clean: business logic does not depend on infra; depend on
32+
abstractions.
33+
- Separate plugins/modules by feature; do not mix unrelated features.
34+
- Separate interface modules from implementation modules.
35+
- Keep tests in a separate module.
36+
- Strictly separate Runtime vs Editor; Editor dependencies only in Editor
37+
modules.
38+
- Prefer components over deep inheritance; avoid dynamic-cast heavy designs; use
39+
UInterface.
40+
- Avoid global state and service-locator patterns; inject dependencies via
41+
interfaces/factories.
42+
- Use Gameplay Tags for extensible categories; consider GAS for generic
43+
buffs/debuffs.
44+
- Use UDeveloperSettings for config; define cvars in module namespaces; avoid
45+
hardcoded values.
46+
- Save with USaveGame and versioning when needed.
47+
48+
## C++/UE coding practices
49+
50+
- Do not use C++ exceptions.
51+
- Prefer forward declarations and IWYU; include \*.generated.h last.
52+
- Use explicit return types; avoid template/macro overuse.
53+
- Use FName for identifiers, FText for UI, FString for transient text.
54+
- Compare floats with tolerances (e.g., KINDA_SMALL_NUMBER).
55+
- UObject references use UPROPERTY with TObjectPtr; non-UObject use
56+
TUniquePtr/TSharedPtr; non-null shared refs use TSharedRef.
57+
- Avoid raw pointers; use TWeakObjectPtr/TWeakPtr for non-owning references.
58+
- Create UObjects with NewObject/CreateDefaultSubobject, not direct
59+
constructors.
60+
- Avoid GWorld/GEngine direct access; use GetWorld/WorldContext.
61+
62+
## Error handling and logging
63+
64+
- Use checkf only for fatal invariants; use ensureMsgf for recoverable
65+
anomalies.
66+
- Log errors/warnings and return early; do not use LogTemp.
67+
- Define module-specific log categories; keep logging appropriate for Shipping.
68+
- Failure logs must include actionable context (e.g., url/path/status).
69+
Debug-only noise goes to `VeryVerbose`.
70+
71+
## Networking and security
72+
73+
- Server authoritative: validate client inputs; do not trust client state.
74+
- Use appropriate RPC reliability; implement replication correctly; optimize
75+
with FastArray/COND\_\*/dormancy.
76+
- Never ship secrets to clients; store keys in secure storage; gate dev-only
77+
features in editor/shipping guards.
78+
79+
## Performance and async
80+
81+
- Minimize Tick; prefer timers/delegates; avoid blocking I/O on the game thread.
82+
- Pre-allocate hot paths; profile with TRACE_CPUPROFILER.
83+
- Use AssetManager and soft references for assets; avoid hardcoded paths.
84+
- Use Enhanced Input and centralized mapping contexts.
85+
- Use UE5Coro for async; keep UObject access on the game thread and marshal
86+
results back.
87+
- Avoid synchronous subprocess execution (e.g., `FPlatformProcess::ExecProcess`)
88+
in gameplay/async paths; prefer UE-native APIs (e.g., `FHttpModule`) and keep
89+
the game thread responsive.
90+
- When dynamically creating components/layers and binding delegates, ensure
91+
teardown runs on all failure paths and on EndPlay/cancel.
92+
93+
## Build and tests
94+
95+
- UnrealBuildRunTestScript and UE5Coro are required when relevant; install
96+
before use.
97+
- Build with UnrealBuildRunTestScript\\Fire-Build.ps1.bat --no-pause (add
98+
configuration/platform as needed).
99+
- Add and run AutomationSpec/Functional Tests for important features.
100+
- Run tests after relevant changes; record repro steps for issues.
101+
- Use Fire-BuildAndTest.ps1.bat --no-pause -TestFilter "filter-pattern"
102+
for test runs.
103+
- Tests should avoid Engine internal/private headers/APIs; prefer public `U*`
104+
APIs. If internals are unavoidable, isolate and document why.

CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@AGENTS.md

PackageForMarketplace.ps1

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# PackageForMarketplace.ps1
2+
# This script packages the RuntimeAssetImportPlugin for Unreal Engine Marketplace / Fab submission.
3+
4+
$PluginName = "RuntimeAssetImport"
5+
$OutputDir = Join-Path $PSScriptRoot "PackedForMarketplace"
6+
$ZipFile = Join-Path $PSScriptRoot "$($PluginName)_Marketplace.zip"
7+
8+
# 1. Clean up old output
9+
if (Test-Path $OutputDir) { Remove-Item -Recurse -Force $OutputDir }
10+
if (Test-Path $ZipFile) { Remove-Item -Force $ZipFile }
11+
12+
# 2. Create staging directory
13+
New-Item -ItemType Directory -Path $OutputDir | Out-Null
14+
15+
# 3. Copy necessary folders and files
16+
# Marketplace requirements: Source, Content, Resources, .uplugin are essential.
17+
# We also include our prebuilt ThirdParty binaries.
18+
$Includes = @("Source", "Content", "Resources", "*.uplugin", "README.md", "LICENSE")
19+
$Excludes = @(".git*", ".github", "Intermediate", "Binaries", "Packed*", "Config", "*.bat", "*.sh", "agent-ruleset.json", "AGENTS.md", "CLAUDE.md")
20+
21+
Write-Host "Staging files for $PluginName..." -ForegroundColor Cyan
22+
23+
Get-ChildItem -Path $PSScriptRoot -File | ForEach-Object {
24+
$fileName = $_.Name
25+
$shouldInclude = $false
26+
foreach ($pattern in $Includes) {
27+
if ($fileName -like $pattern) { $shouldInclude = $true; break }
28+
}
29+
if ($shouldInclude) {
30+
Copy-Item $_.FullName -Destination $OutputDir
31+
}
32+
}
33+
34+
$IncludeFolders = @("Source", "Content", "Resources")
35+
36+
Write-Host "Staging folders..." -ForegroundColor Cyan
37+
foreach ($folder in $IncludeFolders) {
38+
$SrcPath = Join-Path $PSScriptRoot $folder
39+
if (Test-Path $SrcPath) {
40+
$DestPath = Join-Path $OutputDir $folder
41+
Write-Host " Copying $folder..."
42+
robocopy $SrcPath $DestPath /MIR /XD $Excludes /XF $Excludes /R:3 /W:5 | Out-Null
43+
} else {
44+
Write-Warning "Folder not found: $folder"
45+
}
46+
}
47+
48+
# 4. Final verification
49+
if (!(Test-Path (Join-Path $OutputDir "$PluginName.uplugin"))) {
50+
Write-Error "Failed to find .uplugin in staging area!"
51+
exit 1
52+
}
53+
54+
# 5. Create ZIP
55+
Write-Host "Creating archive: $ZipFile" -ForegroundColor Green
56+
Compress-Archive -Path "$OutputDir\*" -DestinationPath $ZipFile
57+
58+
Write-Host "Done! Package is ready for upload at: $ZipFile" -ForegroundColor Green

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ UnrealEditor.exe <YourProject>.uproject -ExecCmds="Automation RunTests RuntimeAs
6464

6565
Or from the UE Editor UI: **Window > Test Automation**, search `RuntimeAssetImport`, click **Start Tests**.
6666

67+
## Packaging for Marketplace
68+
69+
To create a submission package for Fab / Unreal Engine Marketplace, run:
70+
71+
```powershell
72+
powershell -File .\PackageForMarketplace.ps1
73+
```
74+
75+
This creates a staging directory under `PackedForMarketplace/` and a zip archive named
76+
`RuntimeAssetImport_Marketplace.zip`. Both outputs are generated artifacts and are ignored by Git.
77+
6778
## Known Limitations
6879
- Only embedded textures are loaded (external texture file references are not yet supported)
6980
- Only 1 texture per material is supported

Resources/Screenshot1.png

44.3 KB
Loading

Resources/Screenshot2.png

932 KB
Loading

Resources/Thumbnail.png

860 KB
Loading

0 commit comments

Comments
 (0)