com.wallstop-studios.dxmessaging 3.1.0 → 3.2.1

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 (139) hide show
  1. package/CHANGELOG.md +326 -0
  2. package/Editor/Analyzers/BaseCallLogMessageParser.cs.meta +3 -3
  3. package/Editor/Analyzers/BaseCallReportAggregator.cs.meta +3 -3
  4. package/Editor/Analyzers/DxMessagingConsoleHarvester.cs +8 -8
  5. package/Editor/Analyzers/DxMessagingConsoleHarvester.cs.meta +3 -3
  6. package/Editor/CustomEditors/MessageAwareComponentFallbackEditor.cs +171 -13
  7. package/Editor/CustomEditors/MessageAwareComponentFallbackEditor.cs.meta +3 -3
  8. package/Editor/CustomEditors/MessageAwareComponentInspectorOverlay.cs +391 -96
  9. package/Editor/CustomEditors/MessageAwareComponentInspectorOverlay.cs.meta +3 -3
  10. package/Editor/CustomEditors/MessageAwareComponentInspectorView.cs +279 -0
  11. package/Editor/CustomEditors/MessageAwareComponentInspectorView.cs.meta +11 -0
  12. package/Editor/DxMessagingEditorPalette.cs +66 -0
  13. package/Editor/DxMessagingEditorPalette.cs.meta +11 -0
  14. package/Editor/DxMessagingEditorTheme.cs +200 -0
  15. package/Editor/DxMessagingEditorTheme.cs.meta +11 -0
  16. package/Editor/DxMessagingMenu.cs.meta +3 -3
  17. package/Editor/DxMessagingSceneBuildProcessor.cs.meta +3 -3
  18. package/Editor/Icons/dxmessaging-icon-256.png +0 -0
  19. package/Editor/Icons/dxmessaging-icon-256.png.meta +156 -0
  20. package/Editor/Icons/dxmessaging-icon-32.png +0 -0
  21. package/Editor/Icons/dxmessaging-icon-32.png.meta +156 -0
  22. package/Editor/Icons/dxmessaging-icon-48.png +0 -0
  23. package/Editor/Icons/dxmessaging-icon-48.png.meta +156 -0
  24. package/Editor/Icons.meta +8 -0
  25. package/Editor/Settings/DxMessagingBaseCallIgnoreSync.cs +2 -3
  26. package/Editor/Settings/DxMessagingBaseCallIgnoreSync.cs.meta +3 -3
  27. package/Editor/Settings/DxMessagingSettingsProvider.cs +368 -33
  28. package/Editor/SetupCscRsp.cs +232 -163
  29. package/Editor/Testing/MessagingComponentEditorHarness.cs +11 -4
  30. package/Editor/Theme/DxMessagingTheme.uss +255 -0
  31. package/Editor/Theme/DxMessagingTheme.uss.meta +11 -0
  32. package/Editor/Theme/DxTokens.uss +90 -0
  33. package/Editor/Theme/DxTokens.uss.meta +11 -0
  34. package/Editor/Theme.meta +8 -0
  35. package/Editor/Windows/DxMessagingFlowGraphWindow.cs +5513 -0
  36. package/Editor/Windows/DxMessagingFlowGraphWindow.cs.meta +11 -0
  37. package/Editor/Windows/DxMessagingMessageMonitorWindow.cs +2288 -0
  38. package/Editor/Windows/DxMessagingMessageMonitorWindow.cs.meta +11 -0
  39. package/Editor/Windows.meta +8 -0
  40. package/README.md +84 -35
  41. package/Runtime/Analyzers.meta +8 -0
  42. package/Runtime/AssemblyInfo.cs +1 -0
  43. package/Runtime/Core/Attributes/DxIgnoreMissingBaseCallAttribute.cs.meta +3 -3
  44. package/Runtime/Core/Diagnostics/MessageEmissionData.cs +29 -1
  45. package/Runtime/Core/DxMessagingStaticState.cs.meta +3 -3
  46. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +3 -3
  47. package/Runtime/Core/Extensions/MessageExtensions.cs +4 -5
  48. package/Runtime/Core/Extensions/MessageExtensions.cs.meta +3 -3
  49. package/Runtime/Core/Helper/MessageCache.cs +56 -23
  50. package/Runtime/Core/IMessage.cs.meta +3 -3
  51. package/Runtime/Core/InstanceId.cs.meta +3 -3
  52. package/Runtime/Core/Internal/FlatDispatch.cs +32 -0
  53. package/Runtime/Core/Internal/TypedSlots.cs +45 -7
  54. package/Runtime/Core/MessageBus/DiagnosticsTarget.cs.meta +3 -3
  55. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +3 -3
  56. package/Runtime/Core/MessageBus/IMessageBus.cs +63 -28
  57. package/Runtime/Core/MessageBus/IMessageBus.cs.meta +3 -3
  58. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +3 -3
  59. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +3 -3
  60. package/Runtime/Core/MessageBus/MessageBus.cs +1135 -626
  61. package/Runtime/Core/MessageBus/MessageBus.cs.meta +3 -3
  62. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +3 -3
  63. package/Runtime/Core/MessageBus/MessageBusRegistration.cs +207 -0
  64. package/Runtime/Core/MessageBus/MessageBusRegistration.cs.meta +11 -0
  65. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +3 -3
  66. package/Runtime/Core/MessageBus/MessagingRegistration.cs.meta +3 -3
  67. package/Runtime/Core/MessageBus/RegistrationLog.cs +25 -12
  68. package/Runtime/Core/MessageBus/RegistrationLog.cs.meta +3 -3
  69. package/Runtime/Core/MessageHandler.cs +1886 -1082
  70. package/Runtime/Core/MessageHandler.cs.meta +3 -3
  71. package/Runtime/Core/MessageRegistrationHandle.cs +19 -5
  72. package/Runtime/Core/MessageRegistrationHandle.cs.meta +3 -3
  73. package/Runtime/Core/MessageRegistrationToken.cs +1932 -895
  74. package/Runtime/Core/MessageRegistrationToken.cs.meta +3 -3
  75. package/Runtime/Core/Messages/IBroadcastMessage.cs.meta +3 -3
  76. package/Runtime/Core/Messages/ITargetedMessage.cs.meta +3 -3
  77. package/Runtime/Core/Messages/IUntargetedMessage.cs.meta +3 -3
  78. package/Runtime/Core/Messages/SourcedStringMessage.cs.meta +3 -3
  79. package/Runtime/Core/MessagingDebug.cs.meta +3 -3
  80. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +3 -3
  81. package/Runtime/Unity/DxMessagingRuntimeInitializer.cs.meta +3 -3
  82. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +3 -3
  83. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +3 -3
  84. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +3 -3
  85. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +3 -3
  86. package/Runtime/Unity/MessageAwareComponent.cs.meta +3 -3
  87. package/Runtime/Unity/MessageBusProviderHandle.cs.meta +3 -3
  88. package/Runtime/Unity/MessagingComponent.cs.meta +3 -3
  89. package/Runtime/Unity/MessagingComponentInstaller.cs.meta +3 -3
  90. package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +3 -3
  91. package/Samples~/DI/Reflex/SampleInstaller.cs.meta +3 -3
  92. package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +3 -3
  93. package/Samples~/DI/Zenject/SampleInstaller.cs.meta +3 -3
  94. package/Samples~/Diagnostics Tooling Exerciser/DiagnosticsToolingExerciser.cs +173 -0
  95. package/Samples~/Diagnostics Tooling Exerciser/DiagnosticsToolingExerciser.cs.meta +11 -0
  96. package/Samples~/Diagnostics Tooling Exerciser/DiagnosticsToolingExerciser.unity +424 -0
  97. package/Samples~/Diagnostics Tooling Exerciser/DiagnosticsToolingExerciser.unity.meta +7 -0
  98. package/Samples~/Diagnostics Tooling Exerciser/DiagnosticsToolingReceiver.cs +185 -0
  99. package/Samples~/Diagnostics Tooling Exerciser/DiagnosticsToolingReceiver.cs.meta +11 -0
  100. package/Samples~/Diagnostics Tooling Exerciser/Messages.cs +46 -0
  101. package/Samples~/Diagnostics Tooling Exerciser/Messages.cs.meta +11 -0
  102. package/Samples~/Diagnostics Tooling Exerciser/README.md +53 -0
  103. package/Samples~/Diagnostics Tooling Exerciser/README.md.meta +7 -0
  104. package/Samples~/Diagnostics Tooling Exerciser/WallstopStudios.DxMessaging.DiagnosticsToolingExerciser.Sample.asmdef +13 -0
  105. package/Samples~/Diagnostics Tooling Exerciser/WallstopStudios.DxMessaging.DiagnosticsToolingExerciser.Sample.asmdef.meta +7 -0
  106. package/Samples~/Diagnostics Tooling Exerciser.meta +8 -0
  107. package/Samples~/Mini Combat/Boot.cs.meta +3 -3
  108. package/Samples~/Mini Combat/Enemy.cs.meta +3 -3
  109. package/Samples~/Mini Combat/Messages.cs.meta +3 -3
  110. package/Samples~/Mini Combat/Player.cs.meta +3 -3
  111. package/Samples~/Mini Combat/README.md +1 -1
  112. package/Samples~/Mini Combat/UIOverlay.cs.meta +3 -3
  113. package/Samples~/Mini Combat/Walkthrough.md +3 -3
  114. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs.meta +3 -3
  115. package/Samples~/UI Buttons + Inspector/Messages.cs.meta +3 -3
  116. package/Samples~/UI Buttons + Inspector/MessagingObserver.cs.meta +3 -3
  117. package/Samples~/UI Buttons + Inspector/UIButtonEmitter.cs.meta +3 -3
  118. package/SourceGenerators/Directory.Build.props +5 -5
  119. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/DxAutoConstructorGenerator.cs.meta +3 -3
  120. package/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj +12 -11
  121. package/docs/images/DxMessaging-banner.svg +79 -0
  122. package/docs/images/DxMessaging-banner.svg.meta +53 -0
  123. package/docs/images.meta +8 -0
  124. package/docs.meta +8 -0
  125. package/package.json +17 -5
  126. /package/{Editor → Runtime}/Analyzers/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  127. /package/{Editor → Runtime}/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +0 -0
  128. /package/{Editor → Runtime}/Analyzers/Microsoft.CodeAnalysis.dll +0 -0
  129. /package/{Editor → Runtime}/Analyzers/Microsoft.CodeAnalysis.dll.meta +0 -0
  130. /package/{Editor → Runtime}/Analyzers/System.Collections.Immutable.dll +0 -0
  131. /package/{Editor → Runtime}/Analyzers/System.Collections.Immutable.dll.meta +0 -0
  132. /package/{Editor → Runtime}/Analyzers/System.Reflection.Metadata.dll +0 -0
  133. /package/{Editor → Runtime}/Analyzers/System.Reflection.Metadata.dll.meta +0 -0
  134. /package/{Editor → Runtime}/Analyzers/System.Runtime.CompilerServices.Unsafe.dll +0 -0
  135. /package/{Editor → Runtime}/Analyzers/System.Runtime.CompilerServices.Unsafe.dll.meta +0 -0
  136. /package/{Editor → Runtime}/Analyzers/WallstopStudios.DxMessaging.Analyzer.dll +0 -0
  137. /package/{Editor → Runtime}/Analyzers/WallstopStudios.DxMessaging.Analyzer.dll.meta +0 -0
  138. /package/{Editor → Runtime}/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll +0 -0
  139. /package/{Editor → Runtime}/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll.meta +0 -0
@@ -0,0 +1,53 @@
1
+ # Diagnostics Tooling Exerciser Sample
2
+
3
+ This sample imports a scene that generates deterministic diagnostics data for
4
+ the package editor tools.
5
+
6
+ ## What It Exercises
7
+
8
+ - **Message Monitor**: global history, component diagnostics, typed filters,
9
+ context filters, visible message-type lanes, and visible context lanes.
10
+ - **Flow Graph**: untargeted, targeted, broadcast, exact-source broadcast,
11
+ broadcast-without-source, `RegisterGlobalAcceptAll`, trace IDs, route-kind
12
+ lanes, component lanes, target lanes, context lanes, and route maps.
13
+ - **Inspector overlay**: each receiver is a `MessageAwareComponent` with a live
14
+ `MessagingComponent`, enabled token diagnostics, public counters, and recent
15
+ payload fields.
16
+ - **Project Settings**: the runner enables global diagnostics at play start, so
17
+ Project Settings changes to diagnostics targets and message buffer size are
18
+ visible immediately when the scene is rerun.
19
+
20
+ ## Run It
21
+
22
+ 1. Import **Diagnostics Tooling Exerciser** from the Package Manager Samples tab.
23
+ 1. Open `DiagnosticsToolingExerciser.unity`.
24
+ 1. Press Play. The runner emits a burst of one untargeted pulse, one targeted
25
+ command for each receiver, and one broadcast signal for each source.
26
+ 1. Open **Tools > Wallstop Studios > DxMessaging > Message Monitor**.
27
+ 1. Open **Tools > Wallstop Studios > DxMessaging > Flow Graph**.
28
+ 1. Select `Player Ship`, `Enemy Drone`, and `HUD Console` to inspect local
29
+ diagnostics counters.
30
+
31
+ The runner also exposes context-menu commands:
32
+
33
+ - **Emit One Of Each** sends one untargeted, targeted, and broadcast pass.
34
+ - **Emit Burst** repeats that pass using `burstCount`.
35
+ - Receiver **Reset Counts** clears the inspector counters without changing
36
+ registrations.
37
+
38
+ ## Expected Tool Data
39
+
40
+ After the default play-start burst:
41
+
42
+ - `DiagnosticsToolingExerciser.Sequence` is `3`.
43
+ - Message Monitor global history includes `ToolingPulse`, `ToolingCommand`, and
44
+ `ToolingSignal` entries with trace IDs like `sample-pulse-001`.
45
+ - Flow Graph shows three receiver components, three message types, targeted
46
+ routes to each receiver, exact-source broadcast routes for `Player Ship` and
47
+ `Enemy Drone`, and broadcast-without-source routes for all receivers.
48
+ - The component diagnostics panel shows enabled listener diagnostics and local
49
+ emissions for each receiver.
50
+
51
+ This sample is intentionally small and deterministic. If a tool surface changes,
52
+ update this README, the scene, and
53
+ `DiagnosticsToolingSampleContractTests` together.
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 83e8290ee4feb017d2c6d73f5f3f6480
3
+ TextScriptImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "WallstopStudios.DxMessaging.DiagnosticsToolingExerciser.Sample",
3
+ "rootNamespace": "WallstopStudios.DxMessagingSamples.DiagnosticsToolingExerciser",
4
+ "references": ["WallstopStudios.DxMessaging"],
5
+ "includePlatforms": [],
6
+ "excludePlatforms": [],
7
+ "allowUnsafeCode": false,
8
+ "overrideReferences": false,
9
+ "precompiledReferences": [],
10
+ "autoReferenced": true,
11
+ "defineConstraints": [],
12
+ "noEngineReferences": false
13
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: c133c0a50aa52ce1097ea4f2180859ef
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: da9cd5dfa03de0a56243f9f3d51d2758
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -40,7 +40,7 @@ public class Player : MessageAwareComponent {
40
40
  void Heal(int amount) {
41
41
  health += amount;
42
42
  var healed = new PlayerHealed(amount);
43
- healed.EmitBroadcast(this);
43
+ healed.EmitGameObjectBroadcast(gameObject);
44
44
  // Done! UI, audio, analytics all react automatically.
45
45
  }
46
46
  }
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -217,7 +217,7 @@ The Enemy doesn't know (or care) who needs to know about the damage. It just ann
217
217
  ### The Code Flow
218
218
 
219
219
  1. **[Enemy.cs](./Enemy.cs)** detects it took damage
220
- 1. **Enemy** calls: `this.EmitBroadcast(new TookDamage(amount))`
220
+ 1. **Enemy** creates `TookDamage tookDamage = new TookDamage(amount)` and calls `tookDamage.EmitGameObjectBroadcast(gameObject)`
221
221
  1. **UIOverlay** receives it via `RegisterBroadcastWithoutSource`
222
222
  1. **UIOverlay** displays the damage event
223
223
 
@@ -357,7 +357,7 @@ token.RegisterBroadcastWithoutSource<TookDamage>(OnTookDamage);
357
357
 
358
358
  **Use for**: Events that multiple systems care about
359
359
 
360
- **Key characteristic**: Uses `EmitBroadcast` to send messages
360
+ **Key characteristic**: Uses `EmitGameObjectBroadcast(gameObject)` to send messages from its GameObject
361
361
 
362
362
  ### Pattern 4: The Orchestrator (Boot)
363
363
 
@@ -420,7 +420,7 @@ Try modifying the sample:
420
420
  |------------|--------|---------|
421
421
  | Send to everyone | Untargeted | `var paused = new GamePaused(); paused.Emit();` |
422
422
  | Send to specific Component | Targeted | `var heal = new Heal(10); heal.EmitComponentTargeted(playerComponent);` |
423
- | Announce an event | Broadcast | `this.EmitBroadcast(new Exploded())` |
423
+ | Announce an event | Broadcast | `var exploded = new Exploded(); exploded.EmitGameObjectBroadcast(gameObject);` |
424
424
  | Listen to everything | `RegisterBroadcastWithoutSource` | `token.RegisterBroadcastWithoutSource<Damage>(OnDamage)` |
425
425
  | Listen to specific source | `RegisterComponentBroadcast` | `token.RegisterComponentBroadcast<Fire>(weapon, OnFire)` |
426
426
  | Receive targeted messages | `RegisterComponentTargeted` | `token.RegisterComponentTargeted<Heal>(this, OnHeal)` |
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -9,8 +9,8 @@
9
9
  end with '~'. If a SourceGenerators project builds its obj/ or bin/ in-tree,
10
10
  Unity imports those build outputs. The analyzer/source-generator DLLs there
11
11
  have the SAME assembly names as the correctly-configured shipped analyzers in
12
- Editor/Analyzers/, but their Unity-auto-generated .meta lack the
13
- RoslynAnalyzer label / validateReferences:0 / all-platforms-disabled config.
12
+ Runtime/Analyzers/, but their Unity-auto-generated .meta lack the
13
+ RoslynAnalyzer label / all-platforms-disabled PluginImporter config.
14
14
  Unity then fails to resolve their Microsoft.CodeAnalysis reference and the
15
15
  duplicate shadows the real analyzers, so the source generator never runs and
16
16
  every [Dx*Message] type fails to implement its generated interface
@@ -18,7 +18,7 @@
18
18
 
19
19
  Building these projects is REQUIRED by the dev workflow (the main projects'
20
20
  PostBuildCopyAnalyzers target copies the freshly-built DLL into
21
- Editor/Analyzers/), so the build MUST go somewhere Unity ignores.
21
+ Runtime/Analyzers/), so the build MUST go somewhere Unity ignores.
22
22
 
23
23
  HOW: redirect per-project obj/ and bin/ to
24
24
  $(SolutionDir).artifacts/$(MSBuildProjectName)/{obj,bin}/$(Configuration)/.
@@ -30,7 +30,7 @@
30
30
  Configuration-scoped obj subfolder) and OutputPath (bin) are set for the
31
31
  build itself. $(TargetPath) therefore resolves under .artifacts/, and the
32
32
  PostBuildCopyAnalyzers targets still copy the built DLL into
33
- Editor/Analyzers/ correctly.
33
+ Runtime/Analyzers/ correctly.
34
34
  -->
35
35
  <PropertyGroup>
36
36
  <SolutionDir Condition="'$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)..\</SolutionDir>
@@ -51,6 +51,6 @@
51
51
  <DebugSymbols>false</DebugSymbols>
52
52
  <CopyAnalyzerPayload Condition="'$(CopyAnalyzerPayload)' == ''">true</CopyAnalyzerPayload>
53
53
  <AnalyzerPayloadOutputDir Condition="'$(AnalyzerPayloadOutputDir)' == ''"
54
- >$([System.IO.Path]::Combine('$(SolutionDir)', 'Editor', 'Analyzers'))</AnalyzerPayloadOutputDir>
54
+ >$([System.IO.Path]::Combine('$(SolutionDir)', 'Runtime', 'Analyzers'))</AnalyzerPayloadOutputDir>
55
55
  </PropertyGroup>
56
56
  </Project>
@@ -6,6 +6,6 @@ MonoImporter:
6
6
  defaultReferences: []
7
7
  executionOrder: 0
8
8
  icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -25,25 +25,26 @@
25
25
  directory selected by AnalyzerPayloadOutputDir.
26
26
 
27
27
  This target copies ONLY the freshly-built source-generator DLL.
28
- The Roslyn runtime deps that this package ships alongside it
28
+ The pinned Roslyn dependency DLLs the analyzer host needs
29
29
  (Microsoft.CodeAnalysis[.CSharp], System.Collections.Immutable,
30
30
  System.Reflection.Metadata, System.Runtime.CompilerServices.Unsafe)
31
- are committed in Editor/Analyzers/ as fixed bytes and are NOT
32
- re-copied by this build: a normal (non-clean) rebuild therefore
31
+ are committed co-located in Runtime/Analyzers/ as fixed bytes and are
32
+ NOT re-copied by this build: a normal (non-clean) rebuild therefore
33
33
  leaves those committed dep DLLs untouched. Do NOT wipe
34
- Editor/Analyzers/ wholesale; the committed dep bytes are the proven,
35
- Unity-validated set and are not reproduced by this 3.8.0-pinned build
36
- (the committed deps were built against Roslyn 4.2.0).
34
+ Runtime/Analyzers/ wholesale; the committed dep bytes are the proven,
35
+ Unity-validated set (notably for Unity 2021's analyzer loader) and are
36
+ not reproduced by this 3.8.0-pinned build.
37
37
 
38
- AnalyzerPayloadOutputDir defaults to Editor/Analyzers for local refresh
38
+ AnalyzerPayloadOutputDir defaults to Runtime/Analyzers for local refresh
39
39
  builds. CI freshness checks pass a temp directory so builds do not dirty
40
40
  the worktree. CopyAnalyzerPayload=false disables this target for tests
41
41
  that reference this project but do not validate the shipped payload.
42
42
 
43
- The shipped Editor/Analyzers/*.dll.meta files for the two analyzer
44
- assemblies carry the analyzer configuration directly, and SetupCscRsp
45
- copies the analyzer DLLs into Assets/Plugins/Editor/ so the source
46
- generator applies project-wide. -->
43
+ The shipped Runtime/Analyzers/*.dll.meta files for the two analyzer
44
+ assemblies carry the RoslynAnalyzer label directly, so Unity scopes the
45
+ source generator to the DxMessaging runtime assembly and every assembly
46
+ that references it (including the predefined Assembly-CSharp), so
47
+ nothing is copied into the consumer's project. -->
47
48
  <Target
48
49
  Name="PostBuildCopyAnalyzers"
49
50
  AfterTargets="Build"
@@ -0,0 +1,79 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 200" width="800" height="200" role="img" aria-labelledby="dxmsgBannerTitle" aria-describedby="dxmsgBannerDesc">
2
+ <title id="dxmsgBannerTitle">DxMessaging: decoupled Unity messaging</title>
3
+ <desc id="dxmsgBannerDesc">A DxKit-family amber DxMessaging banner for decoupled, simple Unity systems.</desc>
4
+ <defs>
5
+ <linearGradient id="dxBannerBackground" x1="0" y1="0" x2="800" y2="200" gradientUnits="userSpaceOnUse">
6
+ <stop stop-color="#0d1117"/>
7
+ <stop offset="0.62" stop-color="#10151d"/>
8
+ <stop offset="1" stop-color="#1b1813"/>
9
+ </linearGradient>
10
+ <linearGradient id="dxBannerAmber" x1="40" y1="32" x2="742" y2="164" gradientUnits="userSpaceOnUse">
11
+ <stop stop-color="#ffd48e"/>
12
+ <stop offset="0.48" stop-color="#f4a836"/>
13
+ <stop offset="1" stop-color="#b07d1f"/>
14
+ </linearGradient>
15
+ <filter id="dxBannerSoftShadow" x="-20%" y="-20%" width="140%" height="140%">
16
+ <feDropShadow dx="0" dy="10" stdDeviation="12" flood-color="#000000" flood-opacity="0.32"/>
17
+ </filter>
18
+ </defs>
19
+
20
+ <rect width="800" height="200" fill="url(#dxBannerBackground)"/>
21
+ <path d="M0 150 C112 126 178 170 302 142 C444 110 538 134 800 72 L800 200 L0 200 Z" fill="#f4a836" opacity="0.06"/>
22
+ <path d="M0 38 C154 66 274 28 414 52 C558 78 650 62 800 34" fill="none" stroke="#f4a836" stroke-width="1.2" opacity="0.2"/>
23
+ <path d="M0 58 C168 88 296 48 432 72 C568 96 658 82 800 54" fill="none" stroke="#ffd48e" stroke-width="1.2" opacity="0.12"/>
24
+
25
+ <g transform="translate(34 42)" filter="url(#dxBannerSoftShadow)">
26
+ <polygon points="44,0 82,22 82,66 44,88 6,66 6,22" fill="#0d1117" stroke="#222b36" stroke-width="1.5" stroke-linejoin="round"/>
27
+ <polygon points="44,7 76,25 76,63 44,81 12,63 12,25" fill="none" stroke="url(#dxBannerAmber)" stroke-width="3" stroke-linejoin="round"/>
28
+ <path d="M44 44 L44 18 M44 44 L70 60 M44 44 L18 60" stroke="#ffd48e" stroke-width="2.8" stroke-linecap="round"/>
29
+ <circle cx="44" cy="15" r="4.3" fill="#ffd48e"/>
30
+ <circle cx="74" cy="62" r="4.3" fill="#ffd48e"/>
31
+ <circle cx="14" cy="62" r="4.3" fill="#ffd48e"/>
32
+ <circle cx="44" cy="44" r="7" fill="#ffd48e"/>
33
+ </g>
34
+
35
+ <g transform="translate(132 40)">
36
+ <text x="0" y="0" font-family="'JetBrains Mono', 'SF Mono', monospace" font-size="10" font-weight="700" letter-spacing="0.5" fill="#9aa3af">UNITY &#183; C#</text>
37
+ <text x="0" y="44" font-family="'Space Grotesk', 'IBM Plex Sans', 'Segoe UI', sans-serif" font-size="44" font-weight="700" letter-spacing="0" fill="#e9eef4">DxMessaging</text>
38
+ <text x="0" y="76" font-family="'IBM Plex Sans', 'Segoe UI', sans-serif" font-size="17" font-weight="700" letter-spacing="0" fill="#f4a836">Decoupled, simple systems.</text>
39
+ <text x="0" y="100" font-family="'IBM Plex Sans', 'Segoe UI', sans-serif" font-size="13" font-weight="500" letter-spacing="0" fill="#9aa3af">Typed routes. Managed listeners. Editor visibility.</text>
40
+ </g>
41
+
42
+ <g transform="translate(132 158)" font-family="'IBM Plex Sans', 'Segoe UI', sans-serif" font-size="12" font-weight="800">
43
+ <rect x="0" y="0" width="84" height="28" rx="8" fill="#f4a836"/>
44
+ <text x="42" y="18" text-anchor="middle" fill="#0d1117">Simple</text>
45
+ <rect x="96" y="0" width="58" height="28" rx="8" fill="none" stroke="#4a5462" stroke-width="1.5"/>
46
+ <text x="125" y="18" text-anchor="middle" fill="#c9d1d9">MIT</text>
47
+ <!-- Version text must contain vX.Y.Z for version sync. -->
48
+ <rect x="166" y="0" width="76" height="28" rx="8" fill="#0c1016" stroke="#232c38" stroke-width="1"/>
49
+ <text data-sync="version" x="204" y="18" text-anchor="middle" font-family="'JetBrains Mono', 'SF Mono', monospace" font-size="11" font-weight="800" fill="#e9eef4">v3.2.1</text>
50
+ </g>
51
+
52
+ <g transform="translate(536 40)" filter="url(#dxBannerSoftShadow)">
53
+ <rect x="0" y="0" width="226" height="126" rx="8" fill="#0c1016" stroke="#232c38"/>
54
+ <text x="18" y="26" font-family="'JetBrains Mono', 'SF Mono', monospace" font-size="10" font-weight="800" letter-spacing="0.5" fill="#e9eef4">ONE BUS &#183; THREE ROUTES</text>
55
+ <rect x="18" y="44" width="5" height="68" rx="2.5" fill="url(#dxBannerAmber)"/>
56
+ <g font-family="'IBM Plex Sans', 'Segoe UI', sans-serif" font-size="12" font-weight="700">
57
+ <g>
58
+ <circle cx="32" cy="54" r="4.5" fill="#7fa6d8"/>
59
+ <line x1="40" y1="54" x2="118" y2="54" stroke="#7fa6d8" stroke-width="2" stroke-linecap="round" stroke-dasharray="2 4" opacity="0.75"/>
60
+ <polygon points="120,54 113,50.5 113,57.5" fill="#7fa6d8"/>
61
+ <text x="132" y="58" fill="#7fa6d8">Untargeted</text>
62
+ </g>
63
+ <g>
64
+ <circle cx="32" cy="78" r="4.5" fill="#ec4661"/>
65
+ <line x1="40" y1="78" x2="118" y2="78" stroke="#ec4661" stroke-width="2" stroke-linecap="round" stroke-dasharray="2 4" opacity="0.75"/>
66
+ <polygon points="120,78 113,74.5 113,81.5" fill="#ec4661"/>
67
+ <text x="132" y="82" fill="#ec4661">Targeted</text>
68
+ </g>
69
+ <g>
70
+ <circle cx="32" cy="102" r="4.5" fill="#7fb88a"/>
71
+ <line x1="40" y1="102" x2="118" y2="102" stroke="#7fb88a" stroke-width="2" stroke-linecap="round" stroke-dasharray="2 4" opacity="0.75"/>
72
+ <polygon points="120,102 113,98.5 113,105.5" fill="#7fb88a"/>
73
+ <text x="132" y="106" fill="#7fb88a">Broadcast</text>
74
+ </g>
75
+ </g>
76
+ </g>
77
+
78
+ <text x="762" y="190" text-anchor="end" font-family="'IBM Plex Sans', 'Segoe UI', sans-serif" font-size="10" font-weight="700" letter-spacing="0" fill="#6b7480">Wallstop Studios</text>
79
+ </svg>
@@ -0,0 +1,53 @@
1
+ fileFormatVersion: 2
2
+ guid: 4c1ba6b3e8994dc41b8264e9001eb49f
3
+ ScriptedImporter:
4
+ internalIDToNameTable: []
5
+ externalObjects: {}
6
+ serializedVersion: 2
7
+ userData:
8
+ assetBundleName:
9
+ assetBundleVariant:
10
+ script: {fileID: 12408, guid: 0000000000000000e000000000000000, type: 0}
11
+ svgType: 3
12
+ texturedSpriteMeshType: 0
13
+ svgPixelsPerUnit: 100
14
+ gradientResolution: 64
15
+ alignment: 0
16
+ customPivot: {x: 0, y: 0}
17
+ generatePhysicsShape: 0
18
+ viewportOptions: 0
19
+ preserveViewport: 0
20
+ advancedMode: 0
21
+ tessellationMode: 1
22
+ predefinedResolutionIndex: 1
23
+ targetResolution: 1080
24
+ resolutionMultiplier: 1
25
+ stepDistance: 10
26
+ samplingStepDistance: 100
27
+ maxCordDeviationEnabled: 0
28
+ maxCordDeviation: 1
29
+ maxTangentAngleEnabled: 0
30
+ maxTangentAngle: 5
31
+ keepTextureAspectRatio: 1
32
+ textureSize: 256
33
+ textureWidth: 256
34
+ textureHeight: 256
35
+ wrapMode: 0
36
+ filterMode: 1
37
+ sampleCount: 4
38
+ preserveSVGImageAspect: 0
39
+ useSVGPixelsPerUnit: 0
40
+ spriteData:
41
+ TessellationDetail: 0
42
+ SpriteName:
43
+ SpritePivot: {x: 0, y: 0}
44
+ SpriteAlignment: 0
45
+ SpriteBorder: {x: 0, y: 0, z: 0, w: 0}
46
+ SpriteRect:
47
+ serializedVersion: 2
48
+ x: 0
49
+ y: 0
50
+ width: 0
51
+ height: 0
52
+ SpriteID:
53
+ PhysicsOutlines: []
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: aba5d56721c01744b8bd42e41253da83
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
package/docs.meta ADDED
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 1018165ed29202b4c9ae719674cbbb61
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com.wallstop-studios.dxmessaging",
3
- "version": "3.1.0",
3
+ "version": "3.2.1",
4
4
  "displayName": "DxMessaging",
5
5
  "description": "Synchronous Event Bus for Unity",
6
6
  "unity": "2021.3",
@@ -45,6 +45,10 @@
45
45
  "SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.meta",
46
46
  "CHANGELOG.md",
47
47
  "CHANGELOG.md.meta",
48
+ "docs.meta",
49
+ "docs/images.meta",
50
+ "docs/images/DxMessaging-banner.svg",
51
+ "docs/images/DxMessaging-banner.svg.meta",
48
52
  "LICENSE.md",
49
53
  "LICENSE.md.meta",
50
54
  "README.md",
@@ -61,12 +65,15 @@
61
65
  "format": "prettier --write \"**/*.{md,markdown,json,asmdef,asmref,yml,yaml}\"",
62
66
  "format:check": "prettier --check \"**/*.{md,markdown,json,asmdef,asmref,yml,yaml}\"",
63
67
  "lint:markdown": "markdownlint-cli2 \"**/*.md\" \"**/*.markdown\"",
64
- "check:spelling": "cspell --no-progress --no-summary \"**/*.{md,markdown,cs,json,yml,yaml,ps1,js}\"",
68
+ "check:spelling": "cspell --no-progress --no-summary .",
65
69
  "sync:banner": "node scripts/sync-banner-version.js",
70
+ "check:banner": "node scripts/sync-banner-version.js --check",
66
71
  "update:llms-txt": "node scripts/update-llms-txt.js",
67
72
  "check:llms-txt": "node scripts/update-llms-txt.js --check",
68
73
  "update:skills-index": "node scripts/generate-skills-index.js && prettier --write .llm/skills/index.md",
69
74
  "check:skills-index": "node scripts/generate-skills-index.js --check",
75
+ "update:issue-template-versions": "node scripts/generate-issue-template-versions.js",
76
+ "check:issue-template-versions": "node scripts/generate-issue-template-versions.js --check",
70
77
  "refresh:analyzers": "node scripts/analyzers/verify-analyzer-payload.js --write",
71
78
  "check:analyzers": "node scripts/analyzers/verify-analyzer-payload.js --check",
72
79
  "fix:csharp-underscores": "node scripts/fix-csharp-underscore-methods.js",
@@ -75,12 +82,12 @@
75
82
  "validate:js-loc-budget": "node scripts/validate-js-loc-budget.js",
76
83
  "validate:npm-meta": "node scripts/validate-npm-meta.js",
77
84
  "validate:docs:strict": "python3 -m venv .artifacts/docs-venv && .artifacts/docs-venv/bin/python -m pip install -r requirements-docs.txt && .artifacts/docs-venv/bin/mkdocs build --strict --site-dir _site",
78
- "validate:all": "npm run validate:asmdef-references && npm run validate:unity-versions && npm run validate:js-loc-budget && npm run validate:npm-meta && npm run check:analyzers && npm run check:llms-txt && npm run check:skills-index"
85
+ "validate:all": "npm run validate:asmdef-references && npm run validate:unity-versions && npm run validate:js-loc-budget && npm run check:banner && npm run validate:npm-meta && npm run check:analyzers && npm run check:llms-txt && npm run check:skills-index && npm run check:issue-template-versions"
79
86
  },
80
87
  "devDependencies": {
81
88
  "cspell": "10.0.1",
82
- "markdownlint-cli2": "0.22.1",
83
- "prettier": "3.8.4"
89
+ "markdownlint-cli2": "0.23.0",
90
+ "prettier": "3.9.4"
84
91
  },
85
92
  "samples": [
86
93
  {
@@ -93,6 +100,11 @@
93
100
  "description": "UI-driven message emissions and a global observer demonstrating inspector diagnostics and RegisterGlobalAcceptAll.",
94
101
  "path": "Samples~/UI Buttons + Inspector"
95
102
  },
103
+ {
104
+ "displayName": "Diagnostics Tooling Exerciser",
105
+ "description": "Deterministic scene that drives Message Monitor, Flow Graph, Inspector diagnostics, and Project Settings with all DxMessaging route kinds.",
106
+ "path": "Samples~/Diagnostics Tooling Exerciser"
107
+ },
96
108
  {
97
109
  "displayName": "Dependency Injection",
98
110
  "description": "Integration samples for Zenject, VContainer, and Reflex showing IMessageRegistrationBuilder usage with container lifecycles.",