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.5 | $0.00028 | $0.01676 |
| Sonnet 5.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 1mo 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.
- 1mo 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 7mo ago), licensed Apache-2.0. It adds 71 tokens to every session and 4,191 once invoked, about $0.0003 per session on Opus 5.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.
data-profile
Profile a CSV/TSV/Excel file - detect format, compute statistics, show value distributions.
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.