Fixed MigrationRunner._default_prompt_for_migration silently auto-approving
destructive database migrations when the interactive prompt raised any exception.
The bare 'except Exception' handler was swallowing all errors and returning True
(auto-approve), which could apply destructive schema migrations to production
databases without user consent when stdin is broken, typer is unavailable, or
any other prompt failure occurs.
Changes:
- Narrow exception handler from 'except Exception' to 'except (OSError, EOFError)'
to only catch genuine non-interactive environment signals
- Re-raise KeyboardInterrupt so Ctrl-C always works
- Return False (reject) instead of True (auto-approve) on prompt failure
- Log at WARNING level instead of DEBUG so the rejection is visible
- Non-interactive environments (stdin not a TTY) now also return False by default
- Updated docstring to document the new safe-default behavior
- Added BDD regression tests for all new code paths
- Added TDD feature file tdd_migration_prompt_auto_approve_7503.feature
ISSUES CLOSED: #7503
Move alembic configuration and migration files from repository root into the
Python package structure to ensure they are included in the wheel distribution.
This fix resolves the FileNotFoundError when running `agents init` in Docker
containers or any environment using the built wheel distribution.
Changes:
- Move alembic/ directory from repo root to
src/cleveragents/infrastructure/database/migrations/
- Move alembic.ini to the same new location and update script_location setting
- Update MigrationRunner._find_alembic_ini() to search from the new canonical
location within the package
- Update create_template_db.py to point to the new alembic.ini location
- Update documentation references to reflect new migration file locations
- Create __init__.py for migrations package
- The env.py file is imported when running tests that verify all modules can be
imported without errors. However, context.config is only available when alembic
is actually running migrations, not during normal module imports. This caused
an AttributeError when the test tried to import the migrations.env module.
- Fix by using getattr() with a default value to safely access context.config,
and guard all code that uses config with None checks. This allows the module
to be safely imported while still functioning correctly during migrations.
Testing:
- Verified MigrationRunner can locate alembic.ini in new location
- Tested agents init succeeds in creating project with database
- Template database creation works correctly
- All migration tests should pass without changes
Alembic files now follow standard Python packaging conventions, making them
automatically included in wheel distributions without special configuration.
ISSUES CLOSED: #4180
Complete the Alembic migration infrastructure by adding CLI commands,
improving stamp logic, and adding comprehensive lifecycle tests.
Key changes:
- Added agents db CLI command group (db.py) with 5 subcommands:
migrate (autogenerate), upgrade, downgrade, current, history.
All delegate to MigrationRunner which wraps Alembic command API.
- Registered the db command group in main.py CLI registration.
- Fixed legacy database stamp logic in MigrationRunner to stamp at
"head" instead of "001_initial_schema" when pre-Alembic tables are
detected. This avoids migration failures when create_all-produced
tables already exist (migrations would try to CREATE TABLE and fail
with "table already exists").
- Added commit() after stamp to ensure alembic_version is persisted
before subsequent operations on the same in-memory database.
- Added FakeConnection.commit() method to the mock test infrastructure
to support the new commit call in the stamp path.
- Added Behave feature (db_migration_lifecycle.feature) with 8
scenarios covering: forward migration, rollback, round-trip,
CLI upgrade/current/downgrade, legacy stamp logic, and
init_database schema validation.
- Added vulture whitelist entries for new CLI commands.
Note: init_database() still uses Base.metadata.create_all() as the
primary schema creation path. Full migration to Alembic-only init is
deferred until ORM model constraints are reconciled with migration
scripts (action_arguments UniqueConstraint mismatch).
ISSUES CLOSED: #941