Parse the `type` field from `rbw list --raw` (Login, SecureNote, Card,
Identity) and display a corresponding icon for each entry in rofi.
History entries keep their `document-open-recent` icon. The type field
uses `compare=False` so it doesn't affect entry identity or history
matching.
The rofi callback's stdout is captured by rofi, so print() never
reached the terminal. Callback now writes the selection to a cache
file, and the initial process reads it after rofi exits — where
stdout is the terminal and the original args (including --print)
are available.
- Guard against empty ROFI_INFO before calling decode_info to prevent IndexError
- Use .get() chain for password field access to prevent KeyError
- Raise ValueError for unknown field names instead of silently returning empty string
- Validate config keybinding values against allowed fields (password, username, totp)
- Warn to stderr when config file exists but has invalid structure
- Set history file permissions to 0o600
- Extract shared prepare_entries() helper to deduplicate selector logic
- Add --version flag
- Delete legacy src/bitwarden.py and src/main.py
- Update CLAUDE.md to reflect pyyaml dependency
Replace --custom-field, --kb-accept, and --kb-custom CLI flags with a
YAML config file at $XDG_CONFIG_HOME/bw-menu/config.yaml. The config
maps rofi key names to vault fields (e.g. Return: password), making
keybinding configuration simpler and more intuitive.
Replace bw-serve/Ansible-based implementation with a clean rewrite:
- rbw CLI wrapper for listing entries and fetching credentials
- Rofi script-mode and fzf selectors with history-first sorting
- JSON-backed frecency history at ~/.cache/bw-menu/
- Clipboard support via wl-copy/xclip auto-detection
- uv + hatchling packaging with bw-menu entry point