chore: remove kbx-foundation-v36 reference (superseded by v4 implementation)

Removed entire kbx-foundation-v36 directory as it's been replaced by
the new KBX Foundation v4 patterns implemented in this session:
- Registry-driven screen definitions
- Density-aware UI adapter components
- Feature module templates (ShadowRun, Models)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 01:39:58 +09:00
parent 831c4b467d
commit c41e5063b7
1079 changed files with 13094 additions and 1134 deletions
@@ -0,0 +1,14 @@
using KBX.Shared.Workflow;
using Xunit;
namespace KBX.Shared.Workflow.Tests;
public sealed class WorkflowGuardTests
{
private static readonly WorkflowTransition[] Transitions = [
new("confirm", new HashSet<string>{"DRAFT"}, "CONFIRMED"),
new("cancel", new HashSet<string>{"DRAFT","CONFIRMED"}, "CANCELLED", ReasonRequired:true)
];
[Fact] public void Allows_declared_transition() => Assert.Equal("CONFIRMED", WorkflowGuard.RequireTransition(Transitions,"confirm","DRAFT").To);
[Fact] public void Rejects_transition_from_wrong_state() => Assert.Throws<InvalidOperationException>(() => WorkflowGuard.RequireTransition(Transitions,"confirm","CONFIRMED"));
[Fact] public void Requires_reason_when_declared() => Assert.Throws<InvalidOperationException>(() => WorkflowGuard.RequireTransition(Transitions,"cancel","DRAFT"));
}
@@ -0,0 +1,16 @@
namespace KBX.Shared.Workflow;
public sealed record WorkflowTransition(string Id, IReadOnlySet<string> From, string To, string? Permission = null, bool ReasonRequired = false);
public static class WorkflowGuard
{
public static WorkflowTransition RequireTransition(IEnumerable<WorkflowTransition> transitions, string transitionId, string currentState, string? reason = null)
{
var transition = transitions.FirstOrDefault(x => string.Equals(x.Id, transitionId, StringComparison.OrdinalIgnoreCase))
?? throw new InvalidOperationException($"Unknown transition: {transitionId}");
if (!transition.From.Contains(currentState)) throw new InvalidOperationException($"Transition {transitionId} is not allowed from {currentState}.");
if (transition.ReasonRequired && string.IsNullOrWhiteSpace(reason)) throw new InvalidOperationException("A reason is required for this transition.");
return transition;
}
}