v0.9.2 - Combined Release (v0.7.0 - v0.9.2)
This release combines all changes since v0.7.0.
Bug Fixes (v0.9.2)
PyPI Publishing Fix
- Fixed duplicate templates in wheel that caused PyPI to reject uploads
- Removed redundant
force-includedirective in pyproject.toml
What's New in v0.9.1
MCP Commands Tool Improvements
- Fixed
commandstool to showtplanddefaultsfields for templated commands - No more null values in output - only relevant fields are shown
- Invalid commands (no cmd or tpl) now show
errorfield
Run Output Improvements
- Added
cmdfield to run/exec output showing the expanded command - Useful for seeing exactly what command was executed for templated commands
CI Fixes
- Fixed lint and type errors across codebase
- Fixed code formatting issues
Removed
- Removed redundant
test-allcommand (usetesttemplate with defaults instead)
What's New in v0.9.0
Database Lock Contention Handling
- Added
retry_on_lock()helper with exponential backoff and jitter for handling DuckDB lock errors - Added
BirdStore.open_with_retry()for concurrent access scenarios - Added
BirdStore.execute_with_retry()for critical write operations - Updated command execution to use retry logic, preventing failures when multiple commands run concurrently
Minimized DB Lock Time
- Restructured
_execute_with_live_output()to minimize database lock duration - Window 1: Brief DB access to write attempt record, then close
- Background PID update runs concurrently in separate thread
- Window 2: Brief DB access to write outcome/events after command completes
- Database is unlocked during subprocess execution
Testing
- Added 18 new tests for lock contention and race conditions
- Tests cover concurrent command execution, background PID updates, and data integrity
What's New in v0.7.0
TOML Configuration
- Migrated from YAML to TOML format
config.yaml→config.tomlcommands.yaml→commands.toml
Parameterized Commands
- New
tplfield for template commands with{param}placeholders defaultsdictionary for optional parameter values- CLI:
blq run test path=tests/unit/ - MCP:
run(command="test", args={"path": "tests/unit/"})
Example:
[commands.test]
tpl = "pytest {path} {flags}"
defaults = { path = "tests/", flags = "-v" }Documentation
- Updated all docs to reference TOML format
- New parameterized commands section in registry docs
- Updated MCP guide with args parameter examples
🤖 Generated with Claude Code