Skip to content

Comments

Add Claude Code skills for Eventuous library users#495

Open
alexeyzimarev wants to merge 1 commit intodevfrom
alexey/claude
Open

Add Claude Code skills for Eventuous library users#495
alexeyzimarev wants to merge 1 commit intodevfrom
alexey/claude

Conversation

@alexeyzimarev
Copy link
Contributor

Summary

  • Add a core skill file (skills/eventuous.md) covering Eventuous domain model, command services (aggregate-based and functional), event serialization, stream naming, HTTP API patterns, subscriptions, producers, and DI registration
  • Add 9 infrastructure-specific skill files with progressive disclosure so users only load what's relevant to their stack:
    • eventuous-kurrentdb.md - KurrentDB/EventStoreDB event store, subscriptions, producer
    • eventuous-postgres.md - PostgreSQL event store, subscriptions, projections
    • eventuous-mongodb.md - MongoDB projections and checkpoint store
    • eventuous-sqlserver.md - SQL Server event store, subscriptions
    • eventuous-rabbitmq.md - RabbitMQ producer and subscription
    • eventuous-kafka.md - Kafka producer and subscription
    • eventuous-google-pubsub.md - Google Pub/Sub producer and subscription
    • eventuous-azure-servicebus.md - Azure Service Bus producer and subscription
    • eventuous-gateway.md - Event gateway for cross-context routing
  • Add CLAUDE.md with repository-level instructions for contributors

Test plan

  • Verify skill files render correctly as markdown
  • Spot-check code examples against actual API signatures
  • Test with Claude Code on a sample Eventuous project to confirm skills provide accurate guidance

🤖 Generated with Claude Code

Add a core skill file covering domain model, command services, persistence,
subscriptions, and HTTP API patterns, plus infrastructure-specific skill files
for KurrentDB, PostgreSQL, MongoDB, SQL Server, RabbitMQ, Kafka, Google Pub/Sub,
Azure Service Bus, and Gateway. Uses progressive disclosure so users only load
the infrastructure guides relevant to their stack.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@qodo-free-for-open-source-projects
Copy link
Contributor

Review Summary by Qodo

Add Claude Code skill files and CLAUDE.md for Eventuous library users

Grey Divider

Walkthroughs

Description
• Add CLAUDE.md with repository-level guidance for Claude Code contributors
• Add core skills/eventuous.md covering domain model, command services, serialization, HTTP API,
  subscriptions, producers, and DI patterns
• Add 9 infrastructure-specific skill files for KurrentDB, PostgreSQL, MongoDB, SQL Server,
  RabbitMQ, Kafka, Google Pub/Sub, Azure Service Bus, and Gateway
• Skill files use progressive disclosure so users load only infrastructure-relevant guides
Diagram
flowchart LR
  CLAUDE["CLAUDE.md\n(repo guidance)"]
  core["skills/eventuous.md\n(core skill)"]
  kurrentdb["eventuous-kurrentdb.md"]
  postgres["eventuous-postgres.md"]
  mongodb["eventuous-mongodb.md"]
  sqlserver["eventuous-sqlserver.md"]
  rabbitmq["eventuous-rabbitmq.md"]
  kafka["eventuous-kafka.md"]
  pubsub["eventuous-google-pubsub.md"]
  azure["eventuous-azure-servicebus.md"]
  gateway["eventuous-gateway.md"]
  core -- "references" --> kurrentdb
  core -- "references" --> postgres
  core -- "references" --> mongodb
  core -- "references" --> sqlserver
  core -- "references" --> rabbitmq
  core -- "references" --> kafka
  core -- "references" --> pubsub
  core -- "references" --> azure
  core -- "references" --> gateway
Loading

Grey Divider

File Changes

1. CLAUDE.md 📝 Documentation +132/-0

Repository-level Claude Code guidance for contributors

CLAUDE.md


2. skills/eventuous.md 📝 Documentation +427/-0

Core Eventuous skill file covering all major concepts

skills/eventuous.md


3. skills/eventuous-kurrentdb.md 📝 Documentation +269/-0

KurrentDB event store, subscriptions, and producer skill

skills/eventuous-kurrentdb.md


View more (8)
4. skills/eventuous-postgres.md 📝 Documentation +250/-0

PostgreSQL event store, subscriptions, and projections skill

skills/eventuous-postgres.md


5. skills/eventuous-mongodb.md 📝 Documentation +357/-0

MongoDB projections and checkpoint store skill file

skills/eventuous-mongodb.md


6. skills/eventuous-sqlserver.md 📝 Documentation +162/-0

SQL Server event store and subscriptions skill file

skills/eventuous-sqlserver.md


7. skills/eventuous-rabbitmq.md 📝 Documentation +282/-0

RabbitMQ producer and subscription skill file

skills/eventuous-rabbitmq.md


8. skills/eventuous-kafka.md 📝 Documentation +85/-0

Kafka producer and subscription skill file

skills/eventuous-kafka.md


9. skills/eventuous-google-pubsub.md 📝 Documentation +171/-0

Google Pub/Sub producer and subscription skill file

skills/eventuous-google-pubsub.md


10. skills/eventuous-azure-servicebus.md 📝 Documentation +180/-0

Azure Service Bus producer and subscription skill file

skills/eventuous-azure-servicebus.md


11. skills/eventuous-gateway.md 📝 Documentation +213/-0

Event gateway cross-context routing skill file

skills/eventuous-gateway.md


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link
Contributor

qodo-free-for-open-source-projects bot commented Feb 23, 2026

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Action required

1. RabbitMQ queue override misbind 🐞 Bug ✓ Correctness
Description
The new RabbitMQ skill file documents overriding the queue name via RabbitMqQueueOptions.Queue,
but the implementation binds the exchange to Options.SubscriptionId instead of the resolved queue
name, so overriding the queue will break consumption.
Code

skills/eventuous-rabbitmq.md[R123-129]

+| Property | Type | Default | Description |
+|----------|------|---------|-------------|
+| `Queue` | `string?` | `null` | Queue name; defaults to `SubscriptionId` if null |
+| `Durable` | `bool` | `true` | Survive broker restart |
+| `Exclusive` | `bool` | `false` | Exclusive to this connection |
+| `AutoDelete` | `bool` | `false` | Delete when last consumer disconnects |
+| `Arguments` | `IDictionary<string, object>?` | `null` | Additional queue arguments (e.g., dead-letter exchange) |
Evidence
The docs claim the queue name can be overridden, but RabbitMqSubscription declares the queue using
the override and then binds a different queue name (SubscriptionId), so messages won’t be routed to
the declared queue when QueueOptions.Queue is set.

skills/eventuous-rabbitmq.md[123-129]
src/RabbitMq/src/Eventuous.RabbitMq/Subscriptions/RabbitMqSubscription.cs[115-133]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
RabbitMQ subscription declares a queue using `QueueOptions.Queue ?? SubscriptionId`, but binds the exchange to `Options.SubscriptionId` instead of the declared queue. This breaks message delivery when users override the queue name (as suggested by the new skill docs).

## Issue Context
The PR adds docs that encourage using `RabbitMqQueueOptions.Queue` to override the queue name.

## Fix Focus Areas
- src/RabbitMq/src/Eventuous.RabbitMq/Subscriptions/RabbitMqSubscription.cs[115-133]
- skills/eventuous-rabbitmq.md[123-129]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Gateway GetOriginalStream broken 🐞 Bug ✓ Correctness
Description
The gateway skill file recommends ProducedMessageExtensions.GetOriginalStream(), but the
implementation retrieves the header as System.IO.Stream while the gateway stores StreamName, so
this method will always return null.
Code

skills/eventuous-gateway.md[R199-207]

+Access original context in a custom producer via `ProducedMessageExtensions`:
+```csharp
+message.GetOriginalStream()
+message.GetOriginalMessage()
+message.GetOriginalMetadata()
+message.GetOriginalStreamPosition()
+message.GetOriginalGlobalPosition()
+message.GetOriginalMessageId()
+message.GetOriginalMessageType()
Evidence
Gateway context metadata stores the original stream as context.Stream (a StreamName). The
extension method reads it back using Get<Stream> (implicit System.IO.Stream), which can never
match a stored StreamName, so callers following the new docs won’t be able to access the original
stream.

skills/eventuous-gateway.md[193-208]
src/Core/src/Eventuous.Subscriptions/Context/IMessageConsumeContext.cs[13-33]
src/Gateway/src/Eventuous.Gateway/GatewayMetaHelper.cs[15-24]
src/Gateway/src/Eventuous.Gateway/GatewayMetaHelper.cs[31-35]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`ProducedMessageExtensions.GetOriginalStream()` is effectively unusable: the gateway stores `OriginalStream` as `StreamName`, but the extension retrieves it as `System.IO.Stream`, so it returns null.

## Issue Context
The new gateway skill file explicitly recommends using `message.GetOriginalStream()`.

## Fix Focus Areas
- src/Gateway/src/Eventuous.Gateway/GatewayMetaHelper.cs[15-35]
- src/Core/src/Eventuous.Subscriptions/Context/IMessageConsumeContext.cs[13-33]
- skills/eventuous-gateway.md[193-208]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@github-actions
Copy link

Test Results

 57 files   57 suites   33m 4s ⏱️
291 tests 291 ✅ 0 💤 0 ❌
882 runs  882 ✅ 0 💤 0 ❌

Results for commit e2959cf.

Comment on lines +123 to +129
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| `Queue` | `string?` | `null` | Queue name; defaults to `SubscriptionId` if null |
| `Durable` | `bool` | `true` | Survive broker restart |
| `Exclusive` | `bool` | `false` | Exclusive to this connection |
| `AutoDelete` | `bool` | `false` | Delete when last consumer disconnects |
| `Arguments` | `IDictionary<string, object>?` | `null` | Additional queue arguments (e.g., dead-letter exchange) |

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Rabbitmq queue override misbind 🐞 Bug ✓ Correctness

The new RabbitMQ skill file documents overriding the queue name via RabbitMqQueueOptions.Queue,
but the implementation binds the exchange to Options.SubscriptionId instead of the resolved queue
name, so overriding the queue will break consumption.
Agent Prompt
## Issue description
RabbitMQ subscription declares a queue using `QueueOptions.Queue ?? SubscriptionId`, but binds the exchange to `Options.SubscriptionId` instead of the declared queue. This breaks message delivery when users override the queue name (as suggested by the new skill docs).

## Issue Context
The PR adds docs that encourage using `RabbitMqQueueOptions.Queue` to override the queue name.

## Fix Focus Areas
- src/RabbitMq/src/Eventuous.RabbitMq/Subscriptions/RabbitMqSubscription.cs[115-133]
- skills/eventuous-rabbitmq.md[123-129]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +199 to +207
Access original context in a custom producer via `ProducedMessageExtensions`:
```csharp
message.GetOriginalStream()
message.GetOriginalMessage()
message.GetOriginalMetadata()
message.GetOriginalStreamPosition()
message.GetOriginalGlobalPosition()
message.GetOriginalMessageId()
message.GetOriginalMessageType()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Gateway getoriginalstream broken 🐞 Bug ✓ Correctness

The gateway skill file recommends ProducedMessageExtensions.GetOriginalStream(), but the
implementation retrieves the header as System.IO.Stream while the gateway stores StreamName, so
this method will always return null.
Agent Prompt
## Issue description
`ProducedMessageExtensions.GetOriginalStream()` is effectively unusable: the gateway stores `OriginalStream` as `StreamName`, but the extension retrieves it as `System.IO.Stream`, so it returns null.

## Issue Context
The new gateway skill file explicitly recommends using `message.GetOriginalStream()`.

## Fix Focus Areas
- src/Gateway/src/Eventuous.Gateway/GatewayMetaHelper.cs[15-35]
- src/Core/src/Eventuous.Subscriptions/Context/IMessageConsumeContext.cs[13-33]
- skills/eventuous-gateway.md[193-208]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant