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 instructions/sap-samples/hana-developer-cli-tool-example/database-client-implementationgit clone --depth 1 https://github.com/SAP-samples/hana-developer-cli-tool-exampleWhat 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.04558 | $0.04558 |
| Opus 5 | $0.02279 | $0.02279 |
| Sonnet 5 | $0.00912 | $0.00912 |
| Haiku 4.5 | $0.00456 | $0.00456 |
Grade A, and why
hana-developer-cli-tool-example database-client-implementation.instructions.md 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 yesterday.
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 — 713 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Database Client Implementation Guidelines
Use this guide when creating or modifying database client adapter files in the utils/database/ directory.
Scope and Purpose
This guide applies to database-specific client implementations that provide a unified interface for database operations across different database systems and connection modes:
index.js- Abstract base classdbClientClasshanaCDS.js- SAP HANA via CDS connectionhanaDirect.js- SAP HANA direct connection (non-CDS)postgres.js- PostgreSQL via CDS connectionsqlite.js- SQLite via CDS connection
Critical Principles
- Abstraction: All clients extend the abstract
dbClientClassbase class - Factory Pattern: Use static factory method for client instantiation
- Profile-Based: Support multiple connection profiles (CDS profiles)
- Lifecycle Management: Implement proper connect/disconnect patterns
- Error Handling: Provide database-specific error enrichment
- Type Safety: Use JSDoc and TypeScript annotations
- Credential Security: Handle credentials safely, never log passwords
- Graceful Degradation: Handle missing credentials and connection failures
Abstract Base Class Pattern
Base Class Structure: utils/database/index.js
import * as base from '../base.js'
import cds from '@sap/cds'
/**
* Database Client Abstract Super Class
* @class
* @constructor
* @public
* @classdesc Database Client Abstract Level
*/
export default class dbClientClass {
/**
* Prompts current value
* @type {typeof import("prompt")}
*/
#prompts
/**
* CDS connection options
* @type {Object}
*/
#optionsCDS
/**
* CDS connection object - returned from cds.connect.to or hdb module instance
* @type {Object}
*/
#db
/**
* Database Client type/flavor
* @type {String}
*/
#clientType = 'generic'
/**
* Create an instance of the database client
* @param {typeof import("prompt")} prompts - Input prompts current value
* @param {Object} [optionsCDS] - Optional CDS connection options
*/
constructor(prompts, optionsCDS) {
this.#prompts = prompts
this.#optionsCDS = optionsCDS
base.setPrompts(prompts)
base.debug(base.bundle.getText("debug.dbClientGenericProfile", [this.#prompts.profile]))
}
/**
* Static Factory Method to initialize the DB Client in your selected Flavor
* @param {object} prompts - Processed input prompts
* @returns {Promise<dbClientClass>} Flavor-specific DB client class instance
*/
static async getNewClient(prompts) {
let childClass = Object
if (!prompts.profile) {
// HANA Without CDS - Direct connection
prompts.profile = 'hybrid'
const { default: classAccess } = await import("./hanaDirect.js")
childClass = new classAccess(prompts)
} else {
// CDS based connectivity
process.env.CDS_ENV = prompts.profile
process.env.NODE_ENV = prompts.profile
let optionsCDS = cds.env.requires.db
if (!optionsCDS || !optionsCDS.kind) {
throw new Error(base.bundle.getText("error.cdsProjectMissing"))
}
// Load credentials from connections utility
const conn = await import("../connections.js")
const credentials = await conn.getConnOptions(prompts)
if (optionsCDS.kind === 'sqlite') {
if (credentials && credentials.sqlite) {
optionsCDS.credentials = credentials.sqlite
}
const { default: classAccess } = await import("./sqlite.js")
childClass = new classAccess(prompts, optionsCDS)
}
else if (optionsCDS.kind === 'postgres') {
if (credentials && credentials.postgres) {
optionsCDS.credentials = credentials.postgres
}
const { default: classAccess } = await import("./postgres.js")
childClass = new classAccess(prompts, optionsCDS)
}
else if (optionsCDS.kind === 'hana') {
if (credentials && credentials.hana) {
optionsCDS.credentials = credentials.hana
}
const { default: classAccess } = await import("./hanaCDS.js")
childClass = new classAccess(prompts, optionsCDS)
}
else {
throw new Error(base.bundle.getText("error.unsupportedDbClient", [optionsCDS.kind]))
}
}
return childClass
}
// Protected getters/setters
getDB() { return this.#db }
setDB(db) { this.#db = db }
getPrompts() { return this.#prompts }
getOptionsCDS() { return this.#optionsCDS }
/**
* Abstract method - must be implemented by child classes
* @returns {Promise<object>}
*/
async connect() {
throw new Error(base.bundle.getText("error.abstractMethod", ["connect"]))
}
/**
* Abstract method - must be implemented by child classes
* @returns {Promise<void>}
*/
async disconnect() {
throw new Error(base.bundle.getText("error.abstractMethod", ["disconnect"]))
}
/**
* Abstract method - must be implemented by child classes
* @returns {Promise<Array>}
*/
async listTables() {
throw new Error(base.bundle.getText("error.abstractMethod", ["listTables"]))
}
}
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.
- yesterday First seen · 713 lines · 4,558 tokens per session scan A f17f149eb930
hana-developer-cli-tool-example database-client-implementation.instructions.md is an instructions file published in the GitHub repository SAP-samples/hana-developer-cli-tool-example (109 stars, last pushed 6d ago), licensed Apache-2.0. It adds 4,558 tokens to every session, about $0.0228 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 instructions, from other repositories
rtk CLAUDE.md
Claude Code instructions for rtk-ai/rtk, covering claude.md, project overview, name collision warning, development commands and build & run.
rtk copilot-instructions.md
Copilot instructions for rtk-ai/rtk, covering copilot instructions for rtk, using rtk in this session, instead of: use, build, test & lint and pre-commit gate (must all pass before any pr).
awesome-vscode CLAUDE.md
Instructions for viatsko/awesome-vscode, covering claude.md, what this repo is, adding an entry, themes and linting / ci.
vscode-peacock AGENTS.md
Instructions for johnpapa/vscode-peacock, covering peacock — agent guide, project overview, repository structure, tech stack and build & run.
cs CLAUDE.md
Instructions for boyter/cs, covering claude.md, project overview, build & test commands, architecture and query pipeline (pkg/search/).
docs-mcp-server AGENTS.md
Instructions for arabold/docs-mcp-server, covering agent instructions for docs-mcp-server, repository context, development workflow, key commands and git workflow.