@phuc1403/musketeer 0.12.0 → 0.14.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 (168) hide show
  1. package/INSTALLATION.md +1 -1
  2. package/README.md +2 -2
  3. package/manifest.json +3 -3
  4. package/package.json +1 -1
  5. package/template/.claude/skills/logical-components/SKILL.md +165 -94
  6. package/template/.claude/skills/logical-components/assets/component-diagram-template.html +104 -0
  7. package/template/.claude/skills/logical-components/references/component-analyst-prompt.md +88 -0
  8. package/template/.claude/skills/logical-components/references/component-level-detection.md +95 -0
  9. package/template/.claude/skills/logical-components/references/logical-component-concepts.md +92 -0
  10. package/template/.claude/skills/logical-components/scripts/build-component-model.cjs +120 -0
  11. package/template/.claude/skills/logical-components/scripts/index-declared-symbols.cjs +106 -0
  12. package/template/.claude/skills/logical-components/scripts/lib/coupling-metrics.cjs +48 -0
  13. package/template/.claude/skills/logical-components/scripts/lib/declared-symbol-patterns.cjs +57 -0
  14. package/template/.claude/skills/logical-components/scripts/lib/html-sections.cjs +91 -0
  15. package/template/.claude/skills/logical-components/scripts/lib/mermaid-graph.cjs +55 -0
  16. package/template/.claude/skills/logical-components/scripts/lib/read-json-input.cjs +109 -0
  17. package/template/.claude/skills/logical-components/scripts/lib/repo-walk.cjs +61 -0
  18. package/template/.claude/skills/logical-components/scripts/lib/verify-claims.cjs +159 -0
  19. package/template/.claude/skills/logical-components/scripts/render-component-diagram-html.cjs +112 -0
  20. package/template/.claude/skills/logical-components/scripts/scan-folder-tree.cjs +88 -0
  21. package/template/.claude/skills/logical-components/scripts/select-stale-components.cjs +129 -0
  22. package/template/.claude/statusline.cjs +26 -22
  23. package/template/.claude/skills/logical-components/.gitattributes +0 -2
  24. package/template/.claude/skills/logical-components/references/component-classifier-prompt.md +0 -53
  25. package/template/.claude/skills/logical-components/references/responsibility-agent-prompt.md +0 -67
  26. package/template/.claude/skills/logical-components/references/responsibility-verifier-prompt.md +0 -39
  27. package/template/.claude/skills/logical-components/scripts/Directory.Build.props +0 -7
  28. package/template/.claude/skills/logical-components/scripts/Directory.Build.rsp +0 -1
  29. package/template/.claude/skills/logical-components/scripts/Directory.Build.targets +0 -6
  30. package/template/.claude/skills/logical-components/scripts/Directory.Packages.props +0 -8
  31. package/template/.claude/skills/logical-components/scripts/LogicalComponents/BatchPlanning.cs +0 -70
  32. package/template/.claude/skills/logical-components/scripts/LogicalComponents/BatchesCommand.cs +0 -47
  33. package/template/.claude/skills/logical-components/scripts/LogicalComponents/CandidatesCommand.cs +0 -98
  34. package/template/.claude/skills/logical-components/scripts/LogicalComponents/CitableSource.cs +0 -54
  35. package/template/.claude/skills/logical-components/scripts/LogicalComponents/Citation.cs +0 -37
  36. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ClassifyBatchesCommand.cs +0 -86
  37. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ClassifyMergeCommand.cs +0 -219
  38. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ComponentDiscovery.cs +0 -180
  39. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ComponentRule.cs +0 -130
  40. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ComponentsFile.cs +0 -101
  41. package/template/.claude/skills/logical-components/scripts/LogicalComponents/CouplingResolver.cs +0 -251
  42. package/template/.claude/skills/logical-components/scripts/LogicalComponents/DisplayName.cs +0 -14
  43. package/template/.claude/skills/logical-components/scripts/LogicalComponents/EdgeExtraction.cs +0 -111
  44. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ExtractCommand.cs +0 -87
  45. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ExtractConfig.cs +0 -79
  46. package/template/.claude/skills/logical-components/scripts/LogicalComponents/LogicalComponents.csproj +0 -15
  47. package/template/.claude/skills/logical-components/scripts/LogicalComponents/MarkdownCodeSpans.cs +0 -72
  48. package/template/.claude/skills/logical-components/scripts/LogicalComponents/MarkdownRenderer.cs +0 -78
  49. package/template/.claude/skills/logical-components/scripts/LogicalComponents/MemberUseResolution.cs +0 -272
  50. package/template/.claude/skills/logical-components/scripts/LogicalComponents/MemberUses.cs +0 -231
  51. package/template/.claude/skills/logical-components/scripts/LogicalComponents/PlainText.cs +0 -55
  52. package/template/.claude/skills/logical-components/scripts/LogicalComponents/PortResolution.cs +0 -75
  53. package/template/.claude/skills/logical-components/scripts/LogicalComponents/Program.cs +0 -27
  54. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ProjectFilters.cs +0 -77
  55. package/template/.claude/skills/logical-components/scripts/LogicalComponents/PruneCommand.cs +0 -164
  56. package/template/.claude/skills/logical-components/scripts/LogicalComponents/RenderCommand.cs +0 -234
  57. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ResponsibilityBatches.cs +0 -84
  58. package/template/.claude/skills/logical-components/scripts/LogicalComponents/ResponsibilityValidation.cs +0 -197
  59. package/template/.claude/skills/logical-components/scripts/LogicalComponents/SeamDispatch.cs +0 -115
  60. package/template/.claude/skills/logical-components/scripts/LogicalComponents/SourceCodeLines.cs +0 -79
  61. package/template/.claude/skills/logical-components/scripts/LogicalComponents/SymbolNames.cs +0 -53
  62. package/template/.claude/skills/logical-components/scripts/LogicalComponents/TypeMap.cs +0 -106
  63. package/template/.claude/skills/logical-components/scripts/LogicalComponents/WalkRoots.cs +0 -63
  64. package/template/.claude/skills/logical-components/scripts/LogicalComponents/WorkspaceLoader.cs +0 -297
  65. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/AssignIdsTests.cs +0 -41
  66. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/BatchPlanningTests.cs +0 -90
  67. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/BatchesCommandTests.cs +0 -37
  68. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CandidatesCommandTests.cs +0 -59
  69. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CitationTests.cs +0 -42
  70. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ClassifyCommandsTests.cs +0 -249
  71. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ComponentDiscoveryTests.cs +0 -253
  72. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CouplingAppExtractionTests.cs +0 -188
  73. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CouplingAppWorkspace.cs +0 -30
  74. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CouplingExtractionTests.cs +0 -174
  75. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/DisplayNameTests.cs +0 -17
  76. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ExtractConfigTests.cs +0 -72
  77. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/FixturePaths.cs +0 -36
  78. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/LogicalComponents.Tests.csproj +0 -23
  79. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/MarkdownRendererTests.cs +0 -93
  80. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ProjectFiltersTests.cs +0 -69
  81. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/PruneCommandTests.cs +0 -149
  82. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/RenderCommandTests.cs +0 -225
  83. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/RenderGoldenTests.cs +0 -34
  84. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/RenderTestData.cs +0 -55
  85. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ResponsibilityValidationTests.cs +0 -315
  86. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/SampleAppWorkspace.cs +0 -27
  87. package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/WorkspaceLoaderTests.cs +0 -266
  88. package/template/.claude/skills/logical-components/scripts/NuGet.config +0 -17
  89. package/template/.claude/skills/logical-components/scripts/fixtures/BrokenApp/src/Broken.Application/Broken.Application.csproj +0 -7
  90. package/template/.claude/skills/logical-components/scripts/fixtures/BrokenApp/src/Broken.Application/Broken.cs +0 -7
  91. package/template/.claude/skills/logical-components/scripts/fixtures/CompositionRootApp/CompositionRootApp.slnx +0 -5
  92. package/template/.claude/skills/logical-components/scripts/fixtures/CompositionRootApp/src/Root.Application/HostBuilderExtensions.cs +0 -15
  93. package/template/.claude/skills/logical-components/scripts/fixtures/CompositionRootApp/src/Root.Application/HostBuilderShims.cs +0 -25
  94. package/template/.claude/skills/logical-components/scripts/fixtures/CompositionRootApp/src/Root.Application/NativeInterop.cs +0 -17
  95. package/template/.claude/skills/logical-components/scripts/fixtures/CompositionRootApp/src/Root.Application/Root.Application.csproj +0 -7
  96. package/template/.claude/skills/logical-components/scripts/fixtures/CompositionRootApp/src/Root.Application/RootAutofacModule.cs +0 -11
  97. package/template/.claude/skills/logical-components/scripts/fixtures/CompositionRootApp/src/Root.Application/RootGreeter.cs +0 -7
  98. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/logical-components.json +0 -48
  99. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/AbstractMemberCases.cs +0 -27
  100. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/AttributeCases.cs +0 -23
  101. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/CouplingApp.Application.csproj +0 -7
  102. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/GenericBaseCases.cs +0 -14
  103. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/GenericSeamBindingCases.cs +0 -59
  104. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/ImplicitCallCases.cs +0 -230
  105. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/PartialInheritCases.First.cs +0 -11
  106. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/PartialInheritCases.Second.cs +0 -14
  107. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/StackOverflowCases.cs +0 -14
  108. package/template/.claude/skills/logical-components/scripts/fixtures/CouplingApp/src/CouplingApp.Application/ViaDisambiguationCases.cs +0 -36
  109. package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/MultiTargetApp.slnx +0 -7
  110. package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Legacy.FSharp/Legacy.FSharp.fsproj +0 -8
  111. package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Legacy.FSharp/Library.fs +0 -5
  112. package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Multi.Application/Multi.Application.csproj +0 -7
  113. package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Multi.Application/Scheduling.cs +0 -14
  114. package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Multi.Infrastructure/Multi.Infrastructure.csproj +0 -12
  115. package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Multi.Infrastructure/SchedulingClient.cs +0 -12
  116. package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application/Solo.Application.csproj +0 -7
  117. package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application/SoloGreeting.cs +0 -7
  118. package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application.Tests/FakeGreeting.cs +0 -6
  119. package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application.Tests/Solo.Application.Tests.csproj +0 -11
  120. package/template/.claude/skills/logical-components/scripts/fixtures/ObjOutputApp/ObjOutputApp.slnx +0 -5
  121. package/template/.claude/skills/logical-components/scripts/fixtures/ObjOutputApp/src/Obj.Application/Greeting.cs +0 -7
  122. package/template/.claude/skills/logical-components/scripts/fixtures/ObjOutputApp/src/Obj.Application/Obj.Application.csproj +0 -14
  123. package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/components.json +0 -67
  124. package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/expected.md +0 -28
  125. package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/repo/src/App/OrderAcceptance.cs +0 -16
  126. package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/repo/src/Infra/OrderQueue.cs +0 -10
  127. package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/resp/batch-01.json +0 -18
  128. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/SampleApp.slnx +0 -10
  129. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/logical-components.json +0 -78
  130. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/CandidateCases.cs +0 -37
  131. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/CouplingCases.cs +0 -33
  132. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/DependencyInjection.cs +0 -18
  133. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/EdgeCases.cs +0 -63
  134. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/LoudNotifying.Base.cs +0 -5
  135. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/LoudNotifying.cs +0 -7
  136. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderAcceptance.cs +0 -17
  137. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderOptions.cs +0 -9
  138. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderRejectedException.cs +0 -7
  139. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderRequest.cs +0 -4
  140. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderRunning.cs +0 -18
  141. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderValidation.cs +0 -6
  142. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/Ports.cs +0 -19
  143. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/PriceRules.cs +0 -7
  144. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReceiptPrinting.Totals.cs +0 -6
  145. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReceiptPrinting.cs +0 -7
  146. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReviewCases.cs +0 -107
  147. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReviewFixCases.cs +0 -143
  148. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/RunClock.cs +0 -12
  149. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/Sample.Application.csproj +0 -10
  150. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/SeeThroughCases.cs +0 -89
  151. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Billing.Application/OrderRunning.cs +0 -7
  152. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Billing.Application/Sample.Billing.Application.csproj +0 -11
  153. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/ForwardedNotifier.cs +0 -8
  154. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/InfrastructureDependencyInjection.cs +0 -16
  155. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/Mailer.cs +0 -6
  156. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/OrderQueue.cs +0 -11
  157. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/QueueEntry.cs +0 -4
  158. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/QueueStore.cs +0 -8
  159. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/ReviewCases.cs +0 -35
  160. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/ReviewFixCases.cs +0 -13
  161. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/Sample.Infrastructure.csproj +0 -13
  162. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/SeeThroughCases.cs +0 -18
  163. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/UnreachedPlumbing.cs +0 -7
  164. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/tests/Sample.Tests/FakeOrderQueue.cs +0 -11
  165. package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/tests/Sample.Tests/Sample.Tests.csproj +0 -11
  166. package/template/.claude/skills/logical-components/scripts/fixtures/SharedOutsideRepo/SharedClock.cs +0 -7
  167. package/template/.claude/skills/logical-components/scripts/global.json +0 -5
  168. package/template/.claude/skills/logical-components/scripts/smoke-sample.sh +0 -26
@@ -1,11 +0,0 @@
1
- <Project Sdk="Microsoft.NET.Sdk">
2
- <!-- A test project inside src/ with no test packages: only its *.Tests name marks it. -->
3
- <PropertyGroup>
4
- <TargetFramework>net10.0</TargetFramework>
5
- <Nullable>enable</Nullable>
6
- <ImplicitUsings>enable</ImplicitUsings>
7
- </PropertyGroup>
8
- <ItemGroup>
9
- <ProjectReference Include="../Solo.Application/Solo.Application.csproj" />
10
- </ItemGroup>
11
- </Project>
@@ -1,5 +0,0 @@
1
- <Solution>
2
- <Folder Name="/src/">
3
- <Project Path="src/Obj.Application/Obj.Application.csproj" />
4
- </Folder>
5
- </Solution>
@@ -1,7 +0,0 @@
1
- namespace Obj.Application;
2
-
3
- /// <summary>A normal, real-source candidate: contrast for GrpcStub (written under obj/ at test time).</summary>
4
- public sealed class Greeting
5
- {
6
- public string For(string name) => $"Hello, {name}!";
7
- }
@@ -1,14 +0,0 @@
1
- <Project Sdk="Microsoft.NET.Sdk">
2
- <PropertyGroup>
3
- <TargetFramework>net10.0</TargetFramework>
4
- <Nullable>enable</Nullable>
5
- <ImplicitUsings>enable</ImplicitUsings>
6
- </PropertyGroup>
7
- <ItemGroup>
8
- <!-- Simulates gRPC/NSwag output written into obj/ by a build-time code generator: an explicit Compile item
9
- (not the SDK's default glob, which excludes obj/) pointing at a real file, not a Roslyn source generator's
10
- virtual document. obj/ is gitignored in scripts/, so this file is not checked in; the test that loads this
11
- fixture writes it before calling WorkspaceLoader.LoadAsync. -->
12
- <Compile Include="obj/Generated/GrpcStub.cs" />
13
- </ItemGroup>
14
- </Project>
@@ -1,67 +0,0 @@
1
- {
2
- "components": [
3
- {
4
- "id": "OrderAcceptance",
5
- "type": "Sample.Application.OrderAcceptance",
6
- "name": "Order Acceptance",
7
- "module": "Sample",
8
- "layer": "Application",
9
- "spans": [
10
- {
11
- "file": "src/App/OrderAcceptance.cs",
12
- "start": 3,
13
- "end": 16
14
- }
15
- ]
16
- },
17
- {
18
- "id": "OrderQueue",
19
- "type": "Sample.Infrastructure.OrderQueue",
20
- "name": "Order Queue",
21
- "module": "Sample",
22
- "layer": "Infrastructure",
23
- "spans": [
24
- {
25
- "file": "src/Infra/OrderQueue.cs",
26
- "start": 5,
27
- "end": 10
28
- }
29
- ]
30
- }
31
- ],
32
- "externalNodes": [
33
- {
34
- "id": "IAuditTrail",
35
- "type": "Sample.Application.IAuditTrail",
36
- "name": "I Audit Trail",
37
- "layer": "port"
38
- }
39
- ],
40
- "edges": [
41
- {
42
- "from": "OrderAcceptance",
43
- "to": "IAuditTrail",
44
- "kinds": [
45
- "di"
46
- ],
47
- "via": [],
48
- "at": "src/App/OrderAcceptance.cs:3"
49
- },
50
- {
51
- "from": "OrderAcceptance",
52
- "to": "OrderQueue",
53
- "kinds": [
54
- "di"
55
- ],
56
- "via": [
57
- "IOrderQueue"
58
- ],
59
- "at": "src/App/OrderAcceptance.cs:3"
60
- }
61
- ],
62
- "warnings": [],
63
- "fileHashes": {
64
- "src/App/OrderAcceptance.cs": "28a98da24919780874e1d25e8c2c9ef6b496cf3dfd6dc171e79dda6bfc9f062a",
65
- "src/Infra/OrderQueue.cs": "5d0de05d2b60730ec4accce7cc93da9c025fb7961549a1ca154400a6de5d12b7"
66
- }
67
- }
@@ -1,28 +0,0 @@
1
- # Logical Components
2
-
3
- ## Order Acceptance
4
-
5
- `Sample.Application.OrderAcceptance`
6
-
7
- - Rejects an order with a non-positive total and records the rejection in the audit trail. (`src/App/OrderAcceptance.cs:7-11`)
8
- - Queues every accepted order. (`src/App/OrderAcceptance.cs:13`)
9
-
10
- ## Order Queue
11
-
12
- `Sample.Infrastructure.OrderQueue`
13
-
14
- - Keeps queued orders in memory, in arrival order. (`src/Infra/OrderQueue.cs:7-9`)
15
-
16
- # Coupling
17
-
18
- `A --> B` means A depends on B: it calls, creates, holds or inherits from B. A component's incoming arrows are its afferent coupling, its outgoing arrows its efferent coupling. Only components in `*.Application` and `*.Infrastructure` projects are drawn; callers in other projects, such as the host, are not shown.
19
-
20
- ```mermaid
21
- %%{init: {"layout": "elk"}}%%
22
- flowchart LR
23
- n_IAuditTrail["I Audit Trail"]
24
- n_OrderAcceptance["Order Acceptance"]
25
- n_OrderQueue["Order Queue"]
26
- n_OrderAcceptance --> n_IAuditTrail
27
- n_OrderAcceptance --> n_OrderQueue
28
- ```
@@ -1,16 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- public sealed class OrderAcceptance(IOrderQueue queue, IAuditTrail audit)
4
- {
5
- public bool Accept(Order order)
6
- {
7
- if (order.Total <= 0)
8
- {
9
- audit.Record($"Rejected {order.Id}");
10
- return false;
11
- }
12
-
13
- queue.Enqueue(order);
14
- return true;
15
- }
16
- }
@@ -1,10 +0,0 @@
1
- using Sample.Application;
2
-
3
- namespace Sample.Infrastructure;
4
-
5
- public sealed class OrderQueue : IOrderQueue
6
- {
7
- private readonly List<Order> _orders = [];
8
-
9
- public void Enqueue(Order order) => _orders.Add(order);
10
- }
@@ -1,18 +0,0 @@
1
- {
2
- "OrderAcceptance": [
3
- {
4
- "text": "Rejects an order with a non-positive total and records the rejection in the audit trail.",
5
- "cite": "src/App/OrderAcceptance.cs:7-11"
6
- },
7
- {
8
- "text": "Queues every accepted order.",
9
- "cite": "src/App/OrderAcceptance.cs:13"
10
- }
11
- ],
12
- "OrderQueue": [
13
- {
14
- "text": "Keeps queued orders in memory, in arrival order.",
15
- "cite": "src/Infra/OrderQueue.cs:7-9"
16
- }
17
- ]
18
- }
@@ -1,10 +0,0 @@
1
- <Solution>
2
- <Folder Name="/src/">
3
- <Project Path="src/Sample.Application/Sample.Application.csproj" />
4
- <Project Path="src/Sample.Billing.Application/Sample.Billing.Application.csproj" />
5
- <Project Path="src/Sample.Infrastructure/Sample.Infrastructure.csproj" />
6
- </Folder>
7
- <Folder Name="/tests/">
8
- <Project Path="tests/Sample.Tests/Sample.Tests.csproj" />
9
- </Folder>
10
- </Solution>
@@ -1,78 +0,0 @@
1
- {
2
- "components": [
3
- "Sample.Application.Archiving",
4
- "Sample.Application.BatchRunning",
5
- "Sample.Application.Builder",
6
- "Sample.Application.Cache",
7
- "Sample.Application.Cache`1",
8
- "Sample.Application.CallbackNormalizing",
9
- "Sample.Application.CrashSettling",
10
- "Sample.Application.Echoing",
11
- "Sample.Application.FallbackPricing",
12
- "Sample.Application.JobCounting",
13
- "Sample.Application.JobReporting",
14
- "Sample.Application.JobShowing",
15
- "Sample.Application.LabelMaking",
16
- "Sample.Application.Labelling",
17
- "Sample.Application.LazyWork",
18
- "Sample.Application.Limits",
19
- "Sample.Application.LineCounting",
20
- "Sample.Application.LoudNotifying",
21
- "Sample.Application.Measuring",
22
- "Sample.Application.NotifyAll",
23
- "Sample.Application.Notifying",
24
- "Sample.Application.OrderAcceptance",
25
- "Sample.Application.OrderHandling",
26
- "Sample.Application.OrderNumberFormat",
27
- "Sample.Application.OrderRunning",
28
- "Sample.Application.OrderTextExtensions",
29
- "Sample.Application.OrderValidation",
30
- "Sample.Application.PingSending",
31
- "Sample.Application.PongViaSeam",
32
- "Sample.Application.PriceFormatting",
33
- "Sample.Application.PriceRules",
34
- "Sample.Application.ReceiptIssuing",
35
- "Sample.Application.ReceiptPrinting",
36
- "Sample.Application.Receipts",
37
- "Sample.Application.RecoveryRouting",
38
- "Sample.Application.RegistryReading",
39
- "Sample.Application.RunClock",
40
- "Sample.Application.ShapeListing",
41
- "Sample.Application.ShippingStage",
42
- "Sample.Application.Stamping",
43
- "Sample.Application.TickCounter",
44
- "Sample.Application.TickReading",
45
- "Sample.Application.TitleReading",
46
- "Sample.Application.TrackedReading",
47
- "Sample.Application.TrackedWriting",
48
- "Sample.Application.UrgentNotifying",
49
- "Sample.Billing.Application.OrderRunning",
50
- "Sample.Infrastructure.DefaultPricing",
51
- "Sample.Infrastructure.DiskStorage",
52
- "Sample.Infrastructure.DwgDrawing",
53
- "Sample.Infrastructure.ExportRecovery",
54
- "Sample.Infrastructure.ForwardedNotifier",
55
- "Sample.Infrastructure.ImportRecovery",
56
- "Sample.Infrastructure.LoggingHandler`1",
57
- "Sample.Infrastructure.Mailer",
58
- "Sample.Infrastructure.OrderQueue",
59
- "Sample.Infrastructure.OrderRequestHandler",
60
- "Sample.Infrastructure.PingHandling",
61
- "Sample.Infrastructure.PongHandling",
62
- "Sample.Infrastructure.QueueStore",
63
- "Sample.Infrastructure.TextHandler",
64
- "Sample.Infrastructure.UnreachedPlumbing"
65
- ],
66
- "helpers": {
67
- "Sample.Application.Dispatch": "Generic dispatch to handlers; no decision.",
68
- "Sample.Application.LabelFormat": "Formats a label with the elapsed time; no decision.",
69
- "Sample.Application.OrderNumber": "Value object: validates its own value.",
70
- "Sample.Application.PaymentMethod": "Value object: one accepted-code check.",
71
- "Sample.Application.PingText": "Text formatting.",
72
- "Sample.Application.PongText": "Text formatting.",
73
- "Sample.Application.Quantity": "Value object: arithmetic on its own value.",
74
- "Sample.Application.StampedText": "Appends a fixed stamp to text.",
75
- "Sample.Application.Ticks": "Enumerates ticks.",
76
- "Sample.Application.TwoWay": "Handler pair used as a helper."
77
- }
78
- }
@@ -1,37 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // A value object that validates itself: a record with a method of its own, so a candidate (the config calls it a helper).
4
- public sealed record OrderNumber(string Value)
5
- {
6
- public static OrderNumber Create(string raw) =>
7
- raw.Length > 0 ? new OrderNumber(raw) : throw new ArgumentException("empty order number", nameof(raw));
8
- }
9
-
10
- // An abstract record holding a decision: a candidate, even though abstract records are never seams.
11
- public abstract record PaymentMethod
12
- {
13
- public static bool IsAccepted(string code) => code == "card";
14
- }
15
-
16
- // A record struct with behaviour: a candidate.
17
- public readonly record struct Quantity(int Value)
18
- {
19
- public Quantity Add(int more) => new(Value + more);
20
- }
21
-
22
- // Only overrides object.ToString: formatting what it holds is not behaviour, so not a candidate.
23
- public sealed record Money(decimal Amount)
24
- {
25
- public override string ToString() => $"{Amount:0.00}";
26
- }
27
-
28
- // Properties and a constructor only: not a candidate.
29
- public sealed class OrderSnapshot
30
- {
31
- public OrderSnapshot(int id)
32
- {
33
- Id = id;
34
- }
35
-
36
- public int Id { get; }
37
- }
@@ -1,33 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // Injects RunClock and also news one: a single edge with both kinds. Calls a C# 14 extension member: a static edge.
4
- // Also takes a framework interface (IReadOnlyList<string>): not a port, never an edge.
5
- public sealed class BatchRunning(RunClock clock, IReadOnlyList<string> labels)
6
- {
7
- public int LabelCount() => labels.Count;
8
-
9
- public TimeSpan Run()
10
- {
11
- using var fresh = new RunClock();
12
- return clock.Elapsed() + fresh.Elapsed();
13
- }
14
-
15
- public string Cost(decimal price) => price.AsMoney();
16
- }
17
-
18
- // A multi-registration: IEnumerable<INotifier> resolves to every INotifier implementation. Calls a classic extension method.
19
- public sealed class NotifyAll(IEnumerable<INotifier> notifiers)
20
- {
21
- public void Send(string message)
22
- {
23
- foreach (var notifier in notifiers)
24
- {
25
- notifier.Notify(message.Shout());
26
- }
27
- }
28
- }
29
-
30
- public static class OrderTextExtensions
31
- {
32
- public static string Shout(this string text) => text.ToUpperInvariant();
33
- }
@@ -1,18 +0,0 @@
1
- using Microsoft.Extensions.DependencyInjection;
2
-
3
- namespace Sample.Application;
4
-
5
- // Composition root: it `new`s everything, so it must never become a component or an edge source.
6
- public static class DependencyInjection
7
- {
8
- public static IServiceCollection AddSampleApplication(this IServiceCollection services)
9
- {
10
- services.AddSingleton(new OrderValidation());
11
- services.AddSingleton(sp => new OrderAcceptance(
12
- sp.GetRequiredService<IOrderQueue>(),
13
- sp.GetRequiredService<OrderValidation>(),
14
- sp.GetRequiredService<INotifier>()));
15
- services.AddSingleton(sp => new OrderRunning(sp.GetRequiredService<IAuditTrail>()));
16
- return services;
17
- }
18
- }
@@ -1,63 +0,0 @@
1
- using System.Text.RegularExpressions;
2
- using Microsoft.Extensions.DependencyInjection;
3
-
4
- namespace Sample.Application;
5
-
6
- // File-local: its metadata name embeds a hash of the absolute path, so it must never become a component.
7
- file static class FileHelper
8
- {
9
- public static int Twice(int value) => value * 2;
10
- }
11
-
12
- // Partial with a source-generated half: only this file may appear in its spans.
13
- public sealed partial class OrderNumberFormat
14
- {
15
- [GeneratedRegex("^[0-9]+$")]
16
- private static partial Regex Digits();
17
-
18
- public bool IsValid(string orderNumber) => Digits().IsMatch(orderNumber);
19
- }
20
-
21
- // C# 14 extension block: its methods are behaviour, so this is a component.
22
- public static class PriceFormatting
23
- {
24
- extension(decimal price)
25
- {
26
- public string AsMoney() => price.ToString("0.00");
27
- }
28
- }
29
-
30
- // Composition root written as an extension block, with an ordinary helper beside it: still not a component.
31
- public static class BillingSetup
32
- {
33
- extension(IServiceCollection services)
34
- {
35
- public IServiceCollection AddBilling() => services;
36
- }
37
-
38
- public static int DefaultCurrencyDigits() => 2;
39
- }
40
-
41
- // Only explicit interface implementations: still behaviour, so a component.
42
- public interface ITick
43
- {
44
- void Tick();
45
- }
46
-
47
- public sealed class TickCounter : ITick
48
- {
49
- void ITick.Tick()
50
- {
51
- }
52
- }
53
-
54
- // Same simple name, same module: the module prefix alone cannot tell these apart.
55
- public sealed class Cache
56
- {
57
- public int Size() => 0;
58
- }
59
-
60
- public sealed class Cache<T>
61
- {
62
- public T? Get() => default;
63
- }
@@ -1,5 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- public sealed partial class LoudNotifying : Notifying
4
- {
5
- }
@@ -1,7 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // A partial class whose base class is declared in its second part: the inherits edge cites that base list.
4
- public sealed partial class LoudNotifying
5
- {
6
- public string Volume() => "loud";
7
- }
@@ -1,17 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // Primary constructor: DI of a port (IOrderQueue), a class (OrderValidation) and a forwarded port (INotifier).
4
- public sealed class OrderAcceptance(IOrderQueue queue, OrderValidation validation, INotifier notifier)
5
- {
6
- public bool Accept(OrderRequest request)
7
- {
8
- if (!validation.IsValid(request))
9
- {
10
- notifier.Notify($"Rejected order {request.Id}");
11
- return false;
12
- }
13
-
14
- queue.Enqueue(request);
15
- return true;
16
- }
17
- }
@@ -1,9 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // Options, not a component, even though it declares a method.
4
- public sealed class OrderOptions
5
- {
6
- public int MaxQueued { get; set; } = 10;
7
-
8
- public bool IsWithinLimit(int queued) => queued <= MaxQueued;
9
- }
@@ -1,7 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // An exception with a method of its own: still never a logical component.
4
- public sealed class OrderRejectedException(string reason) : Exception(reason)
5
- {
6
- public static OrderRejectedException ForPrice(decimal price) => new($"Price {price} is not allowed");
7
- }
@@ -1,4 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // Data, not a component.
4
- public record OrderRequest(int Id, decimal Price);
@@ -1,18 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // Classic constructor: DI of a port with no implementation, plus a `new` edge inside a method body.
4
- public sealed class OrderRunning
5
- {
6
- private readonly IAuditTrail _audit;
7
-
8
- public OrderRunning(IAuditTrail audit)
9
- {
10
- _audit = audit;
11
- }
12
-
13
- public void Run()
14
- {
15
- using var clock = new RunClock();
16
- _audit.Record($"Ran in {clock.Elapsed()}");
17
- }
18
- }
@@ -1,6 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- public sealed class OrderValidation
4
- {
5
- public bool IsValid(OrderRequest request) => PriceRules.Check(request.Price);
6
- }
@@ -1,19 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // Port implemented in Infrastructure: edges through it resolve to OrderQueue.
4
- public interface IOrderQueue
5
- {
6
- void Enqueue(OrderRequest request);
7
- }
8
-
9
- // Port implemented in Infrastructure by a class registered through forwarding.
10
- public interface INotifier
11
- {
12
- void Notify(string message);
13
- }
14
-
15
- // Port with no implementation anywhere: must surface as an unresolved port.
16
- public interface IAuditTrail
17
- {
18
- void Record(string entry);
19
- }
@@ -1,7 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // Static class with behaviour: a component, reached by a static call.
4
- public static class PriceRules
5
- {
6
- public static bool Check(decimal price) => price > 0;
7
- }
@@ -1,6 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- public sealed partial class ReceiptPrinting
4
- {
5
- public string Footer(decimal total) => $"Total {total}";
6
- }
@@ -1,7 +0,0 @@
1
- namespace Sample.Application;
2
-
3
- // A partial class split across two files: both declarations are spans.
4
- public sealed partial class ReceiptPrinting
5
- {
6
- public string Header(int orderId) => $"Receipt {orderId}";
7
- }