# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [2.6.0] - 2026-08-06

### Added
- Usage-based billing is now visible during a run: the plan and the spendable balance are stated when the session opens, and the balance is restated as it changes, so a decision is made with the current number in view rather than the one from the start of the run
- An account-level refusal now arrives as a code (`insufficient_funds`, `seed_limit_reached`, `table_limit_exceeded`) rather than only as prose, so the wording belongs to the client. The three differ in what can be done about them, and each is now told apart: only an oversized scope is fixable at the keyboard
- A refusal issued before the session starts is read off the abort's trailing metadata, which is the one channel that survives a stream that never yielded a message

### Changed
- The `subscription_limit` surface was removed. The field is reserved on the backend and the handler had stopped firing, so no plan or balance was shown and a refused scope came back as the same question with nothing said about why

### Fixed
- A run refused by the billing gate no longer loops until the answer timeout under `--scope`: auto-approve had been re-sending the scope the gate had just turned down
- A refused run now resolves to a failure instead of reporting `Seeded 0 tables` under a success tick and exiting zero. A run whose tables already held data still reports success
- A refusal is stated once in plain output instead of being printed again verbatim on the completion line
- The scoping agent's refinement questions are answered with an explicit skip instead of a free-text reply the agent cannot parse, which had made it re-ask, drop the refinement, and end the run with zero tables

## [2.5.1] - 2026-08-03

### Added
- The published npm manifest now carries an `mcpName` field identifying the MCP server as `st.seedfa/seedfast`. The official MCP registry reads this field to confirm that the npm package and the registry entry have the same owner. It is set only on the root `seedfast` package, since the per-platform binary packages are not MCP servers

## [2.5.0] - 2026-08-02

### Added
- `seedfast connect` now tells the backend that a database was connected, so the drop-off between signing up and the first seeding run is measurable. The connection string is masked before it leaves the machine: credentials are stripped from both the userinfo and the query string, and only the host, port, database name, server version, table count, platform and CLI version travel with the event. The call is best-effort — it is time-bounded, swallows every failure, and can neither block nor fail `connect`

## [2.4.4] - 2026-07-31

### Fixed
- npm package metadata: the published manifest now declares its MIT license, and `keywords` is a real list instead of a single comma-joined string. `mcp` was added to the list

## [2.4.3] - 2026-07-21

### Changed
- Project moved to the `seedfast-ai` GitHub organization: Homebrew tap is now `seedfast-ai/tap` (`brew install seedfast-ai/tap/seedfast`), the update checker polls the relocated tap, and npm package metadata points at the new repository. Existing installs keep working through GitHub redirects

## [2.4.2] - 2026-07-07

### Added
- Per-run verbose debug logging (`SEEDFAST_VERBOSE=1`) that writes a timestamped debug file for each seeding run to help diagnose stalled or disconnected large runs

### Fixed
- Large seeding runs no longer die around the 20-minute mark: mid-stream SQL sends are no longer gated on the local token TTL
- Stream disconnects now render as friendly, actionable errors instead of raw gRPC failures
- Premature stream EOF is treated as a run failure instead of a silent success
- Worker pool no longer stalls indefinitely: SQL execution time is bounded and execution timeouts widened to avoid false cancellations
- `Ctrl+C` stays responsive even while a send is stuck on a dead connection
- Shorter keepalive interval for faster stall detection
- SQL result and read scans are bounded by the gRPC message-size cap to prevent oversize sends that reset the connection

## [2.4.1] - 2026-06-27

### Added
- Client-side gRPC keepalive backstop that drops a dead connection instead of hanging, without requiring any server-side change

### Changed
- Raised the gRPC max message size to 256 MB in both directions to match the backend, so large scope/plan payloads are no longer rejected

### Fixed
- Serialized concurrent writes to the gRPC bidi stream to prevent intermittent `RST_STREAM` `PROTOCOL_ERROR` connection resets on large seeding runs

## [2.3.1] - 2026-04-23

### Changed
- Release pipeline migrated from GitHub Actions + GitHub Releases to a self-hosted ARM64 runner on AWS EC2 publishing archives to `download.seedfa.st` via nginx
- Homebrew tap formula URL rewritten to `https://download.seedfa.st/seedfast/<version>/<artifact>`
- Release workflows (`release.yml`, `release-mcp.yml`) now run on `[self-hosted, linux, ARM64, seedfast-builder]`
- NPM package publication no longer uses OIDC provenance

### Added
- Provisioning scripts under `scripts/aws/` for EC2 baseline, nginx/TLS, and runner setup
- `publish-to-webroot.sh` goreleaser hook for deploying archives to the nginx webroot

## [2.3.0] - 2026-04-15

### Added
- Adaptive throttler with write volume guard in the worker pool
- Multi-row INSERT support in ID column removal
- Inline textarea replaces the "Describe" option in the approve flow

### Changed
- Relaxed throttler limits to reduce over-throttling
- Unified update banner formatting via `FormatWarningNotice`
- Raised gRPC max receive message size to 32 MB

### Fixed
- Mark SQL as write by prefix when server omits `is_write`
- Spacing before suggestion lines in warnings
- Hide Yes/No buttons when warning-fix options are present

## [2.2.2] - 2026-03-30

### Fixed
- Format UUID `[16]byte` arrays as standard hyphenated strings in SQL responses
- Handle write operations (INSERT/UPDATE/DELETE) with RETURNING clauses
- Add network type OIDs (inet, cidr, macaddr) and harden UUID edge cases
- Send column type OIDs in SQL responses for proper type handling
- Upgrade grpc-go to v1.79.3 (CVE-2026-33186)

## [2.2.1] - 2026-03-22

### Fixed
- Updated all user-facing dashboard URLs from `dashboard.seedfa.st` to `seedfa.st/dashboard`

## [2.2.0] - 2026-03-20

### Added
- CI feedback loop with golangci-lint pre-commit hook and GitHub Actions linting step
- golangci-lint configuration (`.golangci.yml`) for consistent code quality

### Changed
- Manifest URL updated from `dashboard.seedfa.st` to `seedfa.st`
- Removed unused files: `cmd/seed_dev.go`, `cmd/seed_prod.go`, `cmd/seed_tui_prod.go`, `cmd/ui_helpers.go`, `internal/seeding/renderer.go`

### Fixed
- All golangci-lint errors resolved (errcheck, empty branches, gofmt formatting)

## [2.1.0] - 2026-03-09

### Added
- Bubble Tea TUI framework with phase-based architecture (plan, prompt, seeding, completion)
- Reusable TUI components: selector, text input, spinner, summary box, info banner
- TUI prompt and scope display wired into production orchestrator
- GitHub Actions CI workflow for automated build and test

### Changed
- Rewrite login, connect, dbinfo commands from pterm to Bubble Tea
- Replace pterm subscription display with lipgloss styling
- Replace emoji spinner with braille animation
- Migrate gRPC client to `grpc.NewClient` from deprecated `DialContext`
- Convert `TokenManager` to standalone functions
- Deduplicate API calls in seed workflow
- Extract shared helpers: `logging.IsVerbose()`, `auth.ExtractUserIdentifier()`, `dsn.ResolveRawFromSources()`
- Remove dead code: unused exports, `internal/secure` package, `ConnectWithTimeout` method

### Performance
- Parallelize HTTP calls in --version handler
- Add 24-hour throttle to update check HTTP calls
- Reduce allocations in MCP server and flag validation

### Fixed
- MCP connection test now uses real database connections
- Subscription limit display on every scope arrival
- Exit code 0 for friendly errors in seed command
- Update golang.org/x/crypto to v0.48.0

## [2.0.0] - 2026-02-21

### Added
- Large seeding support with scope control for million-row datasets
- New TUI framework for interactive terminal output
- Updated proto contract for large seeding operations

### Changed
- Updated gRPC bridge for large seeding protocol
- Improved warnings handling during seeding
- Enhanced CI/CD mode compatibility with large seeding feature
- User feedback echo during scope confirmation

## [1.27.0] - 2026-01-29

### Changed
- Updated documentation and architecture docs

### Fixed
- Dashboard link in MCP server

## [1.26.1] - 2026-01-26

### Changed
- Migrated MCP server to config-based API key authentication via environment variable
- Simplified MCP authentication flow by removing file-based token storage dependency

### Fixed
- Improved interactive renderer reliability

## [1.26.0] - 2026-01-24

### Added
- **MCP Server**: New `seedfast mcp` command for AI agent integration
  - `seedfast_doctor`: Check CLI installation and environment
  - `seedfast_auth_setup`: Configure API key authentication
  - `seedfast_connections_test`: Test database connection
  - `seedfast_plan`: Create seeding plan without execution
  - `seedfast_run`: Execute database seeding
  - `seedfast_run_status`: Get status of a seeding run
  - `seedfast_run_cancel`: Cancel a running seeding operation
  - File-based token storage in `~/.seedfast/mcp_token` for sandboxed environments

### Changed
- Documentation reorganized into structured folders (release, testing, ecosystem, development)
- Improved interactive renderer reliability

## [1.25.2] - 2026-01-12

### Changed
- Added support for typed proto Data parsing in event handlers (new format)
- Added HandleProto method to subscription_limit_handler for typed proto messages
- Maintains backwards compatibility with JSON parsing (legacy format) as fallback

## [1.25.1] - 2026-01-11

### Fixed
- Corrected proto contract to use CI/CD branch version (DataMessage, ProgressMessage, UIControlMessage)
- Removed legacy ConnectionInfo structure in favor of scope-based initialization
- Fixed bridge interface to use correct 3-argument Connect method

## [1.25.0] - 2026-01-11

### Added
- **CI/CD Integration**: Full support for non-interactive environments
  - `--scope` flag for predefined seeding scope with auto-approve
  - `--output` flag with `json` and `plain` modes for machine-readable output
  - `SEEDFAST_API_KEY` environment variable for API key authentication
  - Exit codes for CI/CD pipelines (0=success, 1=error, 2=auth error, 3=db error)
- **API Key Authentication**: Support for programmatic access without interactive login
- **Records Count Tracking**: Display total rows seeded in completion summary

### Changed
- Updated proto contract with typed messages (DataMessage, ProgressMessage, UIControlMessage)
- Improved table_done event to include records_count for accurate statistics
- Skip interactive UI elements (spinners, scope display) in CI/CD mode

### Documentation
- Added CI/CD testing infrastructure and workflows
- New documentation: GITHUB_ACTIONS_TESTING.md, TROUBLESHOOTING_CICD.md

## [1.24.11] - 2026-01-07

### Changed
- Made RemainingThisPeriod nullable in subscription limit info to support backend null values
- Skip displaying "Seedings remaining" line when backend sends null

## [1.24.10] - 2026-01-07

### Fixed
- Changed HTTP method from GET to POST for /api/cli/get-link endpoint to match backend API spec
- Fixed device login polling to treat "access token not found" as pending state instead of error

## [1.24.9] - 2025-12-30

### Fixed
- Synchronized proto contract with server master branch using simplified UIEvent structure
- Simplified gRPC client to forward UIEvent directly instead of complex message type conversions
- Added HTTP base URL metadata transmission for proper backend API callbacks in custom gRPC scenarios

## [1.24.8] - 2025-12-30

### Fixed
- Improved error messages in login command: now shows "Local backend server is not running" or "Could not connect to Seedfast server" instead of confusing "Authentication error" for network failures
- Fixed HTTP base URL preservation when overriding gRPC URL: custom gRPC endpoints now correctly maintain original HTTP API endpoints

## [1.24.7] - 2025-12-24

### Fixed
- Reverted proto definitions to version compatible with production server (master branch) to fix proto unmarshaling errors
- Proto contract on production server still uses UIEvent and ConnectionInfo structure
- Pending server implementation of feat/proto-contract-update branch with new typed messages

## [1.24.6] - 2025-12-24

### Fixed
- Attempted to synchronize gRPC proto contract with server's updated schema (reverted in v1.24.7 due to production server compatibility)

## [1.24.5] - 2025-12-24

### Fixed
- Fixed HTTP API base URL to use dashboard.seedfa.st instead of seedfa.st, fixing authentication endpoint access

## [1.24.4] - 2025-12-24

### Fixed
- Fixed WhoAmI to not return error when local auth state is unavailable, allowing login flow to continue

## [1.24.3] - 2025-12-24

### Fixed
- Fixed GoReleaser ldflags format to properly set version in binary during build

## [1.24.2] - 2025-12-24

### Fixed
- Fixed network error when fetching server configuration by updating endpoint URL to dashboard.seedfa.st
- Corrected manifest fetch endpoint to use new dashboard domain

## [1.24.1] - 2025-12-24

### Fixed
- Updated backend endpoint URL from seedfa.st to dashboard.seedfa.st for manifest and dashboard links

## [1.24.0] - 2025-11-28

### Added
- **Linux Keyring Support**: Seedfast now fully supports Linux keyring backends
  - Automatic detection and fallback chain: Secret Service → pass → File Storage
  - File Storage backend works everywhere (WSL, Docker, headless systems)
  - Support for XDG Base Directory specification
  - Environment variable override: `SEEDFAST_KEYRING_PASSWORD`
  - Comprehensive documentation: [docs/LINUX_KEYRING.md](docs/LINUX_KEYRING.md)
  - Machine ID detection from /etc/machine-id for deterministic encryption
  - Proper file permissions (0600 for files, 0700 for directories)

### Changed
- Updated Platform Support documentation to reflect Linux keyring capabilities
- Updated INSTALL.md with Linux keyring setup instructions
- Enhanced keychain manager to support Linux file-based storage

### Technical
- Added internal/keychain/manager_test.go with 5 comprehensive unit tests
- Added scripts/test_linux_keyring.sh for integration testing
- Thread-safe keychain operations with proper mutex protection

## [1.23.16] - 2025-11-23

### Changed
- Synchronized all npm package versions

## [1.23.15] - 2025-11-22

### Fixed
- Use CustomBackendURL for HTTP API regardless of gRPC config

## [1.23.14] - 2025-11-22

### Fixed
- Updated npm token with bypass 2FA for new package creation

## [1.23.13] - 2025-11-22

### Fixed
- Added token fallback for publishing new npm packages that don't have trusted publishers yet

## [1.23.12] - 2025-11-22

### Fixed
- Added repository URL to npm package.json for OIDC provenance verification

## [1.23.11] - 2025-11-22

### Fixed
- Updated Node.js to v24 and npm to latest for OIDC compatibility
- Added NPM_CONFIG_PROVENANCE environment variable

## [1.23.10] - 2025-11-22

### Fixed
- Fixed goreleaser-npm-publisher installation (use npx instead of go install)

## [1.23.9] - 2025-11-22

### Changed
- Switched to OIDC trusted publishing for npm packages (no tokens required)
- Increased delay between npm publishes to 15 seconds

## [1.23.8] - 2025-11-22

### Fixed
- Added manual npm publish step with 10-second delays between packages

## [1.23.7] - 2025-11-21

### Fixed
- Simplified npm publish workflow with continue-on-error

## [1.23.6] - 2025-11-21

### Fixed
- Increased npm publish retry delay to 120 seconds

## [1.23.5] - 2025-11-21

### Fixed
- Added retry logic for npm publish rate limiting

## [1.23.4] - 2025-11-21

### Fixed
- Republish after npm rate limit issues

## [1.23.3] - 2025-11-21

### Fixed
- Set project_name in goreleaser for correct npm package naming

## [1.23.2] - 2025-11-21

### Fixed
- npm publisher configuration fix

## [1.23.1] - 2025-11-21

### Fixed
- npm package name changed from `seedfast-cli` to `seedfast`

## [1.23.0] - 2025-11-21

### Added
- npm package distribution support for easy installation via `npm install -g seedfast`
- Platform-specific npm packages for optimized download sizes (~10 MB per platform)
- Automatic npm publication through GitHub Actions on release
- Support for npx usage without global installation

## [1.22.1] - 2025-11-15

### Added
- Comprehensive agent integration documentation (AGENT_INTEGRATION_GUIDE.md)

### Changed
- Updated gRPC protocol contract with improved event handling
- Enhanced subscription limit handling logic
- Improved gRPC client error handling and connection management

### Fixed
- Version numbering consistency across releases

## [1.22.0] - 2025-11-12

### Added
- Support for seeding replan when subscription limits exhausted
- Ability to provide feedback and retry seeding after adjustments

### Changed
- Improved UI handling when seeding is rejected or needs replanning
- Refactored endpoint management to remove outdated endpoints
- Enhanced error messages for DSN parsing in connect command
- Standardized error message format with "Please run" pattern
- All user-facing errors now display as normal text instead of error styling
- Authentication error messages now include helpful emojis for better UX

### Fixed
- Critical bug: CLI now sends real DSN to backend server correctly
- Improved error handling throughout the application
- Better stability in UI rendering during seeding process
- Removed usage of invalid endpoints in headers mapping

### Documentation
- Updated project documentation files
- Improved inline code documentation

## [1.21.4] - 2025-11-02

### Changed
- Simplified command descriptions to be user-friendly and non-technical
- Updated help text for all commands to focus on functionality rather than implementation
- Changed logout success message to "Your data has been cleared"

## [1.21.3] - 2025-11-02

### Fixed
- GitHub release workflow token configuration for proper Homebrew distribution
- Separated GITHUB_TOKEN (releases) and HOMEBREW_TAP_TOKEN (tap updates) for correct permissions
- Homebrew installation now works correctly with public repository

### Changed
- GoReleaser now uses HOMEBREW_TAP_TOKEN for updating homebrew-tap repository
- GitHub Actions workflow uses separate tokens for different purposes

## [1.21.2] - 2025-11-02

### Fixed
- User-friendly error messages for subscription and quota limit blocks
- Replace technical "Connection Lost" / "ResourceExhausted" errors with clear guidance
- Handle RESOURCE_EXHAUSTED gRPC errors with actionable next steps

### Changed
- Subscription errors now show "Unable to start seeding" with context-specific help
- Display direct links to activate subscription or upgrade plan when blocked
- Improved error handling for quota limits with monthly reset information

## [1.21.1] - 2025-11-01

### Added
- Masked DSN support in gRPC InitRequest message
- ConnectionInfo structure with parsed database connection details
- CancellationRequest message support for graceful interruption
- Comprehensive test coverage for credential masking

### Security
- Username and password now masked with `*` in DSN string before sending to backend
- ConnectionInfo credentials masked for secure transmission and logging
- All sensitive data protected in gRPC messages and logs

### Changed
- Proto files regenerated to include new DSN and ConnectionInfo fields
- gRPC client Init() method now sends both masked DSN and structured connection info
- Enhanced security for credential handling in transit

## [1.20.3] - 2025-10-30

### Added
- `DisableTLS` build-time parameter for localhost development
- Insecure gRPC connections support when `DisableTLS=true`
- Automatic port selection (50051 for insecure, 443 for TLS)

### Changed
- gRPC client now supports both secure and insecure connections
- TLS can be disabled via `-ldflags` for local backend testing

## [1.20.2] - 2025-10-29

### Changed
- Replace runtime flags with build-time parameters via `-ldflags`
- Custom endpoints now set at compile time instead of runtime
- Dev builds require `-ldflags` to set custom backend/gRPC URLs

### Removed
- Runtime flags `--backend-url` and `--grpc-url`
- `cmd/root_dev.go` and `cmd/root_prod.go` files

## [1.1.20] - 2025-10-23

### Added
- Display database connection info (masked DSN) at start of `seed` command
- Show database name and connection string with masked credentials
- Improved scope acceptance prompt with clear options (yes/no/feedback)

### Changed
- Enhanced user prompt for seeding scope with color-coded options
- Users can now see exactly which database they're seeding before starting
- Better guidance for accepting, rejecting, or providing feedback on scope

### Removed
- Removed Go test files from the project

## [1.1.6] - 2025-10-19

### Fixed
- **Critical**: Fix token corruption - never decode keys containing "token"
- Tokens that start with letter bytes (like 0x62='b') no longer incorrectly decoded
- `whoami` command now works correctly with proper access token

### Changed
- Key-name based decoding strategy: skip decode if key contains "token"
- Only decode non-token hex strings that start with JSON characters ({, [, ")
- More robust distinction between tokens and hex-encoded JSON data

## [1.1.5] - 2025-10-19

### Fixed
- **Critical**: Fix access tokens being corrupted by hex decoding on macOS 26.0
- Smart hex decoding - only decode if result starts with readable character (JSON, text)
- Access tokens and other hex strings now preserved as-is
- `whoami` command now correctly fetches user email from backend

### Changed
- Hex decoding only applies to JSON objects/arrays and text strings
- Tokens remain in their original hex string format

## [1.1.4] - 2025-10-19

### Fixed
- **Critical**: Fix auth state persistence on macOS 26.0 - decode hex-encoded keychain data
- macOS 26.0's `security find-generic-password -w` returns hex instead of plain text
- Auth state now correctly loads after login on macOS 26.0

### Added
- Automatic hex decoding for keychain data on macOS
- `isHexString()` helper to detect hex-encoded strings
- Verbose logging shows both hex and decoded values

## [1.1.3] - 2025-10-19

### Fixed
- **Critical**: Fix verbose mode not working - now checks SEEDFAST_VERBOSE dynamically
- Show raw keychain output to diagnose "invalid character 'b' after top-level value" error
- Verbose logging now actually appears when --verbose flag is used

### Added
- Display raw keychain data (first 100 chars) in verbose mode
- Show both raw and trimmed output from security command
- Hex dump of failed JSON data for debugging

## [1.1.2] - 2025-10-19

### Added
- Comprehensive verbose logging for macOS keychain debugging
- `--verbose` flag for `whoami`, `connect`, and `seed` commands
- Debug output shows auth state load/save flow step-by-step
- Environment variable `SEEDFAST_VERBOSE=1` enables verbose mode globally

### Changed
- Security backend (macOS) now logs all Set/Get/Delete operations in verbose mode
- Auth storage module logs all Load/Save operations with detailed state info
- Commands show auth.Load() errors when `--verbose` flag is used

## [1.1.1] - 2025-10-19

### Fixed
- Add error checking when saving auth state after login
- Show detailed error message if auth state save fails
- Add verbose logging for debugging auth state persistence issues
- Improve error messages in security_darwin.go to show which key failed

### Changed
- Login command now stops with error if auth.Save() fails (was silently ignored)
- Verbose mode (`--verbose`) shows auth state save progress for debugging

## [1.1.0] - 2025-10-19

### Fixed
- **Critical**: Fix auth state not persisting after login on macOS 26.0
- Handle "key not found" errors gracefully in LoadAuthState (treat as empty, not error)
- Fix `whoami` and `connect` commands showing "not logged in" after successful login
- Properly distinguish between "key doesn't exist yet" vs "real keychain error"

### Changed
- LoadAuthState returns nil (no data) instead of error when key doesn't exist
- Better error handling for first-run scenarios

## [1.0.9] - 2025-10-19

### Fixed
- **Critical**: Fix keychain on macOS 26.0 by using native `security` command directly
- Bypass keyring library which doesn't work on macOS 26.0
- Use macOS built-in security command for all keychain operations

### Changed
- macOS now uses `security` command directly (100% compatible with all macOS versions)
- No external dependencies required - works out of the box
- Windows continues using keyring library with WinCredBackend

## [1.0.8] - 2025-10-19

### Fixed
- Add PassBackend support for macOS 26.0 where native Keychain API is unavailable
- Provide clear error message with installation instructions for 'pass' utility
- Fix "No directory provided for file keyring" error on macOS 26.0

### Added
- Support for 'pass' (password store) as secure alternative on macOS 26.0+
- Helpful error message: install pass with `brew install pass gnupg`

### Changed
- macOS backend priority: Keychain first, then pass (both are secure)
- No file-based storage fallback - only encrypted backends

## [1.0.7] - 2025-10-19

### Fixed
- Fix "Specified keyring backend not available" on macOS 26.0 and newer
- Remove hardcoded AllowedBackends restriction to support future macOS versions
- Let keyring library automatically select best available backend

### Changed
- Keyring now adapts to platform-specific backends automatically
- Better compatibility with macOS updates

## [1.0.6] - 2025-10-19

### Fixed
- Fix infinite polling loop when authentication errors occur during login
- Stop silently ignoring errors in `PollLogin` during device authorization
- Display authentication errors immediately instead of continuing to poll

### Added
- Add `--verbose` flag to `login` command for debugging authentication issues
- Show device ID, poll interval, and polling status in verbose mode
- Better error messages when authentication fails

### Changed
- Login command now fails fast when errors occur instead of infinite polling
- Improved debugging experience for authentication troubleshooting

## [1.0.5] - 2025-10-19

### Fixed
- **Critical**: Replace all `MustGetManager()` calls with graceful `GetManager()` error handling
- Fix panic "Specified keyring backend not available" on unsupported platforms (e.g., Linux, MSYS)
- Add proper error handling in all 17 keychain access points across 8 files:
  - `cmd/login.go`: Handle keychain errors during login timeout cleanup
  - `cmd/connect.go`: Display user-friendly message when keychain unavailable
  - `cmd/logout.go`: Gracefully handle keychain errors during logout
  - `cmd/seed.go`: Handle keychain errors when loading DSN and access token
  - `internal/auth/storage.go`: Add error handling for Load/Save/Clear operations
  - `internal/auth/service.go`: Fix 11 keychain calls in auth service methods
- Improve error messages for unsupported platforms (Linux, MSYS/Git Bash on Windows)
- Preserve `MustGetManager()` function for backward compatibility (no longer used internally)

### Changed
- All keychain operations now return errors instead of panicking
- Better UX: informative error messages instead of crashes on unsupported systems

## [1.0.4] - 2025-10-19

### Fixed
- Fix nil pointer dereference in keychain manager after failed initialization
- Replace sync.Once with mutex to allow retry on initialization failure
- Properly handle keychain initialization errors during login flow

## [1.0.3] - 2025-10-19

### Fixed
- Fix keychain initialization panic on first run
- Replace `MustGetManager()` with `GetManager()` for graceful error handling
- Properly initialize keychain before saving tokens during login

## [1.0.2] - 2025-10-19

### Changed
- ⚠️ **Deprecated**: This version introduced an insecure encrypted file storage fallback
- Please upgrade to v1.0.3 which properly fixes the keychain initialization issue

## [1.0.1] - 2025-10-19

### Fixed
- Add `-trimpath` flag to remove absolute build paths from binaries
- Fixes panic with keychain on macOS when using bottles from GitHub Releases

## [1.0.0] - 2025-10-19

### Added
- Initial release of Seedfast CLI
- `seedfast login` command for OAuth-style device flow authentication
- `seedfast connect` command for PostgreSQL database connection configuration
- `seedfast seed` command for AI-powered database seeding
- `seedfast whoami` command to check current authentication status
- `seedfast logout` command to clear stored credentials
- `seedfast version` command to display CLI and backend versions
- OS-level keychain integration for secure credential storage (macOS Keychain, Windows Credential Manager)
- gRPC bidirectional streaming for real-time backend communication
- Interactive terminal UI with spinners and real-time progress tracking
- Concurrent SQL execution with configurable worker pool (4 workers)
- Automatic schema detection and relationship handling
- Support for macOS (Intel & Apple Silicon), Linux, and Windows
- Homebrew tap for easy installation on macOS
- MIT License
- Comprehensive README documentation
- GoReleaser configuration for automated releases

### Technical
- Static binary compilation (`CGO_ENABLED=0`) - no C dependencies required
- Pre-compiled bottles for Homebrew to avoid Xcode/CLT requirement
- pgx v5 PostgreSQL driver for efficient database operations
- Cobra framework for CLI structure
- pterm for rich terminal output
- Secure token storage using OS native keychains

[Unreleased]: https://github.com/argon-it/seedfast-cli/compare/v2.2.0...HEAD
[2.2.0]: https://github.com/argon-it/seedfast-cli/compare/v2.1.0...v2.2.0
[2.1.0]: https://github.com/argon-it/seedfast-cli/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/argon-it/seedfast-cli/compare/v1.27.0...v2.0.0
[1.27.0]: https://github.com/argon-it/seedfast-cli/compare/v1.26.1...v1.27.0
[1.26.1]: https://github.com/argon-it/seedfast-cli/compare/v1.26.0...v1.26.1
[1.26.0]: https://github.com/argon-it/seedfast-cli/compare/v1.25.2...v1.26.0
[1.25.2]: https://github.com/argon-it/seedfast-cli/compare/v1.25.1...v1.25.2
[1.25.1]: https://github.com/argon-it/seedfast-cli/compare/v1.25.0...v1.25.1
[1.25.0]: https://github.com/argon-it/seedfast-cli/compare/v1.24.11...v1.25.0
[1.24.11]: https://github.com/argon-it/seedfast-cli/compare/v1.24.10...v1.24.11
[1.24.10]: https://github.com/argon-it/seedfast-cli/compare/v1.24.9...v1.24.10
[1.24.9]: https://github.com/argon-it/seedfast-cli/compare/v1.24.8...v1.24.9
[1.24.8]: https://github.com/argon-it/seedfast-cli/compare/v1.24.7...v1.24.8
[1.24.7]: https://github.com/argon-it/seedfast-cli/compare/v1.24.6...v1.24.7
[1.24.6]: https://github.com/argon-it/seedfast-cli/compare/v1.24.5...v1.24.6
[1.24.5]: https://github.com/argon-it/seedfast-cli/compare/v1.24.4...v1.24.5
[1.24.4]: https://github.com/argon-it/seedfast-cli/compare/v1.24.3...v1.24.4
[1.24.3]: https://github.com/argon-it/seedfast-cli/compare/v1.24.2...v1.24.3
[1.24.2]: https://github.com/argon-it/seedfast-cli/compare/v1.24.1...v1.24.2
[1.24.1]: https://github.com/argon-it/seedfast-cli/compare/v1.24.0...v1.24.1
[1.24.0]: https://github.com/argon-it/seedfast-cli/compare/v1.23.16...v1.24.0
[1.23.8]: https://github.com/argon-it/seedfast-cli/compare/v1.23.7...v1.23.8
[1.23.7]: https://github.com/argon-it/seedfast-cli/compare/v1.23.6...v1.23.7
[1.23.6]: https://github.com/argon-it/seedfast-cli/compare/v1.23.5...v1.23.6
[1.23.5]: https://github.com/argon-it/seedfast-cli/compare/v1.23.4...v1.23.5
[1.23.4]: https://github.com/argon-it/seedfast-cli/compare/v1.23.3...v1.23.4
[1.23.3]: https://github.com/argon-it/seedfast-cli/compare/v1.23.2...v1.23.3
[1.23.2]: https://github.com/argon-it/seedfast-cli/compare/v1.23.1...v1.23.2
[1.23.1]: https://github.com/argon-it/seedfast-cli/compare/v1.23.0...v1.23.1
[1.23.0]: https://github.com/argon-it/seedfast-cli/compare/v1.22.1...v1.23.0
[1.22.1]: https://github.com/argon-it/seedfast-cli/compare/v1.22.0...v1.22.1
[1.22.0]: https://github.com/argon-it/seedfast-cli/compare/v1.21.4...v1.22.0
[1.21.4]: https://github.com/argon-it/seedfast-cli/compare/v1.21.3...v1.21.4
[1.21.3]: https://github.com/argon-it/seedfast-cli/compare/v1.21.2...v1.21.3
[1.21.2]: https://github.com/argon-it/seedfast-cli/compare/v1.21.1...v1.21.2
[1.21.1]: https://github.com/argon-it/seedfast-cli/compare/v1.20.3...v1.21.1
[1.20.3]: https://github.com/argon-it/seedfast-cli/compare/v1.20.2...v1.20.3
[1.20.2]: https://github.com/argon-it/seedfast-cli/compare/v1.1.20...v1.20.2
[1.1.20]: https://github.com/argon-it/seedfast-cli/compare/v1.1.6...v1.1.20
[1.1.6]: https://github.com/argon-it/seedfast-cli/compare/v1.1.5...v1.1.6
[1.1.5]: https://github.com/argon-it/seedfast-cli/compare/v1.1.4...v1.1.5
[1.1.4]: https://github.com/argon-it/seedfast-cli/compare/v1.1.3...v1.1.4
[1.1.3]: https://github.com/argon-it/seedfast-cli/compare/v1.1.2...v1.1.3
[1.1.2]: https://github.com/argon-it/seedfast-cli/compare/v1.1.1...v1.1.2
[1.1.1]: https://github.com/argon-it/seedfast-cli/compare/v1.1.0...v1.1.1
[1.1.0]: https://github.com/argon-it/seedfast-cli/compare/v1.0.9...v1.1.0
[1.0.9]: https://github.com/argon-it/seedfast-cli/compare/v1.0.8...v1.0.9
[1.0.8]: https://github.com/argon-it/seedfast-cli/compare/v1.0.7...v1.0.8
[1.0.7]: https://github.com/argon-it/seedfast-cli/compare/v1.0.6...v1.0.7
[1.0.6]: https://github.com/argon-it/seedfast-cli/compare/v1.0.5...v1.0.6
[1.0.5]: https://github.com/argon-it/seedfast-cli/compare/v1.0.4...v1.0.5
[1.0.4]: https://github.com/argon-it/seedfast-cli/compare/v1.0.3...v1.0.4
[1.0.3]: https://github.com/argon-it/seedfast-cli/compare/v1.0.2...v1.0.3
[1.0.2]: https://github.com/argon-it/seedfast-cli/compare/v1.0.1...v1.0.2
[1.0.1]: https://github.com/argon-it/seedfast-cli/compare/v1.0.0...v1.0.1
[1.0.0]: https://github.com/argon-it/seedfast-cli/releases/tag/v1.0.0
