consulting-adrs
Check a design, change, pull request, plan, or threat model against Bitwarden's Architecture Decision Records (ADRs), or locate…
This skill should be used when the user asks to "find hardcoded secrets", "audit for credential leaks", "check for API keys in code", "review secret scanning alerts", "rotate a leaked secret", or needs to detect hardcoded credentials, review secret handling patterns, or
$ npx -y skills add bitwarden/ai-plugins --skill detecting-secrets --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/detecting-secretsContext preview
The summary Claude sees to decide when to auto-load this skill.
This skill should be used when the user asks to "find hardcoded secrets", "audit for credential leaks", "check for API keys in code", "review secret scanning alerts", "rotate a leaked secret", or needs to detect hardcoded credentials, review secret handling patterns, or
name: detecting-secrets description: This skill should be used when the user asks to "find hardcoded secrets", "audit for credential leaks", "check for API keys in code", "review secret scanning alerts", "rotate a leaked secret", or needs to detect hardcoded credentials, review secret handling patterns, or remediate exposed secrets.
Look for these categories of hardcoded secrets in code:
| Type | Example Patterns | | ------------------ | ----------------------------------------------------------------------------------------------------------------------- | | API Keys | `AKIA[0-9A-Z]{16}` (AWS), `AIza[0-9A-Za-z_-]{35}` (Google), strings assigned to variables named `*apiKey*`, `*api_key*` | | Connection Strings | `Server=...;Password=...`, `mongodb://user:pass@host`, `postgres://user:pass@host` | | Private Keys | `-----BEGIN RSA PRIVATE KEY-----`, `-----BEGIN OPENSSH PRIVATE KEY-----` | | Tokens | `ghp_[A-Za-z0-9]{36}` (GitHub PAT), `xoxb-` (Slack bot), `sk-` (OpenAI) | | Passwords | Values assigned to variables named `*password*`, `*passwd*`, `*secret*`, `*credential*` | | Certificates | PFX/P12 files with embedded passwords, PEM files with private keys |
Distinguish real secrets from false positives. Not every pattern match indicates an actual secret — consider context:
// NOT a real secret — test fixture with obvious fake value var testApiKey = "test-api-key-not-real-12345"; var mockPassword = "P@ssword123"; // Used only in unit tests // REAL secret — production-looking value in non-test code var apiKey = "sk-proj-abc123def456ghi789jkl012mno345pqr678stu901vwx";
**Decision criteria:**
// NOT a real secret — documented example
{
"apiKey": "YOUR_API_KEY_HERE"
}
// REAL secret — actual value in config
{
"apiKey": "sk-proj-abc123def456ghi789jkl012mno345pqr678stu901vwx"
}Search these locations when auditing for secrets:
| Location | What to Look For | | --------------------------------------------------- | ---------------------------------------------------------- | | `appsettings.json` / `appsettings.Development.json` | Connection strings, API keys, service credentials | | `.env` / `.env.local` | Environment variable definitions with real values | | `web.config` / `app.config` | Machine keys, connection strings | | `docker-compose.yml` / `Dockerfile` | `ENV` directives with credentials, build args with secrets | | CI/CD files (`.github/workflows/*.yml`) | Inline secrets instead of `${{ secrets.* }}` references | | Test seed scripts / migration files | Database passwords, service account credentials | | Comments and TODO notes | "Temporary" credentials left in comments | | Default parameter values | `function connect(password = "admin123")` | | Constants files | Centralized credential definitions |
# List all secret scanning alerts
gh api /repos/{owner}/{repo}/secret-scanning/alerts --jq '.[] | {number, state, secret_type, secret_type_display_name, created_at, push_protection_bypassed}'
# Get details for a specific alert
gh api /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}
# List alerts that bypassed push protection
gh api "/repos/{owner}/{repo}/secret-scanning/alerts?state=open" --jq '.[] | select(.push_protection_bypassed == true)'**Push protection** prevents commits containing detected secrets from being pushed. When someone bypasses push protection, the alert is flagged — review these with extra scrutiny.
When a secret is found in code, follow this sequence:
Assume any committed secret is compromised. Even if the repo is private, the secret may have been cached, logged, or accessed by CI/CD systems.
Replace the hardcoded secret with a secure reference:
// WRONG — hardcoded secret
var connectionString = "Server=prod.db;Password=s3cr3t!";
// CORRECT — environment variable
var connectionString = Environment.GetEnvironmentVariable("DB_CONNECTION_STRING");
// CORRECT — Azure Key Vault (Bitwarden's approach)
var connectionString = awaitA curated collection of plugins for AI-assisted development at Bitwarden. Enables discovery and distribution of quality-controlled plugins for use with Claude Code.
Check a design, change, pull request, plan, or threat model against Bitwarden's Architecture Decision Records (ADRs), or locate…
Use when the user provides a single Jira issue key and asks whether it is still relevant, still applicable, still pending, still…
File Jira work items that stand on their own, with real ticket titles, acceptance criteria in whatever field the target project…
Use whenever the user mentions a Jira issue key and wants more than a surface-level lookup — "Read PROJ-123", "What's PROJ-123…
Use when the user is addressing pull request review comments locally and asks for help evaluating, implementing, or drafting…
Use this skill to validate findings during a code review. For each finding, run the rejection criteria and verification checks.…