Borrowing it
Nothing to install: this file belongs to SAP-samples/hana-developer-cli-tool-example. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/SAP-samples/hana-developer-cli-tool-example/main/.github/instructions/database-client-implementation.instructions.mdgit clone --depth 1 https://github.com/SAP-samples/hana-developer-cli-tool-exampleWrote 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/instructions/sap-samples/hana-developer-cli-tool-example/database-client-implementation)<a href="https://agentmods.dev/instructions/sap-samples/hana-developer-cli-tool-example/database-client-implementation"><img src="https://agentmods.dev/badge/instructions/sap-samples/hana-developer-cli-tool-example/database-client-implementation/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/instructions/sap-samples/hana-developer-cli-tool-example/database-client-implementation"><img src="https://agentmods.dev/badge/instructions/sap-samples/hana-developer-cli-tool-example/database-client-implementation.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.04558 | $0.04558 |
| Opus 5.5 | $0.01823 | $0.01823 |
| Sonnet 5.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 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 — 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.
- 1mo ago 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 (114 stars, last pushed 11d ago), licensed Apache-2.0. It adds 4,558 tokens to every session, about $0.0182 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 instructions, from other repositories
vscode buildNext.instructions.md
Working notes and architecture documentation for the new esbuild-based build system in build/next. Use when making changes to the new build pipeline (transpile/bundle commands, NLS plugin, source-map handling, resource copying, or self-hosting watch tasks).
next.js AGENTS.md
AGENTS.md instructions for vercel/next.js, covering next.js development guide, codebase structure, monorepo overview, core package: packages/next and other important packages.
vscode oss-third-party-notices.instructions.md
Instructions for microsoft/vscode, covering vs code oss third-party-notices pipeline, architecture, pipeline flow in ci, cache eligibility and rollout and applying the notice (cutover).
langchain AGENTS.md
AGENTS.md instructions for langchain-ai/langchain, covering global development guidelines for the langchain monorepo, corridor security analysis, project architecture and context, monorepo structure and development tools & commands.
vscode copilot-instructions.md
Copilot instructions for microsoft/vscode, covering vs code copilot instructions, project overview, root folders, core architecture (src/ folder) and built-in extensions (extensions/ folder).
deno copilot-instructions.md
Copilot instructions for denoland/deno, covering deno development guide for github copilot, network access, high level overview, key directories and key files to understand first.