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 agentmods add skills/softtor/nestjs-hexagonal/infrastructurenpx skills add Softtor/nestjs-hexagonal --skill infrastructuregit clone --depth 1 https://github.com/Softtor/nestjs-hexagonalWhat 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 | $0.00053 | $0.03023 |
| Opus 5 | $0.00026 | $0.01511 |
| Sonnet 5 | $0.00011 | $0.00605 |
| Haiku 4.5 | $0.00005 | $0.00302 |
Grade A, and why
infrastructure 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 2d 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 — 344 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Infrastructure Layer
Infrastructure wires the domain to the outside world: databases, event buses, HTTP frameworks, and external services. It is the only layer allowed to import NestJS decorators and Prisma.
Directory Structure
infrastructure/
├── <context>.module.ts # @Module wiring — exports ONLY port tokens
├── controllers/
│ ├── <context>.controller.ts
│ └── dtos/ # Request DTOs — class-validator lives here only
│ └── __tests__/
├── database/
│ ├── prisma/
│ │ ├── models/
│ │ │ └── <context>-model.mapper.ts # static toEntity() / toModel()
│ │ └── repositories/
│ │ ├── prisma-<context>.repository.ts
│ │ └── __tests__/
│ └── in-memory/
│ └── repositories/
│ └── <context>-in-memory.repository.ts # for unit tests
├── adapters/
│ └── <context>.adapter.ts # implements cross-module port interface
└── listeners/
└── <context>-created.handler.ts # @EventsHandler — side effects only
1. Prisma Repository
Pure persistence. No domain logic, no event dispatch.
// infrastructure/database/prisma/repositories/prisma-<context>.repository.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from '@/shared/infrastructure/database/prisma.service';
import { <Context>Entity } from '../../domain/entities/<context>.entity';
import type { <Context>Repository } from '../../domain/repositories/<context>.repository';
@Injectable()
export class Prisma<Context>Repository implements <Context>Repository.Repository {
sortableFields: string[] = ['name', 'createdAt'];
constructor(private readonly prisma: PrismaService) {}
async findById(id: string): Promise<<Context>Entity | null> {
const record = await this.prisma.<context>.findUnique({ where: { id } });
if (!record) return null;
return <Context>ModelMapper.toEntity(record);
}
async save(entity: <Context>Entity): Promise<void> {
const data = <Context>ModelMapper.toModel(entity);
const existing = await this.prisma.<context>.findUnique({ where: { id: entity.id } });
if (existing) {
await this.prisma.<context>.update({ where: { id: entity.id }, data });
} else {
await this.prisma.<context>.create({ data });
}
}
async search(
props: <Context>Repository.SearchParams,
): Promise<<Context>Repository.SearchResult> {
const sortable = this.sortableFields.includes(props.sort ?? '') || false;
const orderByField = sortable ? props.sort : 'createdAt';
const orderByDir = sortable ? props.sortDir : 'desc';
const whereClause: Record<string, unknown> = {
organizationId: props.filter?.organizationId,
};
if (typeof props.filter?.name === 'string') {
whereClause.name = { contains: props.filter.name, mode: 'insensitive' };
}
const [count, records] = await Promise.all([
this.prisma.<context>.count({ where: whereClause }),
this.prisma.<context>.findMany({
where: whereClause,
orderBy: { [orderByField]: orderByDir },
skip: props.page > 0 ? (props.page - 1) * props.perPage : 0,
take: props.perPage > 0 ? props.perPage : 15,
}),
]);
return new <Context>Repository.SearchResult({
items: records.map(<Context>ModelMapper.toEntity),
total: count,
currentPage: props.page,
perPage: props.perPage,
sort: orderByField,
sortDir: orderByDir,
filter: props.filter,
});
}
async delete(id: string, organizationId: string): Promise<void> {
await this.prisma.<context>.delete({ where: { id, organizationId } });
}
}
What ships with it
5 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
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.
- 2d ago First seen · 344 lines · 53 tokens per session scan A 40f367bc5d62
infrastructure is a skill published in the GitHub repository Softtor/nestjs-hexagonal (5 stars, last pushed 22d ago), licensed MIT. It adds 53 tokens to every session and 3,023 once invoked, about $0.0003 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-31.
Other skills, from other repositories
design-patterns
Full-spectrum Design Patterns skill: Detect anti-patterns in existing codebases, diagnose architectural debt, propose optimal patterns (GoF, SOLID, DDD, CQRS, Microservices, Cloud), and generate production-ready boilerplate code. Optimized for Next.js, FastAPI, NestJS, Django, Express, and Go.
clean-architecture
Implement Clean Architecture combined with CQRS for scalable NestJS applications.
new-skill
Scaffold a new brooks-lint analysis skill so it passes npm run validate and npm run evals on the first try — generates skills/{name}/SKILL.md (with the mandatory "Do NOT trigger for:" clause and a Process section citing guide step ranges) plus skills/{name}/{name}-guide.md (sequentially numbered steps), then appends…
brooks-sweep
Full-sweep mode: runs a unified analysis across all quality dimensions — code decay, architecture, tech debt, and test quality — then applies fixes directly to the codebase. Safe changes are auto-applied; risky changes are confirmed before execution. Drawing on twelve classic engineering books. Triggers when: user…
brooks-test
Test quality review drawing on twelve classic engineering books — with primary focus on xUnit Test Patterns, The Art of Unit Testing, How Google Tests Software, and Working Effectively with Legacy Code — that diagnoses structural problems in an existing test suite: brittleness, mock abuse, coverage illusions, slow…
frontend-conventions
Frontend convention reference (SvelteKit / Svelte 5). Auto-injected into frontend-aware agents - not user-invocable.