Skip to content

feat(db): add schema repair and sentry cli fix command#197

Merged
BYK merged 7 commits intomainfrom
feat/db-schema-repair
Feb 5, 2026
Merged

feat(db): add schema repair and sentry cli fix command#197
BYK merged 7 commits intomainfrom
feat/db-schema-repair

Conversation

@BYK
Copy link
Member

@BYK BYK commented Feb 5, 2026

Summary

Adds automatic schema repair for SQLite database migration issues. This fixes cases where the schema version gets out of sync with actual table structure during development.

Changes

Auto-Repair on SQLiteError

  • When a query fails due to missing columns/tables, the CLI automatically repairs the schema and retries
  • Works at both query preparation (db.query()) and execution (stmt.get()) stages
  • Logs repairs to stderr without breaking JSON output
  • Opt-out via SENTRY_CLI_NO_AUTO_REPAIR=1

sentry cli fix Command

sentry cli fix              # Diagnose and repair schema issues
sentry cli fix --dry-run    # Show what would be fixed

Schema Repair Utilities

  • EXPECTED_TABLES / EXPECTED_COLUMNS - Canonical schema definitions
  • getSchemaIssues() - Diagnostics for missing tables/columns
  • repairSchema() - Non-destructive repair (only adds, never deletes)

Testing

  • 14 new tests for schema repair functions
  • 5 new tests for fix command
  • All 997 tests pass

Add automatic schema repair for SQLite database migration issues. When a query
fails due to missing columns or tables, the CLI now automatically repairs the
schema and retries the operation.

Also adds a manual `sentry cli fix` command for diagnostics and repair:
- `sentry cli fix` - diagnose and repair schema issues
- `sentry cli fix --dry-run` - show what would be fixed

Auto-repair can be disabled via SENTRY_CLI_NO_AUTO_REPAIR=1 env var.
@github-actions
Copy link
Contributor

github-actions bot commented Feb 5, 2026

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Dsn

  • Infer project from directory name when DSN detection fails by BYK in #178
  • Add project root detection for automatic DSN discovery by BYK in #159

Other

  • (commands) Add sentry log command by betegon in #160
  • (db) Add schema repair and sentry cli fix command by BYK in #197
  • (issue) Replace --org/--project flags with /ID syntax by BYK in #161
  • (lib) Add anyTrue helper for parallel-with-early-exit pattern by BYK in #174
  • (telemetry) Add withTracing helper to reduce Sentry span boilerplate by BYK in #172

Bug Fixes 🐛

  • (types) Align schema types with Sentry API by betegon in #169
  • Corrected the codecov action script by MathurAditya724 in #201
  • Improved the plan command by MathurAditya724 in #185
  • Use ASCII arrow for consistent terminal rendering by BYK in #192
  • Corrected the rendering and props for the span tree by MathurAditya724 in #184
  • ParseIssueArg now checks slashes before dashes by BYK in #177
  • Address bugbot review comments on dsn-cache model-based tests by BYK in #176
  • Added nullable in substatus's zod validation by MathurAditya724 in #157

Documentation 📚

  • Update AGENTS.md with testing guidelines and architecture by BYK in #190

Internal Changes 🔧

  • (upgrade) Use centralized user-agent for GitHub API requests by BYK in #173

Other

  • test: add comprehensive tests for resolve-target module by BYK in #199
  • test: add tests for executeUpgrade with unknown method by BYK in #198
  • test: expand version check test coverage by BYK in #196
  • test: add comprehensive tests for DSN errors and resolver by BYK in #195
  • test: add comprehensive tests for human formatter detail functions by BYK in #194
  • test: add comprehensive tests for human formatter utilities by BYK in #191
  • test: add coverage for fetchLatestVersion and versionExists by BYK in #189
  • test: add coverage for UpgradeError and SeerError classes by BYK in #188
  • test: add property tests for sentry-urls.ts (Phase 3) by BYK in #186
  • test: simplify issue-id tests covered by property tests by BYK in #183
  • test: simplify alias and arg-parsing tests covered by property tests by BYK in #182
  • test: add property tests for API command and human formatters by BYK in #181
  • test: remove redundant DB tests covered by model-based tests by BYK in #180
  • test: add property tests for async utilities (Phase 4) by BYK in #179
  • test: add model-based tests for DSN and project cache by BYK in #171
  • test: add model-based and property-based testing with fast-check by BYK in #166

🤖 This preview updates automatically when you update the PR.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 5, 2026

Codecov Results 📊

✅ Patch coverage is 91.01%. Project has 1744 uncovered lines.
✅ Project coverage is 77.99%. Comparing base (base) to head (head).

Files with missing lines (34)
File Patch % Lines
human.ts 53.59% ⚠️ 388 Missing
resolve-target.ts 15.28% ⚠️ 366 Missing
oauth.ts 25.10% ⚠️ 194 Missing
api-client.ts 70.62% ⚠️ 176 Missing
upgrade.ts 45.49% ⚠️ 139 Missing
migration.ts 47.44% ⚠️ 82 Missing
telemetry.ts 78.69% ⚠️ 52 Missing
api.ts 89.80% ⚠️ 47 Missing
seer.ts 75.54% ⚠️ 45 Missing
schema.ts 89.56% ⚠️ 40 Missing
seer.ts 79.87% ⚠️ 30 Missing
preload.ts 53.23% ⚠️ 29 Missing
utils.ts 88.94% ⚠️ 25 Missing
detector.ts 90.10% ⚠️ 20 Missing
code-scanner.ts 95.00% ⚠️ 16 Missing
arg-parsing.ts 90.00% ⚠️ 12 Missing
dsn-cache.ts 94.62% ⚠️ 12 Missing
fix.ts 83.61% ⚠️ 10 Missing
fs-utils.ts 57.14% ⚠️ 9 Missing
project-root.ts 97.73% ⚠️ 7 Missing
version-check.ts 91.14% ⚠️ 7 Missing
feedback.ts 84.21% ⚠️ 6 Missing
auth.ts 95.52% ⚠️ 6 Missing
upgrade.ts 93.83% ⚠️ 5 Missing
resolver.ts 94.57% ⚠️ 5 Missing
index.ts 95.96% ⚠️ 4 Missing
env-file.ts 97.58% ⚠️ 3 Missing
project-aliases.ts 97.40% ⚠️ 2 Missing
project-root-cache.ts 96.92% ⚠️ 2 Missing
alias.ts 99.28% ⚠️ 1 Missing
parser.ts 98.63% ⚠️ 1 Missing
colors.ts 97.96% ⚠️ 1 Missing
helpers.ts 94.74% ⚠️ 1 Missing
helpers.ts 94.74% ⚠️ 1 Missing
Coverage diff
@@            Coverage Diff             @@
##          main       #PR       +/-##
==========================================
+ Coverage    77.20%    77.99%    +0.79%
==========================================
  Files           57        58        +1
  Lines         7497      7922      +425
  Branches         0         0         —
==========================================
+ Hits          5788      6178      +390
- Misses        1709      1744       +35
- Partials         0         0         —

Generated by Codecov Action

- Refactor EXPECTED_TABLES to generate DDL from TABLE_SCHEMAS (single source of truth)
- Move tryRepairAndRetry from telemetry.ts to schema.ts where repair logic belongs
- Add addedInVersion tracking to columns for automatic EXPECTED_COLUMNS generation
- Remove ~80 lines of duplicate code from telemetry.ts
- Fix linting errors (block statements) and type error (EXPECTED_TABLES access)
@BYK
Copy link
Member Author

BYK commented Feb 5, 2026

Regarding why migrations are still needed alongside auto-repair:

Auto-repair only handles additive schema changes (missing tables/columns). Explicit migrations are still needed for:

  • Data transformations - e.g., splitting a column, populating new columns from existing data
  • Column renames - SQLite requires copying data to a new table
  • Complex constraints - constraints that depend on existing data or need specific ordering

Auto-repair is a safety net for when schema version gets out of sync (e.g., database copied between machines, downgrade then upgrade), not a replacement for migrations.

- Export TABLE_SCHEMAS, generateTableDDL, generatePreMigrationTableDDL from schema.ts
- Update fix.test.ts to use helpers instead of hardcoded SQL
- Update schema.test.ts to use helpers instead of hardcoded SQL
- Tests now stay in sync with schema changes automatically
@BYK BYK marked this pull request as ready for review February 5, 2026 17:12
- Fix auto-repair swallowing retry errors by moving operation() call outside
  try-catch, so new errors propagate instead of original error
- Reset rawDb to null in getDatabase() auto-invalidate block for consistency
- Add validation in generatePreMigrationTableDDL for empty base columns
- Use RepairAttemptResult type to distinguish 'repair not attempted' from
  'repair succeeded with undefined result' (fixes incorrect error throwing
  when stmt.get() legitimately returns undefined)
- Wrap database initialization in try-catch to prevent connection leak if
  initSchema/runMigrations/migrateFromJson fails after Database() opens
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

@BYK BYK merged commit eb05488 into main Feb 5, 2026
24 checks passed
@BYK BYK deleted the feat/db-schema-repair branch February 5, 2026 19:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant