Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add thapaliyabikendra/ai-artifacts --skill bulk-operations-patternsgit clone --depth 1 https://github.com/thapaliyabikendra/ai-artifactsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/thapaliyabikendra/ai-artifacts/bulk-operations-patterns)<a href="https://agentmods.dev/skills/thapaliyabikendra/ai-artifacts/bulk-operations-patterns"><img src="https://agentmods.dev/badge/skills/thapaliyabikendra/ai-artifacts/bulk-operations-patterns/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/thapaliyabikendra/ai-artifacts/bulk-operations-patterns"><img src="https://agentmods.dev/badge/skills/thapaliyabikendra/ai-artifacts/bulk-operations-patterns.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00071 | $0.04191 |
| Opus 5 | $0.00036 | $0.02096 |
| Sonnet 5 | $0.00014 | $0.00838 |
| Haiku 4.5 | $0.00007 | $0.00419 |
Grade A, and why
bulk-operations-patterns scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 9d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 643 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Bulk Operations Patterns
Master bulk data operations including Excel import/export, batch processing, and efficient database operations in ABP Framework applications.
When to Use This Skill
- Implementing bulk import from Excel/CSV files
- Processing large datasets with validation
- Bulk database inserts/updates with
InsertManyAsync/UpdateManyAsync - File upload handling with blob storage
- Progress tracking for long-running operations
- Export data to Excel/CSV formats
Excel Import Pattern
1. DTO for Excel Import
// Application.Contracts/{EntityPlural}/BulkImport{Entity}Dto.cs
public class BulkImportProductDto
{
[ExcelColumnName("Product Code")]
public string ProductCode { get; set; }
[ExcelColumnName("Product Name")]
public string Name { get; set; }
[ExcelColumnName("Price")]
public string PriceText { get; set; } // String for validation
[ExcelColumnName("Stock")]
public string StockText { get; set; }
[ExcelColumnName("Category")]
public string CategoryName { get; set; }
// Parsed values (not from Excel)
[ExcelIgnore]
public decimal Price { get; set; }
[ExcelIgnore]
public int Stock { get; set; }
[ExcelIgnore]
public Guid? CategoryId { get; set; }
}
2. File Upload DTO
// Application.Contracts/{EntityPlural}/BulkImportFileDto.cs
public class BulkImportFileDto
{
[Required]
public IFormFile File { get; set; }
public bool ValidateOnly { get; set; } = false;
}
// Allowed extensions
public static class BulkImportFileExtensions
{
public static readonly string[] Allowed = { ".xlsx", ".xls", ".csv" };
public const long MaxFileSize = 10 * 1024 * 1024; // 10MB
}
3. AppService Implementation
public class ProductAppService : ApplicationService, IProductAppService
{
private readonly IRepository<Product, Guid> _productRepository;
private readonly IRepository<Category, Guid> _categoryRepository;
private readonly IBlobContainer<BulkImportFileContainer> _fileContainer;
private readonly ILogger<ProductAppService> _logger;
[Authorize(ProductPermissions.Products.Import)]
public async Task<BulkImportResultDto> BulkImportAsync(BulkImportFileDto input)
{
_logger.LogInformation(
"[{Service}] BulkImportAsync - Started - FileName: {FileName}",
nameof(ProductAppService), input.File.FileName);
// Step 1: Validate file
ValidateFile(input.File);
// Step 2: Parse Excel
var items = await ParseExcelAsync(input.File);
if (!items.Any())
{
throw new UserFriendlyException("No data found in file");
}
// Step 3: Load reference data
var categories = await _categoryRepository.GetListAsync();
// Step 4: Validate all rows
var validationErrors = await ValidateImportDataAsync(items, categories);
if (validationErrors.Any())
{
return new BulkImportResultDto
{
IsSuccess = false,
TotalRows = items.Count,
ErrorCount = validationErrors.Count,
Errors = validationErrors
};
}
if (input.ValidateOnly)
{
return new BulkImportResultDto
{
IsSuccess = true,
TotalRows = items.Count,
Message = "Validation passed. Ready to import."
};
}
// Step 5: Process import
var result = await ProcessImportAsync(items, categories);
_logger.LogInformation(
"[{Service}] BulkImportAsync - Completed - Imported: {Count}",
nameof(ProductAppService), result.SuccessCount);
return result;
}
private void ValidateFile(IFormFile file)
{
var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (!BulkImportFileExtensions.Allowed.Contains(extension))
{
throw new UserFriendlyException(
$"Invalid file type. Allowed: {string.Join(", ", BulkImportFileExtensions.Allowed)}");
}
if (file.Length > BulkImportFileExtensions.MaxFileSize)
{
throw new UserFriendlyException(
$"File size exceeds maximum allowed ({BulkImportFileExtensions.MaxFileSize / 1024 / 1024}MB)");
}
}
private async Task<List<BulkImportProductDto>> ParseExcelAsync(IFormFile file)
{
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
stream.Position = 0;
// Register encoding provider for older Excel formats
System.Text.Encoding.RegisterProvider(
System.Text.CodePagesEncodingProvider.Instance);
using var importer = new ExcelImporter(stream);
var sheet = importer.ReadSheet();
return sheet.ReadRows<BulkImportProductDto>()
.Where(x => !string.IsNullOrWhiteSpace(x.ProductCode))
.ToList();
}
private async Task<List<BulkImportErrorDto>> ValidateImportDataAsync(
List<BulkImportProductDto> items,
List<Category> categories)
{
var errors = new List<BulkImportErrorDto>();
var existingCodes = await GetExistingProductCodesAsync();
for (int i = 0; i < items.Count; i++)
{
var rowNumber = i + 2; // Excel row (1-based + header)
var item = items[i];
// Trim inputs
item.ProductCode = item.ProductCode?.Trim()?.ToUpperInvariant();
item.Name = item.Name?.Trim();
item.CategoryName = item.CategoryName?.Trim();
// Validate required fields
if (string.IsNullOrWhiteSpace(item.ProductCode))
{
errors.Add(new BulkImportErrorDto(rowNumber, "ProductCode", "Product Code is required"));
}
if (string.IsNullOrWhiteSpace(item.Name))
{
errors.Add(new BulkImportErrorDto(rowNumber, "Name", "Product Name is required"));
}
// Validate numeric fields
if (!decimal.TryParse(item.PriceText, out var price) || price < 0)
{
errors.Add(new BulkImportErrorDto(rowNumber, "Price", $"Invalid price: {item.PriceText}"));
}
else
{
item.Price = Math.Round(price, 2);
}
if (!int.TryParse(item.StockText, out var stock) || stock < 0)
{
errors.Add(new BulkImportErrorDto(rowNumber, "Stock", $"Invalid stock: {item.StockText}"));
}
else
{
item.Stock = stock;
}
// Validate duplicates within file
var duplicates = items
.Select((x, idx) => (Item: x, Index: idx))
.Where(x => x.Index != i &&
x.Item.ProductCode?.ToUpperInvariant() == item.ProductCode)
.Select(x => $"Row {x.Index + 2}");
if (duplicates.Any())
{
errors.Add(new BulkImportErrorDto(
rowNumber,
"ProductCode",
$"Duplicate in file: {string.Join(", ", duplicates)}"));
}
// Validate against existing data
if (existingCodes.Contains(item.ProductCode))
{
errors.Add(new BulkImportErrorDto(
rowNumber,
"ProductCode",
$"Product code already exists: {item.ProductCode}"));
}
// Validate category
if (!string.IsNullOrWhiteSpace(item.CategoryName))
{
var category = categories.FirstOrDefault(
c => c.Name.Equals(item.CategoryName, StringComparison.OrdinalIgnoreCase));
if (category == null)
{
errors.Add(new BulkImportErrorDto(
rowNumber,
"Category",
$"Category not found: {item.CategoryName}"));
}
else
{
item.CategoryId = category.Id;
}
}
}
return errors;
}
private async Task<HashSet<string>> GetExistingProductCodesAsync()
{
var codes = await _productRepository
.GetQueryableAsync()
.ContinueWith(q => q.Result
.Select(p => p.ProductCode.ToUpperInvariant())
.ToHashSet());
return codes;
}
private async Task<BulkImportResultDto> ProcessImportAsync(
List<BulkImportProductDto> items,
List<Category> categories)
{
var products = items.Select(item => new Product(
GuidGenerator.Create(),
item.ProductCode,
item.Name,
item.Price,
item.Stock)
{
CategoryId = item.CategoryId
}).ToList();
await _productRepository.InsertManyAsync(products);
return new BulkImportResultDto
{
IsSuccess = true,
TotalRows = items.Count,
SuccessCount = products.Count,
Message = $"Successfully imported {products.Count} products"
};
}
}
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 9d ago First seen · 643 lines · 71 tokens per session scan A 54ca7298dae6
bulk-operations-patterns is a skill published in the GitHub repository thapaliyabikendra/ai-artifacts (24 stars, last pushed 5mo ago), licensed Apache-2.0. It adds 71 tokens to every session and 4,191 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
xlsx
Read, create, and convert Microsoft Excel (.xlsx) and CSV spreadsheets — extract sheets and tables to JSON, build workbooks from JSON/CSV, and export to PDF.
csv-query
Run SQL queries against CSV/TSV/Excel files using Polars SQL engine.
data-clean
Clean a CSV/TSV/Excel file - fix headers, trim whitespace, remove duplicates, validate.
data-convert
Convert between CSV, TSV, Excel, JSONL, Parquet, and other tabular formats.
xlsx-engineer
You are the XLSX Engineering Specialist. You create, edit, analyze, and validate Excel spreadsheet files with professional formatting, working formulas, and zero errors.
agent-output-formats
Convert the canonical markdown+JSON deliverable of any SfSkills runtime agent into Excel, PDF, CSV, Notion card, ServiceNow ticket, or similar downstream format without adding dependencies to the consumer's project. NOT for an Agentforce action's output — use agentforce/agent-actions. NOT for exporting Salesforce data…