feat(commands): introduce slash command registry and migrate existing commands #38

Merged
jasoncouture merged 3 commits from feat/slash-command-registry into main 2026-05-07 15:38:52 -04:00
jasoncouture commented 2026-05-07 11:38:37 -04:00 (Migrated from github.com)

Summary

Lifts slash-command metadata + dispatch out of ChatSession's switch statement and into a DI-populated registry. New public abstractions package (LlamaShears.Core.Abstractions.Commands) so plugins can ship their own /whatever commands once the package is on the feed. Migrates the four existing commands (/clear, /archive, /compact, /restart) onto the new shape.

Public surface (new package)

src/public/LlamaShears.Core.Abstractions.Commands/:

  • ISlashCommandName, Description, Parameters, Task<SlashCommandResult> ExecuteAsync(SlashCommandContext, CancellationToken).
  • ISlashCommandRegistry — DI-populated catalogue, Find(name) (case-insensitive) + Commands enumeration in registration order.
  • SlashCommandParameter — declared parameter metadata (name, description, required).
  • SlashCommandContext — per-invocation payload (agent id + positional ImmutableArray<string>).
  • SlashCommandResult — execution outcome with post-execute hints. Field is ContextChanged (general semantic — "the agent's context was modified, refresh the view") rather than something UI-specific like ResetBubbles so plugin authors aren't pinned to the chat surface.

Per the existing src/public/ rules: README included, packs under PR 4, builds with the README enforcement from PR 1.

Implementation (lives in Api.Web)

src/LlamaShears.Api.Web/Services/SlashCommands/:

  • SlashCommandRegistry — backs ISlashCommandRegistry. Frozen-dictionary lookup, ordering preserved.
  • ClearCommand / ArchiveCommand / CompactCommand — call straight into IAgentDirectory exactly the same way the old switch did. Clear/Archive return SlashCommandResult.ContextWasChanged.
  • RestartCommand — calls IHostRestarter.RequestRestart (introduced in PR #37).
  • SlashCommandsServiceCollectionExtensions.AddSlashCommands — wires the registry + the four shipped commands; called from AddWebUi.

ChatSession refactor

Gone: ChatCommand enum, TryParseCommand, the per-command switch in ExecuteCommandAsync. New TryDispatchSlashCommandAsync:

  1. Reject anything that doesn't start with /.
  2. Split the trimmed input on whitespace; first token is the command name, the rest become positional args.
  3. Look up in the registry; bail to "send as message" if no match.
  4. Build SlashCommandContext(agentId, args), await command.ExecuteAsync(...).
  5. If result.ContextChanged, call ResetBubbles.

Constructor swaps IHostRestarter (added in PR 7) for ISlashCommandRegistry. The restart plumbing now flows through RestartCommand.

Execution model is intentionally unchanged

Each command still calls straight into the existing service synchronously — exactly the same calls the old switch made. The "should ride the bus like ChannelMessage" refactor (per the project_command_requests_should_be_events memory) is explicitly out of scope and left for later.

Tests

5 new TUnit cases on SlashCommandRegistry:

  • FindReturnsRegisteredCommand
  • FindIsCaseInsensitive
  • FindReturnsNullWhenAbsent
  • FindReturnsNullForNullOrEmpty
  • CommandsPreservesRegistrationOrder

The four migrated commands continue to be exercised by the existing chat-session integration coverage.

Test plan

  • dotnet test --solution LlamaShears.slnx — 389 passing (was 384).
  • Husky dotnet-test-on-source-change pre-commit check passed.
  • Husky docs-api-up-to-date pre-push check passed (the new package's docs/api/ index regenerated cleanly).
  • src/public/Directory.Build.targets README enforcement (PR 1) green for the new package.

Stacking note

Targets feat/self-restart (PR #37). Will retarget main automatically as the chain merges.

🤖 Generated with Claude Code

## Summary Lifts slash-command metadata + dispatch out of `ChatSession`'s switch statement and into a DI-populated registry. New public abstractions package (`LlamaShears.Core.Abstractions.Commands`) so plugins can ship their own `/whatever` commands once the package is on the feed. Migrates the four existing commands (`/clear`, `/archive`, `/compact`, `/restart`) onto the new shape. ## Public surface (new package) `src/public/LlamaShears.Core.Abstractions.Commands/`: - **`ISlashCommand`** — `Name`, `Description`, `Parameters`, `Task<SlashCommandResult> ExecuteAsync(SlashCommandContext, CancellationToken)`. - **`ISlashCommandRegistry`** — DI-populated catalogue, `Find(name)` (case-insensitive) + `Commands` enumeration in registration order. - **`SlashCommandParameter`** — declared parameter metadata (name, description, required). - **`SlashCommandContext`** — per-invocation payload (agent id + positional `ImmutableArray<string>`). - **`SlashCommandResult`** — execution outcome with post-execute hints. Field is `ContextChanged` (general semantic — "the agent's context was modified, refresh the view") rather than something UI-specific like `ResetBubbles` so plugin authors aren't pinned to the chat surface. Per the existing `src/public/` rules: README included, packs under PR 4, builds with the README enforcement from PR 1. ## Implementation (lives in Api.Web) `src/LlamaShears.Api.Web/Services/SlashCommands/`: - **`SlashCommandRegistry`** — backs `ISlashCommandRegistry`. Frozen-dictionary lookup, ordering preserved. - **`ClearCommand`** / **`ArchiveCommand`** / **`CompactCommand`** — call straight into `IAgentDirectory` exactly the same way the old switch did. Clear/Archive return `SlashCommandResult.ContextWasChanged`. - **`RestartCommand`** — calls `IHostRestarter.RequestRestart` (introduced in PR #37). - **`SlashCommandsServiceCollectionExtensions.AddSlashCommands`** — wires the registry + the four shipped commands; called from `AddWebUi`. ## ChatSession refactor Gone: `ChatCommand` enum, `TryParseCommand`, the per-command switch in `ExecuteCommandAsync`. New `TryDispatchSlashCommandAsync`: 1. Reject anything that doesn't start with `/`. 2. Split the trimmed input on whitespace; first token is the command name, the rest become positional args. 3. Look up in the registry; bail to "send as message" if no match. 4. Build `SlashCommandContext(agentId, args)`, await `command.ExecuteAsync(...)`. 5. If `result.ContextChanged`, call `ResetBubbles`. Constructor swaps `IHostRestarter` (added in PR 7) for `ISlashCommandRegistry`. The restart plumbing now flows through `RestartCommand`. ## Execution model is intentionally unchanged Each command still calls straight into the existing service synchronously — exactly the same calls the old switch made. The "should ride the bus like ChannelMessage" refactor (per the `project_command_requests_should_be_events` memory) is explicitly out of scope and left for later. ## Tests 5 new TUnit cases on `SlashCommandRegistry`: - `FindReturnsRegisteredCommand` - `FindIsCaseInsensitive` - `FindReturnsNullWhenAbsent` - `FindReturnsNullForNullOrEmpty` - `CommandsPreservesRegistrationOrder` The four migrated commands continue to be exercised by the existing chat-session integration coverage. ## Test plan - [x] `dotnet test --solution LlamaShears.slnx` — 389 passing (was 384). - [x] Husky `dotnet-test-on-source-change` pre-commit check passed. - [x] Husky `docs-api-up-to-date` pre-push check passed (the new package's `docs/api/` index regenerated cleanly). - [x] `src/public/Directory.Build.targets` README enforcement (PR 1) green for the new package. ## Stacking note Targets `feat/self-restart` (PR #37). Will retarget `main` automatically as the chain merges. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
copilot-pull-request-reviewer[bot] (Migrated from github.com) reviewed 2026-05-07 11:44:00 -04:00
copilot-pull-request-reviewer[bot] (Migrated from github.com) left a comment

Pull request overview

Introduces a DI-backed slash-command registry and a new public abstractions package so hosts/plugins can define and dispatch /commands without ChatSession owning a hard-coded switch.

Changes:

  • Added new public package LlamaShears.Core.Abstractions.Commands defining ISlashCommand, ISlashCommandRegistry, and supporting context/result types.
  • Implemented a registry + migrated /clear, /archive, /compact, /restart into LlamaShears.Api.Web slash-command implementations and wired them into AddWebUi.
  • Refactored ChatSession to dispatch via the registry and added unit tests + generated API docs for the new package.

Reviewed changes

Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
tests/LlamaShears.UnitTests/Services/SlashCommands/SlashCommandRegistryTests.cs Adds unit coverage for registry lookup semantics and ordering.
src/public/LlamaShears.Core.Abstractions.Commands/SlashCommandResult.cs Defines the command execution result contract (e.g., ContextChanged).
src/public/LlamaShears.Core.Abstractions.Commands/SlashCommandParameter.cs Adds parameter metadata type for discovery/help.
src/public/LlamaShears.Core.Abstractions.Commands/SlashCommandContext.cs Adds invocation context (agent id + positional arguments).
src/public/LlamaShears.Core.Abstractions.Commands/README.md Provides package-level documentation required for public shipping.
src/public/LlamaShears.Core.Abstractions.Commands/LlamaShears.Core.Abstractions.Commands.csproj Introduces the new public packable project.
src/public/LlamaShears.Core.Abstractions.Commands/ISlashCommandRegistry.cs Defines the registry abstraction exposed to hosts/plugins.
src/public/LlamaShears.Core.Abstractions.Commands/ISlashCommand.cs Defines the command abstraction exposed to hosts/plugins.
src/LlamaShears.Api/Web/WebUiServiceCollectionExtensions.cs Wires slash-command services into the Web UI DI setup.
src/LlamaShears.Api.Web/Services/SlashCommands/SlashCommandsServiceCollectionExtensions.cs Adds DI registrations for registry + built-in commands.
src/LlamaShears.Api.Web/Services/SlashCommands/SlashCommandRegistry.cs Implements registry lookup + preserves registration order.
src/LlamaShears.Api.Web/Services/SlashCommands/RestartCommand.cs Implements /restart via IHostRestarter.
src/LlamaShears.Api.Web/Services/SlashCommands/CompactCommand.cs Implements /compact via IAgentDirectory.RequestCompactionAsync.
src/LlamaShears.Api.Web/Services/SlashCommands/ClearCommand.cs Implements /clear via IAgentDirectory.ClearAsync(archive:false).
src/LlamaShears.Api.Web/Services/SlashCommands/ArchiveCommand.cs Implements /archive via IAgentDirectory.ClearAsync(archive:true).
src/LlamaShears.Api.Web/Services/ChatSession.cs Replaces enum/switch command handling with registry-based dispatch.
src/LlamaShears.Api.Web/LlamaShears.Api.Web.csproj Adds reference to the new public commands abstractions project.
LlamaShears.slnx Adds the new public project to the solution.
docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/SlashCommandResult.md Generated API docs for SlashCommandResult.
docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/SlashCommandParameter.md Generated API docs for SlashCommandParameter.
docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/SlashCommandContext.md Generated API docs for SlashCommandContext.
docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/ISlashCommandRegistry.md Generated API docs for ISlashCommandRegistry.
docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/ISlashCommand.md Generated API docs for ISlashCommand.
docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/index.md Generated namespace index for the new commands package.
docs/api/LlamaShears.Core.Abstractions.Commands/index.md Generated package landing page for the new commands package.
docs/api/index.md Adds the new commands assembly to the API docs root index.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

## Pull request overview Introduces a DI-backed slash-command registry and a new public abstractions package so hosts/plugins can define and dispatch `/commands` without `ChatSession` owning a hard-coded switch. **Changes:** - Added new public package `LlamaShears.Core.Abstractions.Commands` defining `ISlashCommand`, `ISlashCommandRegistry`, and supporting context/result types. - Implemented a registry + migrated `/clear`, `/archive`, `/compact`, `/restart` into `LlamaShears.Api.Web` slash-command implementations and wired them into `AddWebUi`. - Refactored `ChatSession` to dispatch via the registry and added unit tests + generated API docs for the new package. ### Reviewed changes Copilot reviewed 26 out of 26 changed files in this pull request and generated 5 comments. <details> <summary>Show a summary per file</summary> | File | Description | | ---- | ----------- | | tests/LlamaShears.UnitTests/Services/SlashCommands/SlashCommandRegistryTests.cs | Adds unit coverage for registry lookup semantics and ordering. | | src/public/LlamaShears.Core.Abstractions.Commands/SlashCommandResult.cs | Defines the command execution result contract (e.g., `ContextChanged`). | | src/public/LlamaShears.Core.Abstractions.Commands/SlashCommandParameter.cs | Adds parameter metadata type for discovery/help. | | src/public/LlamaShears.Core.Abstractions.Commands/SlashCommandContext.cs | Adds invocation context (agent id + positional arguments). | | src/public/LlamaShears.Core.Abstractions.Commands/README.md | Provides package-level documentation required for public shipping. | | src/public/LlamaShears.Core.Abstractions.Commands/LlamaShears.Core.Abstractions.Commands.csproj | Introduces the new public packable project. | | src/public/LlamaShears.Core.Abstractions.Commands/ISlashCommandRegistry.cs | Defines the registry abstraction exposed to hosts/plugins. | | src/public/LlamaShears.Core.Abstractions.Commands/ISlashCommand.cs | Defines the command abstraction exposed to hosts/plugins. | | src/LlamaShears.Api/Web/WebUiServiceCollectionExtensions.cs | Wires slash-command services into the Web UI DI setup. | | src/LlamaShears.Api.Web/Services/SlashCommands/SlashCommandsServiceCollectionExtensions.cs | Adds DI registrations for registry + built-in commands. | | src/LlamaShears.Api.Web/Services/SlashCommands/SlashCommandRegistry.cs | Implements registry lookup + preserves registration order. | | src/LlamaShears.Api.Web/Services/SlashCommands/RestartCommand.cs | Implements `/restart` via `IHostRestarter`. | | src/LlamaShears.Api.Web/Services/SlashCommands/CompactCommand.cs | Implements `/compact` via `IAgentDirectory.RequestCompactionAsync`. | | src/LlamaShears.Api.Web/Services/SlashCommands/ClearCommand.cs | Implements `/clear` via `IAgentDirectory.ClearAsync(archive:false)`. | | src/LlamaShears.Api.Web/Services/SlashCommands/ArchiveCommand.cs | Implements `/archive` via `IAgentDirectory.ClearAsync(archive:true)`. | | src/LlamaShears.Api.Web/Services/ChatSession.cs | Replaces enum/switch command handling with registry-based dispatch. | | src/LlamaShears.Api.Web/LlamaShears.Api.Web.csproj | Adds reference to the new public commands abstractions project. | | LlamaShears.slnx | Adds the new public project to the solution. | | docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/SlashCommandResult.md | Generated API docs for `SlashCommandResult`. | | docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/SlashCommandParameter.md | Generated API docs for `SlashCommandParameter`. | | docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/SlashCommandContext.md | Generated API docs for `SlashCommandContext`. | | docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/ISlashCommandRegistry.md | Generated API docs for `ISlashCommandRegistry`. | | docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/ISlashCommand.md | Generated API docs for `ISlashCommand`. | | docs/api/LlamaShears.Core.Abstractions.Commands/LlamaShears/Core/Abstractions/Commands/index.md | Generated namespace index for the new commands package. | | docs/api/LlamaShears.Core.Abstractions.Commands/index.md | Generated package landing page for the new commands package. | | docs/api/index.md | Adds the new commands assembly to the API docs root index. | </details> --- 💡 <a href="/jasoncouture/llama-shears/new/feat/self-restart?filename=.github/instructions/*.instructions.md" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Add Copilot custom instructions</a> for smarter, more guided reviews. <a href="https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Learn how to get started</a>.
@ -481,25 +480,34 @@ public sealed class ChatSession :
Changed?.Invoke();
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-05-07 11:43:58 -04:00

TryDispatchSlashCommandAsync claims (per PR description) to split on whitespace, but this implementation only splits on the literal space character. That means inputs separated by tabs (common when pasting) or other whitespace won’t parse as expected (e.g. /cmd\targ). Consider splitting on all whitespace characters to match the intended behavior.

`TryDispatchSlashCommandAsync` claims (per PR description) to split on whitespace, but this implementation only splits on the literal space character. That means inputs separated by tabs (common when pasting) or other whitespace won’t parse as expected (e.g. `/cmd\targ`). Consider splitting on all whitespace characters to match the intended behavior.
@ -0,0 +1,20 @@
using System.Collections.Immutable;
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-05-07 11:43:59 -04:00

ToFrozenDictionary(c => c.Name, OrdinalIgnoreCase) will throw if two commands share the same name (including differing only by case), but the exception won’t identify which registrations conflicted. Since this is meant to be plugin-extensible, consider detecting duplicates up-front and throwing an error that lists the conflicting command names and implementation types to make misconfiguration easy to diagnose.

`ToFrozenDictionary(c => c.Name, OrdinalIgnoreCase)` will throw if two commands share the same name (including differing only by case), but the exception won’t identify which registrations conflicted. Since this is meant to be plugin-extensible, consider detecting duplicates up-front and throwing an error that lists the conflicting command names and implementation types to make misconfiguration easy to diagnose.
@ -0,0 +8,4 @@
private readonly ImmutableDictionary<string, ISlashCommand> _byName;
public SlashCommandRegistry(IEnumerable<ISlashCommand> commands)
{
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-05-07 11:43:58 -04:00

SlashCommandRegistry doesn’t guard against commands being null; if this is ever constructed outside DI (e.g., tests or custom wiring), [.. commands] will throw a less-informative exception. Consider an explicit ArgumentNullException.ThrowIfNull(commands) to fail fast with a clearer error.

`SlashCommandRegistry` doesn’t guard against `commands` being null; if this is ever constructed outside DI (e.g., tests or custom wiring), `[.. commands]` will throw a less-informative exception. Consider an explicit `ArgumentNullException.ThrowIfNull(commands)` to fail fast with a clearer error.
@ -0,0 +1,21 @@
using LlamaShears.Core.Abstractions.Commands;
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-05-07 11:43:59 -04:00

Registering ISlashCommandRegistry as a singleton means it will resolve and capture all ISlashCommand instances at container build time. This effectively forces commands to be singleton/transient-at-startup and will fail if a plugin registers an ISlashCommand as scoped (DI will reject scoped->singleton). Consider making the registry scoped (matching ChatSession) or changing the registry to resolve commands per-scope (and/or documenting that commands must be singleton-safe).

Registering `ISlashCommandRegistry` as a singleton means it will resolve and capture all `ISlashCommand` instances at container build time. This effectively forces commands to be singleton/transient-at-startup and will fail if a plugin registers an `ISlashCommand` as scoped (DI will reject scoped->singleton). Consider making the registry scoped (matching `ChatSession`) or changing the registry to resolve commands per-scope (and/or documenting that commands must be singleton-safe).
@ -0,0 +40,4 @@
public async Task FindReturnsNullForNullOrEmpty()
{
var registry = new SlashCommandRegistry([new StubCommand("/foo")]);
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-05-07 11:43:59 -04:00

Test name says it covers null or empty input, but it only asserts the empty-string case. Either add an explicit null case (e.g., registry.Find(null!)) or rename the test to only mention empty input so the intent matches the coverage.

Test name says it covers null or empty input, but it only asserts the empty-string case. Either add an explicit `null` case (e.g., `registry.Find(null!)`) or rename the test to only mention empty input so the intent matches the coverage.
github-actions[bot] commented 2026-05-07 15:26:50 -04:00 (Migrated from github.com)
Package Line Rate Branch Rate Complexity Health
LlamaShears.Core.Abstractions.Context 100% 100% 4
LlamaShears.Provider.Ollama 3% 1% 166
LlamaShears.IntegrationTests 87% 73% 71
LlamaShears.Core 46% 32% 873
LlamaShears.Core.Abstractions.Content 0% 100% 1
LlamaShears.Core.Abstractions.Caching 100% 100% 1
LlamaShears.Core.Eventing 96% 76% 51
StrangeSoft.Plugins.Host 20% 21% 87
LlamaShears.Core.Abstractions.Commands 50% 100% 3
LlamaShears.Core.Abstractions.Provider 32% 20% 66
LlamaShears.Core.Abstractions.Memory 0% 100% 3
LlamaShears.Api.Web 38% 21% 342
LlamaShears.Hosting 26% 8% 27
LlamaShears.Core.Abstractions.Events 21% 6% 79
LlamaShears.Core.Abstractions.SystemPrompt 100% 100% 2
LlamaShears 65% 25% 11
LlamaShears.Core.Abstractions.PromptContext 89% 100% 2
LlamaShears.Provider.Onnx.Embeddings 4% 0% 68
LlamaShears.Plugins.Host 34% 24% 36
LlamaShears.Core.Abstractions.Agent 73% 100% 11
LlamaShears.Api 11% 3% 342
LlamaShears.Plugins 0% 100% 1
LlamaShears.Core.Eventing.Extensions 100% 100% 1
LlamaShears.Core.Abstractions.Context 100% 100% 4
LlamaShears.Provider.Ollama 3% 1% 166
LlamaShears.Core 45% 31% 873
LlamaShears.Core.Abstractions.Content 0% 100% 1
LlamaShears.Core.Abstractions.Caching 100% 100% 1
LlamaShears.Core.Eventing 96% 76% 51
StrangeSoft.Plugins.Host 20% 21% 87
LlamaShears.Core.Abstractions.Commands 50% 100% 3
LlamaShears.Core.Abstractions.Provider 32% 20% 66
LlamaShears.Core.Abstractions.Memory 0% 100% 3
LlamaShears.Api.Web 25% 13% 342
LlamaShears.Hosting 26% 8% 27
LlamaShears.Core.Abstractions.Events 21% 6% 79
LlamaShears.Core.Abstractions.SystemPrompt 100% 100% 2
LlamaShears 65% 25% 11
LlamaShears.Core.Abstractions.PromptContext 89% 100% 2
LlamaShears.Provider.Onnx.Embeddings 4% 0% 68
LlamaShears.Plugins.Host 34% 24% 36
LlamaShears.Core.Abstractions.Agent 73% 100% 11
LlamaShears.Api 9% 1% 342
LlamaShears.Plugins 0% 100% 1
LlamaShears.Core.Eventing.Extensions 100% 100% 1
LlamaShears.Core.Abstractions.Context 100% 100% 4
LlamaShears.Provider.Ollama 44% 24% 166
LlamaShears.Core 47% 43% 873
LlamaShears.Core.Abstractions.Content 0% 100% 1
LlamaShears.Core.Abstractions.Caching 100% 100% 1
LlamaShears.Core.Eventing 93% 86% 51
LlamaShears.Core.Abstractions.Commands 0% 100% 3
LlamaShears.Core.Abstractions.Provider 78% 64% 66
LlamaShears.Core.Abstractions.Memory 100% 100% 3
LlamaShears.Api.Web 1% 1% 342
LlamaShears.Hosting 33% 21% 27
LlamaShears.Core.Abstractions.Events 15% 3% 79
LlamaShears.Core.Abstractions.SystemPrompt 100% 100% 2
LlamaShears.Core.Abstractions.PromptContext 89% 100% 2
LlamaShears.Provider.Onnx.Embeddings 33% 36% 68
LlamaShears.Core.Abstractions.Agent 86% 100% 11
LlamaShears.Api 27% 29% 342
LlamaShears.Core.Eventing.Extensions 100% 100% 1
LlamaShears.Analyzers 89% 76% 199
LlamaShears.Analyzers.CodeFixes 85% 69% 60
Summary 48% (8341 / 22399) 37% (1615 / 6145) 6726
Package | Line Rate | Branch Rate | Complexity | Health -------- | --------- | ----------- | ---------- | ------ LlamaShears.Core.Abstractions.Context | 100% | 100% | 4 | ✔ LlamaShears.Provider.Ollama | 3% | 1% | 166 | ❌ LlamaShears.IntegrationTests | 87% | 73% | 71 | ✔ LlamaShears.Core | 46% | 32% | 873 | ❌ LlamaShears.Core.Abstractions.Content | 0% | 100% | 1 | ❌ LlamaShears.Core.Abstractions.Caching | 100% | 100% | 1 | ✔ LlamaShears.Core.Eventing | 96% | 76% | 51 | ✔ StrangeSoft.Plugins.Host | 20% | 21% | 87 | ❌ LlamaShears.Core.Abstractions.Commands | 50% | 100% | 3 | ➖ LlamaShears.Core.Abstractions.Provider | 32% | 20% | 66 | ❌ LlamaShears.Core.Abstractions.Memory | 0% | 100% | 3 | ❌ LlamaShears.Api.Web | 38% | 21% | 342 | ❌ LlamaShears.Hosting | 26% | 8% | 27 | ❌ LlamaShears.Core.Abstractions.Events | 21% | 6% | 79 | ❌ LlamaShears.Core.Abstractions.SystemPrompt | 100% | 100% | 2 | ✔ LlamaShears | 65% | 25% | 11 | ➖ LlamaShears.Core.Abstractions.PromptContext | 89% | 100% | 2 | ✔ LlamaShears.Provider.Onnx.Embeddings | 4% | 0% | 68 | ❌ LlamaShears.Plugins.Host | 34% | 24% | 36 | ❌ LlamaShears.Core.Abstractions.Agent | 73% | 100% | 11 | ➖ LlamaShears.Api | 11% | 3% | 342 | ❌ LlamaShears.Plugins | 0% | 100% | 1 | ❌ LlamaShears.Core.Eventing.Extensions | 100% | 100% | 1 | ✔ LlamaShears.Core.Abstractions.Context | 100% | 100% | 4 | ✔ LlamaShears.Provider.Ollama | 3% | 1% | 166 | ❌ LlamaShears.Core | 45% | 31% | 873 | ❌ LlamaShears.Core.Abstractions.Content | 0% | 100% | 1 | ❌ LlamaShears.Core.Abstractions.Caching | 100% | 100% | 1 | ✔ LlamaShears.Core.Eventing | 96% | 76% | 51 | ✔ StrangeSoft.Plugins.Host | 20% | 21% | 87 | ❌ LlamaShears.Core.Abstractions.Commands | 50% | 100% | 3 | ➖ LlamaShears.Core.Abstractions.Provider | 32% | 20% | 66 | ❌ LlamaShears.Core.Abstractions.Memory | 0% | 100% | 3 | ❌ LlamaShears.Api.Web | 25% | 13% | 342 | ❌ LlamaShears.Hosting | 26% | 8% | 27 | ❌ LlamaShears.Core.Abstractions.Events | 21% | 6% | 79 | ❌ LlamaShears.Core.Abstractions.SystemPrompt | 100% | 100% | 2 | ✔ LlamaShears | 65% | 25% | 11 | ➖ LlamaShears.Core.Abstractions.PromptContext | 89% | 100% | 2 | ✔ LlamaShears.Provider.Onnx.Embeddings | 4% | 0% | 68 | ❌ LlamaShears.Plugins.Host | 34% | 24% | 36 | ❌ LlamaShears.Core.Abstractions.Agent | 73% | 100% | 11 | ➖ LlamaShears.Api | 9% | 1% | 342 | ❌ LlamaShears.Plugins | 0% | 100% | 1 | ❌ LlamaShears.Core.Eventing.Extensions | 100% | 100% | 1 | ✔ LlamaShears.Core.Abstractions.Context | 100% | 100% | 4 | ✔ LlamaShears.Provider.Ollama | 44% | 24% | 166 | ❌ LlamaShears.Core | 47% | 43% | 873 | ❌ LlamaShears.Core.Abstractions.Content | 0% | 100% | 1 | ❌ LlamaShears.Core.Abstractions.Caching | 100% | 100% | 1 | ✔ LlamaShears.Core.Eventing | 93% | 86% | 51 | ✔ LlamaShears.Core.Abstractions.Commands | 0% | 100% | 3 | ❌ LlamaShears.Core.Abstractions.Provider | 78% | 64% | 66 | ✔ LlamaShears.Core.Abstractions.Memory | 100% | 100% | 3 | ✔ LlamaShears.Api.Web | 1% | 1% | 342 | ❌ LlamaShears.Hosting | 33% | 21% | 27 | ❌ LlamaShears.Core.Abstractions.Events | 15% | 3% | 79 | ❌ LlamaShears.Core.Abstractions.SystemPrompt | 100% | 100% | 2 | ✔ LlamaShears.Core.Abstractions.PromptContext | 89% | 100% | 2 | ✔ LlamaShears.Provider.Onnx.Embeddings | 33% | 36% | 68 | ❌ LlamaShears.Core.Abstractions.Agent | 86% | 100% | 11 | ✔ LlamaShears.Api | 27% | 29% | 342 | ❌ LlamaShears.Core.Eventing.Extensions | 100% | 100% | 1 | ✔ LlamaShears.Analyzers | 89% | 76% | 199 | ✔ LlamaShears.Analyzers.CodeFixes | 85% | 69% | 60 | ✔ **Summary** | **48%** (8341 / 22399) | **37%** (1615 / 6145) | **6726** | ❌ <!-- Sticky Pull Request Commentcoverage -->
Sign in to join this conversation.
No description provided.