Scaffold the .sln and M0 project structure
Buildable skeleton matching docs/kernel-contract.md: - src/Engine.Kernel — the frozen kernel. Interfaces and data types only (World, Component, GameObject, Transform, ISchedule, IServiceRegistry, IEventBus, ILogger, IPlugin/IPluginContext, plugin.json and project.json manifest models). No PluginHost/Scheduler/World implementation yet — that's M0's actual work, not scaffolding. - src/Engine.Host — the CLI runtime entry point, placeholder for now. - plugins/sandbox.echo — a minimal two-assembly plugin (Contracts in Default ALC, implementation in collectible ALC) that exists only to exercise the reload loop end to end once PluginHost exists. - tests/Engine.Kernel.Tests, tests/Engine.ConformanceHarness — wired up with one Skip-marked placeholder test each, naming what M0 needs to make them real (including the 200-cycle ALC leak test from §4). The harness references the sandbox plugin with ReferenceOutputAssembly="false" so it loads it dynamically by path instead of linking its types into its own Default ALC. - samples/EmptyProject — a starter project.json. - Directory.Build.props centralizes shared settings across every project, including AllowUnsafeBlocks=false to enforce the §7 rule at the build level rather than by convention. Solution builds clean and `dotnet test` runs both placeholders as Skipped (not failing) — confirms the wiring, not the engine. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N1qPfzq8TDCUMFMV3UwV5N
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
using Engine.Kernel.World;
|
||||
|
||||
namespace Sandbox.Echo.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// Minimal component for exercising the reload loop described in
|
||||
/// docs/kernel-contract.md §7 — not a real engine feature, just something
|
||||
/// for a system to touch before any real plugin exists.
|
||||
/// </summary>
|
||||
public sealed class Ping : Component
|
||||
{
|
||||
public int Count;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\src\Engine.Kernel\Engine.Kernel.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,33 @@
|
||||
using Engine.Kernel.Plugins;
|
||||
using Engine.Kernel.Scheduling;
|
||||
using Engine.Kernel.World;
|
||||
using Sandbox.Echo.Contracts;
|
||||
|
||||
namespace Sandbox.Echo;
|
||||
|
||||
/// <summary>
|
||||
/// M0's test fixture. Exists only to exercise the reload loop end to end —
|
||||
/// edit, rebuild, ALC reload, headless run, dump — before any real
|
||||
/// subsystem exists to test it against. See M0 in docs/kernel-contract.md §8.
|
||||
/// </summary>
|
||||
public sealed class EchoPlugin : IPlugin
|
||||
{
|
||||
public void Configure(IPluginContext ctx)
|
||||
{
|
||||
ctx.Schedule.Add(Stage.Update, Tick)
|
||||
.Writes<Ping>();
|
||||
|
||||
ctx.Log.Info("sandbox.echo configured");
|
||||
}
|
||||
|
||||
public void Shutdown(IPluginContext ctx)
|
||||
{
|
||||
ctx.Schedule.RemoveAllFrom("sandbox.echo");
|
||||
}
|
||||
|
||||
static void Tick(IWorld world)
|
||||
{
|
||||
// TODO(M0): bump every Ping.Count by one. Placeholder until the
|
||||
// Scheduler actually exists to invoke this.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\src\Engine.Kernel\Engine.Kernel.csproj" />
|
||||
<ProjectReference Include="..\Sandbox.Echo.Contracts\Sandbox.Echo.Contracts.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"id": "sandbox.echo",
|
||||
"version": "0.0.1",
|
||||
"contracts": "Sandbox.Echo.Contracts.dll",
|
||||
"assembly": "Sandbox.Echo.dll",
|
||||
"dependsOn": {},
|
||||
"reloadable": true
|
||||
}
|
||||
Reference in New Issue
Block a user