Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Manages secrets and API keys in the macOS Keychain using the security CLI. Triggered when a user asks to store, retrieve, list, rotate, or delete tokens and credentials. Uses a consistent naming convention with the bbmisa account and uppercase service names. Never exposes secrets in plaintext output or commits them to git.
.claude/skills/0xjitsu-keychain-manager/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -1% | 0% |
Store, retrieve, list, rotate, and delete secrets in the macOS Keychain via the security CLI.
All entries use a consistent format:
bbmisa (always -a bbmisa)GITHUB_PERSONAL_ACCESS_TOKEN)This ensures secrets are easily discoverable and follow a predictable pattern.
bashsecurity add-generic-password -a bbmisa -s SERVICE_NAME -w "token_value"
To update an existing entry (overwrite):
bashsecurity add-generic-password -a bbmisa -s SERVICE_NAME -w "new_token_value" -U
The -U flag updates the password if the entry already exists.
bashsecurity find-generic-password -a bbmisa -s SERVICE_NAME -w
Returns only the password value to stdout. Use in scripts:
bashTOKEN=$(security find-generic-password -a bbmisa -s SERVICE_NAME -w 2>/dev/null)
Search by pattern:
bashsecurity dump-keychain | grep "svce" | grep -i "pattern"
List all Berna-managed secrets:
bashsecurity dump-keychain | grep -A4 '"acct"<blob>="bbmisa"' | grep "svce"
bashsecurity delete-generic-password -a bbmisa -s SERVICE_NAME
Follow this sequence — never delete before verifying the new value:
-Ubash# Step 1: Note old value exists security find-generic-password -a bbmisa -s SERVICE_NAME -w > /dev/null 2>&1 && echo "Old value exists" # Step 2: Update with new value security add-generic-password -a bbmisa -s SERVICE_NAME -w "new_token_value" -U # Step 3: Verify security find-generic-password -a bbmisa -s SERVICE_NAME -w
Add to ~/.zshrc for automatic environment variable export:
bashexport GITHUB_TOKEN="$(security find-generic-password -a bbmisa -s GITHUB_PERSONAL_ACCESS_TOKEN -w 2>/dev/null)" export HUGGINGFACE_TOKEN="$(security find-generic-password -a bbmisa -s HUGGINGFACE_TOKEN -w 2>/dev/null)" export FIRECRAWL_API_KEY="$(security find-generic-password -a bbmisa -s FIRECRAWL_API_KEY -w 2>/dev/null)"
The 2>/dev/null suppresses errors if the key does not exist, preventing shell startup noise.
These tokens are already stored and available:
| Service Name | Used For | |----------------------------------|-----------------------------| | HUGGINGFACE_TOKEN | HuggingFace Inference API | | FIRECRAWL_API_KEY | Firecrawl web scraping | | MEM0_API_KEY | Mem0 persistent AI memory | | DAYTONA_API_KEY | Daytona dev environments | | GITHUB_PERSONAL_ACCESS_TOKEN | GitHub API and CLI auth |
.env files with real values committed to git; use .env.example with placeholderssecurity find-generic-password output end up in git historySTRIPE_LIVE_SECRET_KEY not stripe)-a bbmisa flag — without it, entries are harder to find and may collide with system entriesWhen the user asks to verify a stored secret, display it masked:
bashTOKEN=$(security find-generic-password -a bbmisa -s SERVICE_NAME -w 2>/dev/null) echo "${TOKEN:0:4}****${TOKEN: -4}"
This shows ghp_****Ab1x — enough to confirm identity without exposing the full value.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 7,339 | 14,904 | +103% | 1 | 1 | 0% | 1,273 | 2,147 | +69% | 0 | 0 | — |
case-02 | fail→fail | 8,256 | 7,658 | -7% | 1 | 1 | 0% | 1,533 | 2,641 | +72% | 0 | 0 | — |
case-03 | fail→fail | 7,038 | 7,210 | +2% | 1 | 1 | 0% | 1,150 | 2,199 | +91% | 0 | 0 | — |
case-04 | fail→pass | 10,407 | 3,365 | -68% | 1 | 1 | 0% | 1,807 | 1,746 | -3% | 0 | 0 | — |
case-05 | fail→pass | 14,990 | 6,442 | -57% | 1 | 1 | 0% | 1,292 | 1,581 | +22% | 0 | 0 | — |
case-06 | fail→pass | 6,844 | 2,396 | -65% | 1 | 1 | 0% | 1,233 | 1,529 | +24% | 0 | 0 | — |
case-07 | fail→pass | 7,186 | 2,516 | -65% | 1 | 1 | 0% | 1,603 | 1,582 | -1% | 0 | 0 | — |
case-08 | fail→pass | 15,849 | 4,833 | -70% | 1 | 1 | 0% | 1,561 | 2,095 | +34% | 0 | 0 | — |
case-09 | fail→pass | 18,691 | 2,725 | -85% | 1 | 1 | 0% | 361 | 1,623 | +350% | 0 | 0 | — |
case-10 | fail→pass | 6,596 | 3,324 | -50% | 1 | 1 | 0% | 1,147 | 1,690 | +47% | 0 | 0 | — |
case-11 | fail→pass | 8,467 | 2,625 | -69% | 1 | 1 | 0% | 1,558 | 1,623 | +4% | 0 | 0 | — |
case-12 | fail→pass | 7,888 | 3,218 | -59% | 1 | 1 | 0% | 1,256 | 1,693 | +35% | 0 | 0 | — |
case-13 | fail→pass | 4,118 | 4,597 | +12% | 1 | 1 | 0% | 629 | 1,879 | +199% | 0 | 0 | — |
case-14 | fail→pass | 8,732 | 2,888 | -67% | 1 | 1 | 0% | 1,485 | 1,608 | +8% | 0 | 0 | — |
case-15 | fail→pass | 7,712 | 3,792 | -51% | 1 | 1 | 0% | 1,468 | 1,795 | +22% | 0 | 0 | — |
case-16 | fail→pass | 8,547 | 2,148 | -75% | 1 | 1 | 0% | 1,799 | 1,473 | -18% | 0 | 0 | — |
case-17 | fail→pass | 15,022 | 6,690 | -55% | 1 | 1 | 0% | 2,363 | 2,446 | +4% | 0 | 0 | — |
case-18 | fail→pass | 3,699 | 2,925 | -21% | 1 | 1 | 0% | 713 | 1,704 | +139% | 0 | 0 | — |
case-19 | pass→pass | 6,916 | 2,898 | -58% | 1 | 1 | 0% | 1,269 | 1,665 | +31% | 0 | 0 | — |
case-20 | pass→pass | 7,565 | 3,387 | -55% | 1 | 1 | 0% | 1,022 | 1,811 | +77% | 0 | 0 | — |
case-21 | pass→fail | 6,627 | 5,104 | -23% | 1 | 1 | 0% | 1,200 | 2,088 | +74% | 0 | 0 | — |
case-22 | pass→pass | 6,243 | 5,154 | -17% | 1 | 1 | 0% | 1,131 | 2,015 | +78% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +68 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/3/2026 | +59% |
Other measured skills in the registry, with their headline benchmark lift.