<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
  <channel xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <title>ABP.IO Stories</title>
    <link>https://abp.io/community/articles</link>
    <description>A hub for ABP Framework, .NET, and software development. Access articles, tutorials, news, and contribute to the ABP community.</description>
    <lastBuildDate>Fri, 30 Oct 2026 19:12:35 Z</lastBuildDate>
    <generator>Community - ABP.IO</generator>
    <image>
      <url>https://abp.io/assets/favicon.ico/favicon-32x32.png</url>
      <title>ABP.IO Stories</title>
      <link>https://abp.io/community/articles</link>
    </image>
    <a10:link rel="self" type="application/rss+xml" title="self" href="https://abp.io/community/rss?member=burakdemir" />
    <item>
      <guid isPermaLink="true">https://abp.io/community/posts/empowering-ai-agents-with-abp-framework-a-comprehensive-skill-collection-qccn87tu</guid>
      <link>https://abp.io/community/posts/empowering-ai-agents-with-abp-framework-a-comprehensive-skill-collection-qccn87tu</link>
      <a10:author>
        <a10:name>burakdemir</a10:name>
        <a10:uri>https://abp.io/community/members/burakdemir</a10:uri>
      </a10:author>
      <category>authorization</category>
      <category>ddd</category>
      <category>multi-tenancy</category>
      <category>abp-framework</category>
      <category>ai</category>
      <title>Empowering AI Agents with ABP Framework: A Comprehensive Skill Collection</title>
      <description>AI coding assistants don't know ABP Framework — until now. I built 34 open-source skill files (17 topics × 2 AI tools) that teach Claude Code and OpenCode to generate production-quality ABP v10.4 code with proper DDD patterns, authorization, validation, and multi-tenancy. Here's how it works and why it matters.</description>
      <pubDate>Wed, 27 May 2026 10:44:22 Z</pubDate>
      <a10:updated>2026-10-30T16:34:12Z</a10:updated>
      <content:encoded><![CDATA[<h1>Empowering AI Agents with ABP Framework: A Comprehensive Skill Collection</h1>
<blockquote>
<p>How I built 23 AI agent skills covering every aspect of ABP Framework v10.x (10.4–10.6) — and why it matters for the future of .NET development.</p>
</blockquote>
<p>🔗 <strong>GitHub:</strong> <a href="https://github.com/burakdmir/abp-skills">github.com/burakdmir/abp-skills</a></p>
<hr />
<h2>The Problem</h2>
<p>AI coding assistants like Claude Code and OpenCode are transforming how we write software. But they have a fundamental limitation: <strong>they don't know your framework</strong>.</p>
<p>When you ask an AI agent to &quot;create a new application service in ABP,&quot; it might generate something that looks reasonable but misses critical ABP patterns:</p>
<ul>
<li>No <code>ApplicationService</code> base class inheritance</li>
<li>Missing <code>[Authorize]</code> permission checks</li>
<li>Direct <code>DbContext</code> access instead of <code>IRepository</code></li>
<li>No UOW attribute</li>
<li>Manual DTO mapping instead of using the configured object mapper</li>
<li>Ignoring localization, validation, and exception handling conventions</li>
</ul>
<p>The result? Code that compiles but doesn't follow ABP best practices — and requires significant manual correction.</p>
<h2>The Solution: AI Agent Skills</h2>
<p>AI agents support <strong>skills</strong> — structured knowledge files that teach them specific frameworks, patterns, and conventions. When a skill is active, the AI's responses are grounded in real framework documentation instead of generic patterns.</p>
<p>I built <strong>abp-skills</strong> — a collection of 46 skill files (23 topics × 2 AI tools) covering every major aspect of ABP Framework v10.x (10.4–10.6).</p>
<p><strong>GitHub Repository:</strong> <a href="https://github.com/burakdmir/abp-skills">github.com/burakdmir/abp-skills</a></p>
<h2>What's Included</h2>
<p>The repository covers 23 ABP topics, each with two versions:</p>
<p>| # | Topic | What It Covers |
|---|---|---|
| 1 | <strong>Framework</strong> | Getting started, solution templates, project structure |
| 2 | <strong>DDD</strong> | Entities, aggregates, repositories, app services, DTOs, UOW, specifications |
| 3 | <strong>Modularity</strong> | Module system, DependsOn, lifecycle, plugin modules, modular monolith |
| 4 | <strong>EF Core</strong> | DbContext, repositories, migrations, PostgreSQL/MySQL/SQLite/Oracle |
| 5 | <strong>MongoDB</strong> | MongoDbContext, collections, indexes, transactions, replica set |
| 6 | <strong>Multi-Tenancy</strong> | Tenant resolvers, ICurrentTenant, IMultiTenant, database isolation |
| 7 | <strong>CLI</strong> | ABP CLI commands, new, add-package, build, new-package |
| 8 | <strong>UI</strong> | MVC/Razor Pages, Blazor, Angular, React, UI components |
| 9 | <strong>Infrastructure</strong> | Event Bus, Background Jobs, Caching, Redis, BLOB, Emailing, SignalR |
| 10 | <strong>API</strong> | API controllers, dynamic proxies, Swagger, versioning, dynamic clients |
| 11 | <strong>Authorization</strong> | Permission system, permission groups, resource-based auth, policies |
| 12 | <strong>Validation</strong> | DTO validation, Data Annotations, FluentValidation, IValidatableObject |
| 13 | <strong>Exception Handling</strong> | Error handling, RemoteServiceErrorResponse, HTTP status mapping |
| 14 | <strong>Localization</strong> | Localization resources, JSON files, culture fallback, L[] helper |
| 15 | <strong>Settings &amp; Features</strong> | ISettingProvider, ISettingManager, IFeatureChecker, feature toggles |
| 16 | <strong>Audit Logging</strong> | Audit logging, entity history, AbpAuditingOptions, IAuditingStore |
| 17 | <strong>Dependency Injection</strong> | DI, ITransientDependency, [Dependency], [ExposeServices], LazyServiceProvider, Autofac |
| 18 | <strong>Testing</strong> | Integration tests, *TestBase, SQLite in-memory, Shouldly, NSubstitute, data seeding |
| 19 | <strong>Microservices</strong> | Solution structure, Integration Services, distributed events (RabbitMQ), YARP gateway, OpenIddict |
| 20 | <strong>Object Mapping</strong> | IObjectMapper, Mapperly (default), AutoMapper profiles, entity↔DTO mapping |
| 21 | <strong>Development Flow</strong> | End-to-end entity flow: domain → migration → contracts → service → permission → test |
| 22 | <strong>Dependency Rules</strong> | Layer dependency direction, project reference matrix, architecture anti-patterns |
| 23 | <strong>Deployment</strong> | Clustered/stateless, distributed cache/lock, forwarded headers, SSL, OpenIddict prod, Docker/Helm |</p>
<p>Each topic has:</p>
<ul>
<li><strong>Claude Code version</strong> — Detailed (~210–850 lines) with full explanations, patterns, and best practices</li>
<li><strong>OpenCode version</strong> — Compact (~55–230 lines) as quick-reference for inline use</li>
</ul>
<h2>How It Works</h2>
<h3>Skill Activation</h3>
<p>Each skill file defines a <strong>Trigger</strong> section — keywords that tell the AI when to activate it:</p>
<pre><code class="language-markdown">## Trigger
- &quot;ABP authorization&quot;
- &quot;ABP permission&quot;
- &quot;ABP role&quot;
- &quot;ABP policy&quot;
</code></pre>
<p>When you mention any of these terms, the AI loads the full skill content and grounds its response in ABP-specific patterns.</p>
<h3>Example: Before vs After</h3>
<p><strong>Without the skill:</strong></p>
<pre><code class="language-csharp">// AI generates generic code
public class BookService
{
    private readonly AppDbContext _db;
    public async Task&lt;Book&gt; Create(Book book)
    {
        _db.Books.Add(book);
        await _db.SaveChangesAsync();
        return book;
    }
}
</code></pre>
<p><strong>With the ABP Authorization skill active:</strong></p>
<pre><code class="language-csharp">// AI generates ABP-conformant code
public class BookAppService : ApplicationService, IBookAppService
{
    private readonly IRepository&lt;Book, Guid&gt; _bookRepository;

    public BookAppService(IRepository&lt;Book, Guid&gt; bookRepository)
    {
        _bookRepository = bookRepository;
    }

    [Authorize(&quot;BookStore_Books_Create&quot;)]
    public async Task&lt;BookDto&gt; CreateAsync(CreateBookDto input)
    {
        var book = ObjectMapper.Map&lt;CreateBookDto, Book&gt;(input);
        return ObjectMapper.Map&lt;Book, BookDto&gt;(
            await _bookRepository.InsertAsync(book, autoSave: true)
        );
    }
}
</code></pre>
<p>The difference is night and day: proper base class, repository abstraction, permission check, object mapping, and UOW handling — all automatically.</p>
<h2>Installation</h2>
<h3>Claude Code Plugin — ABP Sensei (recommended)</h3>
<p>The <code>claude/</code> skills ship as a first-class Claude Code plugin named <strong><code>abp-sensei</code></strong>, distributed through this repo's plugin marketplace. One install gives you all 23 skills, an <code>abp-expert</code> subagent (a senior ABP v10.x architect that detects your solution's ABP version), and slash commands (<code>new-entity</code>, <code>crud</code>, <code>review</code>, <code>upgrade-audit</code>, <code>explain</code>):</p>
<pre><code class="language-bash"># 1. Add this repo as a plugin marketplace
/plugin marketplace add burakdmir/abp-skills

# 2. Install the plugin
/plugin install abp-sensei@abp-skills
</code></pre>
<p>New versions ship on every push to <code>main</code>; pull them with <code>/plugin marketplace update abp-skills</code> (or opt into <code>autoUpdate</code> in <code>settings.json</code>).</p>
<h3>Claude Code (manual clone)</h3>
<pre><code class="language-bash">git clone https://github.com/burakdmir/abp-skills.git ~/.claude/skills/abp-skills
</code></pre>
<h3>OpenCode</h3>
<pre><code class="language-bash">git clone https://github.com/burakdmir/abp-skills.git ~/.config/opencode/skills/abp-skills
</code></pre>
<h3>Per-Project</h3>
<p>Drop individual skill directories into your project's <code>.claude/skills/</code> or <code>.opencode/skills/</code> folder.</p>
<h2>Real-World Impact</h2>
<p>Here's what changes when AI agents have ABP skills:</p>
<h3>1. Faster Development Cycles</h3>
<p>No more explaining ABP conventions to the AI. It already knows that:</p>
<ul>
<li>Application services inherit from <code>ApplicationService</code></li>
<li>Repositories use <code>IRepository&lt;TEntity, TKey&gt;</code></li>
<li>Permissions are defined via <code>PermissionDefinitionProvider</code></li>
<li>Settings use <code>ISettingProvider</code> with a fallback chain</li>
</ul>
<h3>2. Consistent Code Quality</h3>
<p>Every generated snippet follows ABP patterns:</p>
<ul>
<li>Proper DDD layer separation</li>
<li>Correct dependency injection conventions</li>
<li>Standard exception handling and validation</li>
<li>Localization-ready code structure</li>
</ul>
<h3>3. Reduced Review Time</h3>
<p>Code generated with skills active requires less manual correction because:</p>
<ul>
<li>It uses the right base classes and interfaces</li>
<li>It includes authorization checks</li>
<li>It follows the options pattern for configuration</li>
<li>It respects multi-tenancy boundaries</li>
</ul>
<h3>4. Onboarding Acceleration</h3>
<p>New team members can use AI agents as ABP tutors:</p>
<ul>
<li>&quot;How do I create a new module in ABP?&quot;</li>
<li>&quot;What's the difference between ISettingProvider and ISettingManager?&quot;</li>
<li>&quot;How does the distributed event bus work?&quot;</li>
</ul>
<p>The AI answers with ABP-specific examples, not generic .NET patterns.</p>
<h2>Behind the Scenes</h2>
<h3>Methodology</h3>
<p>Every skill file is built from <strong>official ABP Framework v10.x documentation (10.4 baseline + the 10.5 migration guide)</strong>. I reviewed:</p>
<ul>
<li>36 module documentation files</li>
<li>8 framework subdirectories (api-development, architecture, data, fundamentals, infrastructure, real-time, ui)</li>
<li>7 tutorials (book-store, todo, modular-crm, microservice, mobile)</li>
<li>6 solution templates (single-layer, layered, microservice, MAUI, WPF, console, empty)</li>
<li>10 get-started guides</li>
</ul>
<h3>Design Decisions</h3>
<p><strong>Two versions per topic:</strong> Claude Code benefits from detailed explanations (the model has a large context window), while OpenCode's architecture prefers compact quick-reference files.</p>
<p><strong>Trigger-based activation:</strong> Skills should activate naturally when the user mentions relevant topics — no manual loading required.</p>
<p><strong>Production-ready examples:</strong> Every code snippet is copy-paste ready and follows ABP conventions exactly.</p>
<p><strong>Cross-references:</strong> Skills link to each other and to official ABP docs for deeper exploration.</p>
<h2>Contributing</h2>
<p>The repository is open source under the MIT License. Contributions are welcome:</p>
<ul>
<li><strong>New skills:</strong> Missing a topic? Open a <a href="https://github.com/burakdmir/abp-skills/issues/new?template=skill-request.md">skill request issue</a></li>
<li><strong>Updates:</strong> Found outdated information? Submit a PR</li>
<li><strong>Bug reports:</strong> Incorrect code examples? File a <a href="https://github.com/burakdmir/abp-skills/issues/new?template=bug-report.md">bug report</a></li>
</ul>
<p>See <a href="https://github.com/burakdmir/abp-skills/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a> for guidelines.</p>
<h2>What's Next</h2>
<p>The first 17 topics have since grown to <strong>23</strong> — Testing, Microservices, Object Mapping, Development Flow, Dependency Rules, and Deployment all shipped. The ABP ecosystem keeps evolving, so planned additions include:</p>
<ul>
<li><strong>ABP Studio integration</strong> skills for AI-assisted development workflows</li>
<li><strong>LeptonX theme</strong> customization skills</li>
<li><strong>Module-specific</strong> skills for Identity, Saas, CMS Kit, and other pre-built modules</li>
<li><strong>More slash commands</strong> for the ABP Sensei plugin</li>
</ul>
<h2>Conclusion</h2>
<p>AI coding agents are only as good as the context they have. By providing structured, framework-specific knowledge through skill files, we can transform generic AI output into production-quality ABP code.</p>
<p>This repository is a starting point — a proof that framework-specific AI skills work, and a foundation for the community to build upon.</p>
<p><strong>Star the repo, contribute, and let's make AI-assisted ABP development the norm, not the exception.</strong></p>
<p>🔗 <strong>GitHub:</strong> <a href="https://github.com/burakdmir/abp-skills">github.com/burakdmir/abp-skills</a></p>
<hr />
<p><em>Burak Demir — .NET Developer &amp; ABP Framework Enthusiast</em></p>
]]></content:encoded>
      <media:thumbnail url="https://abp.io/api/posts/cover-picture-source/3a217b35-e7f1-2bb7-b4d7-33be72ed9962" />
      <media:content url="https://abp.io/api/posts/cover-picture-source/3a217b35-e7f1-2bb7-b4d7-33be72ed9962" medium="image" />
    </item>
    <item>
      <guid isPermaLink="true">https://abp.io/community/posts/solving-mongodb-guid-issues-after-an-abp-framework-upgrade-tv8waw1n</guid>
      <link>https://abp.io/community/posts/solving-mongodb-guid-issues-after-an-abp-framework-upgrade-tv8waw1n</link>
      <a10:author>
        <a10:name>burakdemir</a10:name>
        <a10:uri>https://abp.io/community/members/burakdemir</a10:uri>
      </a10:author>
      <category>mongodb</category>
      <title>Solving MongoDB GUID Issues After an ABP Framework Upgrade</title>
      <description>So, you've just upgraded your ABP Framework application to a newer version (like v9.2.0+) and suddenly, your application can't read data from its MongoDB database. You're seeing strange deserialization errors, especially related to Guid types. What's going on?</description>
      <pubDate>Fri, 13 Jun 2025 05:36:55 Z</pubDate>
      <a10:updated>2026-10-30T12:53:55Z</a10:updated>
      <content:encoded><![CDATA[<h1>Solving MongoDB GUID Issues After an ABP Framework Upgrade</h1>
<p>So, you've just upgraded your ABP Framework application to a newer version (like v9.2.0+) and suddenly, your application can't read data from its MongoDB database. You're seeing strange deserialization errors, especially related to <code>Guid</code> types. What's going on?</p>
<p>You've likely run into a classic compatibility issue with the MongoDB .NET driver.</p>
<h3>The Problem: Legacy vs. Standard GUIDs</h3>
<p>Here's the short version:</p>
<ul>
<li><strong>Old MongoDB Drivers</strong> (used in older ABP versions) stored <code>Guid</code> values in a format called <code>CSharpLegacy</code>.</li>
<li><strong>New MongoDB Drivers</strong> (v3.0+), now default to a universal <code>Standard</code> format.</li>
</ul>
<p>When your newly upgraded app tries to read old data, the new driver expects the <code>Standard</code> format but finds <code>CSharpLegacy</code>. The byte orders don't match, and... boom. Deserialization fails.</p>
<p>The ABP Framework team has an excellent official guide covering this topic in detail. We highly recommend reading their <strong><a href="https://abp.io/docs/latest/release-info/migration-guides/MongoDB-Driver-2-to-3">MongoDB Driver 2 to 3 Migration Guide</a></strong> for a full understanding.</p>
<p>Our tip below serves as a fast, application-level fix if you need to get your system back online quickly without performing a full data migration.</p>
<h3>The Quick Fix: Tell the Driver to Use the Old Format</h3>
<p>Instead of changing your data, you can simply tell the new driver to continue using the old <code>CSharpLegacy</code> format for all <code>Guid</code> and <code>Guid?</code> properties. This provides immediate backward compatibility without touching your database.</p>
<p>It’s a simple, two-step process.</p>
<h4>Step 1: Create a Custom Convention</h4>
<p>First, create this class in your <code>.MongoDb</code> project. It tells the serializer how to handle <code>Guid</code> types.</p>
<pre><code class="language-csharp">using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Conventions;
using MongoDB.Bson.Serialization.Serializers;
using System;

public class LegacyGuidConvention : ConventionBase, IMemberMapConvention
{
    public void Apply(BsonMemberMap memberMap)
    {
        if (memberMap.MemberType == typeof(Guid))
        {
            memberMap.SetSerializer(new GuidSerializer(GuidRepresentation.CSharpLegacy));
        }
        else if (memberMap.MemberType == typeof(Guid?))
        {
            var guidSerializer = new GuidSerializer(GuidRepresentation.CSharpLegacy);
            var nullableGuidSerializer = new NullableSerializer&lt;Guid&gt;(guidSerializer);
            memberMap.SetSerializer(nullableGuidSerializer);
        }
    }
}
</code></pre>
<h4>Step 2: Register the Convention at Startup</h4>
<p>Now, register this convention in your <code>YourProjectMongoDbModule.cs</code> file. Add this code to the top of the <code>ConfigureServices</code> method. This ensures your rule is applied globally as soon as the application starts.</p>
<pre><code class="language-csharp">using Volo.Abp.Modularity;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Conventions;

public class YourProjectMongoDbModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        // Fix Start
        var conventionPack = new ConventionPack { new LegacyGuidConvention() };
        ConventionRegistry.Register(
            &quot;LegacyGuidConvention&quot;,
            conventionPack,
            t =&gt; true); // Apply to all types
        // Fix End

        // ... Your existing ConfigureServices code
    }
}
</code></pre>
<h3>An Alternative to Full Data Migration</h3>
<p>It's important to note that the method described here is an <strong>application-level fix</strong>. It's a fantastic alternative to performing a full data migration, which involves writing scripts to convert every legacy GUID in your database.</p>
<p>If you are interested in the more permanent, data-centric approach, the ABP.IO community has a detailed guide on <a href="https://abp.io/community/articles/migrating-mongodb-guids-from-legacy-to-standard-format-mongodb-v2-to-v3-dqwybdtw"><strong>Migrating MongoDB GUIDs from Legacy to Standard Format</strong></a>.</p>
<p>Our quick fix is ideal for getting a system back online fast or when a database migration is too complex. The full migration is better for long-term standards compliance. Choose the path that best fits your project's needs!</p>
<h3>That's It!</h3>
<p>Restart your application, and the errors should be gone. Your app can now correctly read its old <code>Guid</code> data, and it will continue to write new data in the same legacy format, ensuring consistency.</p>
<p>This approach is a lifesaver for existing projects, saving you from a risky and time-consuming data migration. For brand-new projects, you might consider starting with the <code>Standard</code> representation, but for everything else, this is a clean and effective fix. Happy coding!</p>
]]></content:encoded>
      <media:thumbnail url="https://abp.io/images/others/blank-cover-image-150_79.png" />
      <media:content url="https://abp.io/images/others/blank-cover-image-150_79.png" medium="image" />
    </item>
  </channel>
</rss>