diff --git a/TEMPLATES.md b/TEMPLATES.md index 77fb09468..a15b5fa03 100644 --- a/TEMPLATES.md +++ b/TEMPLATES.md @@ -1572,7 +1572,7 @@ ALTER TABLE `users` ADD INDEX `idx_email`(`email`); ALTER TABLE `orders` ADD INDEX `idx_user_id`(`user_id`); ``` -**`products`**: ⊘ Cancelled (not started) +**`products`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `products` ADD INDEX `idx_price`(`price_cents`); @@ -3908,13 +3908,13 @@ _Last updated: 2026-01-01 00:00:0 ALTER TABLE `orders` ADD INDEX `idx_user_id`(`user_id`); ``` -**`users`**: ⊘ Cancelled (not started) +**`users`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `users` ADD INDEX `idx_email`(`email`); ``` -**`products`**: ⊘ Cancelled (not started) +**`products`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `products` ADD INDEX `idx_price`(`price_cents`); @@ -3961,7 +3961,7 @@ ALTER TABLE `users` ADD INDEX `idx_email`(`email`); ALTER TABLE `orders` ADD INDEX `idx_user_id`(`user_id`); ``` -**`products`**: ⊘ Cancelled (not started) +**`products`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `products` ADD INDEX `idx_price`(`price_cents`); @@ -4003,13 +4003,13 @@ ALTER TABLE `orders` MODIFY COLUMN `status` enum('NEW','PENDING','SHIPPED','DELI ``` > ❌ Last error: preflight enumReorder check failed: reordering existing ENUM values on column `status` is unsafe: retained values must keep their relative order and new values must be appended at the end -**`users`**: ⊘ Cancelled (not started) +**`users`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `users` ADD INDEX `idx_email`(`email`); ``` -**`products`**: ⊘ Cancelled (not started) +**`products`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `products` ADD INDEX `idx_price`(`price_cents`); @@ -4119,7 +4119,7 @@ _Last updated: 2026-01-01 00:00:0 ALTER TABLE `orders` ADD INDEX `idx_user_id`(`user_id`); ``` -**`users`**: ⊘ Cancelled (not started) +**`users`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `users` ADD INDEX `idx_email`(`email`); @@ -5140,7 +5140,7 @@ ALTER TABLE `payments` ADD INDEX `idx_order_id`(`order_id`); ``` -### ⊘ analytics +### 🚫 analytics **`events`** β€” Cancelled ```sql @@ -5734,10 +5734,10 @@ Sequential mode: First table failed (others cancelled) ~ users: πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯⬜⬜⬜⬜⬜⬜⬜ ❌ Failed ALTER TABLE `users` ADD INDEX `idx_email_created`(`email`, `created_at`); - ~ orders: ⊘ Cancelled (not started) + ~ orders: 🚫 Cancelled (not started) ALTER TABLE `orders` ADD INDEX `idx_user_status`(`user_id`, `status`); - ~ products: ⊘ Cancelled (not started) + ~ products: 🚫 Cancelled (not started) ALTER TABLE `products` ADD COLUMN `weight_grams` int DEFAULT 0; @@ -5770,7 +5770,7 @@ Sequential mode: Middle table failed ~ users: 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 βœ“ Complete ALTER TABLE `users` ADD INDEX `idx_email_created`(`email`, `created_at`); - ~ products: ⊘ Cancelled (not started) + ~ products: 🚫 Cancelled (not started) ALTER TABLE `products` ADD COLUMN `weight_grams` int DEFAULT 0; @@ -6148,7 +6148,7 @@ Press Enter to deploy or proceed via the PlanetScale console (ESC to detach) ── myapp_sharded ── - ~ orders: 🟧🟧🟧🟧🟧🟧⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜ ⊘ Cancelled at 30% + ~ orders: 🟧🟧🟧🟧🟧🟧⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜ 🚫 Cancelled at 30% ALTER TABLE `orders` ADD INDEX `idx_total`(`total_cents`); β€’ Shards: 2 (2 cancelled) @@ -6698,7 +6698,7 @@ ESC detach β€’ s stop β€’ v volume Stop command: User runs 'schemabot stop -e staging ' -⏸️ Schema change stopped +⏹️ Schema change stopped Database: myapp Environment: staging @@ -7059,8 +7059,8 @@ schemabot apply -e production - βœ… eu β€” completed - ❌ us β€” failed -- ⏸ au β€” halted β€” us failed -- ⏸ ca β€” halted β€” us failed +- ⏸️ au β€” halted β€” us failed +- ⏸️ ca β€” halted β€” us failed
βœ… eu β€” completed @@ -7122,7 +7122,7 @@ ALTER TABLE `users` ADD INDEX `idx_email`(`email`); ALTER TABLE `orders` ADD INDEX `idx_user_id`(`user_id`); ``` -**`products`**: ⊘ Cancelled (not started) +**`products`**: 🚫 Cancelled (not started) ```sql ALTER TABLE `products` ADD INDEX `idx_price`(`price_cents`); @@ -7141,14 +7141,14 @@ schemabot apply -e production
-⏸ au β€” halted β€” us failed +⏸️ au β€” halted β€” us failed _No details available yet._
-⏸ ca β€” halted β€” us failed +⏸️ ca β€” halted β€” us failed _No details available yet._ @@ -7420,8 +7420,8 @@ schemabot apply -e production - βœ… eu β€” completed - ❌ us β€” failed -- ⏸ au β€” halted β€” us failed -- ⏸ ca β€” halted β€” us failed +- ⏸️ au β€” halted β€” us failed +- ⏸️ ca β€” halted β€” us failed
βœ… eu β€” completed @@ -7497,14 +7497,14 @@ schemabot apply -e production
-⏸ au β€” halted β€” us failed +⏸️ au β€” halted β€” us failed _No details available yet._
-⏸ ca β€” halted β€” us failed +⏸️ ca β€” halted β€” us failed _No details available yet._ @@ -7713,9 +7713,9 @@ _Last updated: 2026-01-01 00:00:0 | Shard | Status | | --- | --- | | `-40` | ❌ failed β€” resolve shard primary for `-40`: context deadline exceeded | -| `40-80` | ⏸ halted β€” -40 failed | -| `80-c0` | ⏸ halted β€” -40 failed | -| `c0-` | ⏸ halted β€” -40 failed | +| `40-80` | ⏸️ halted β€” -40 failed | +| `80-c0` | ⏸️ halted β€” -40 failed | +| `c0-` | ⏸️ halted β€” -40 failed | --- @@ -7865,9 +7865,9 @@ _Last updated: 2026-01-01 00:00:0 | Shard | Status | | --- | --- | | `-40` | ❌ failed β€” resolve shard primary for `-40`: context deadline exceeded | -| `40-80` | ⏸ halted β€” -40 failed | -| `80-c0` | ⏸ halted β€” -40 failed | -| `c0-` | ⏸ halted β€” -40 failed | +| `40-80` | ⏸️ halted β€” -40 failed | +| `80-c0` | ⏸️ halted β€” -40 failed | +| `c0-` | ⏸️ halted β€” -40 failed | ### VSchema @@ -7958,9 +7958,9 @@ schemabot apply -e production ALTER TABLE `orders` ADD INDEX `idx_orders_source`(`source`); -⏸ ap-south β€” halted β€” eu-west failed (orders-ap-south) +⏸️ ap-south β€” halted β€” eu-west failed (orders-ap-south) - ~ orders: ⊘ Cancelled (not started) + ~ orders: 🚫 Cancelled (not started) ALTER TABLE `orders` ADD COLUMN `source` varchar(32); @@ -8163,10 +8163,10 @@ Sequential mode: First table failed (others cancelled) ~ users: πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯πŸŸ₯⬜⬜⬜⬜⬜⬜⬜ ❌ Failed ALTER TABLE `users` ADD INDEX `idx_email_created`(`email`, `created_at`); - ~ orders: ⊘ Cancelled (not started) + ~ orders: 🚫 Cancelled (not started) ALTER TABLE `orders` ADD INDEX `idx_user_status`(`user_id`, `status`); - ~ products: ⊘ Cancelled (not started) + ~ products: 🚫 Cancelled (not started) ALTER TABLE `products` ADD COLUMN `weight_grams` int DEFAULT 0; @@ -8199,7 +8199,7 @@ Sequential mode: Middle table failed ~ users: 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 βœ“ Complete ALTER TABLE `users` ADD INDEX `idx_email_created`(`email`, `created_at`); - ~ products: ⊘ Cancelled (not started) + ~ products: 🚫 Cancelled (not started) ALTER TABLE `products` ADD COLUMN `weight_grams` int DEFAULT 0; diff --git a/pkg/cmd/commands/watch_tui_test.go b/pkg/cmd/commands/watch_tui_test.go index 534996a76..a734d8417 100644 --- a/pkg/cmd/commands/watch_tui_test.go +++ b/pkg/cmd/commands/watch_tui_test.go @@ -324,7 +324,7 @@ func TestWatchModel_MultiDeploymentView(t *testing.T) { "External operation ID: remote-op-us-east-test", "External apply ID: remote-apply-us-east-test", "❌ eu-west β€” failed (orders-eu-west)", - "⏸ ap-south β€” halted β€” eu-west failed (orders-ap-south)", + "⏸️ ap-south β€” halted β€” eu-west failed (orders-ap-south)", ) assert.Contains(t, view, "duplicate key name 'idx_orders_source'") assert.Contains(t, view, "orders") diff --git a/pkg/cmd/internal/templates/progress.go b/pkg/cmd/internal/templates/progress.go index 8230bbbdc..fba406343 100644 --- a/pkg/cmd/internal/templates/progress.go +++ b/pkg/cmd/internal/templates/progress.go @@ -418,7 +418,7 @@ func FormatProgressState(s string) string { case state.Apply.Failed: return ANSIRed + "βœ— Failed" + ANSIReset case state.Apply.Stopped: - return ANSIOrange + "⏸️ Stopped" + ANSIReset + return ANSIOrange + "⏹️ Stopped" + ANSIReset case state.Apply.Cancelled: return ANSIOrange + "🚫 Cancelled" + ANSIReset case state.Apply.RevertWindow: @@ -650,9 +650,9 @@ func FormatTableProgressWithActivity(t TableProgress, activityBar, activityLabel if t.PercentComplete > 0 || t.RowsCopied > 0 { cancelledPercent := ui.RowCopyDisplayPercent(t.PercentComplete, t.RowsCopied) bar := ui.ProgressBar(cancelledPercent, ui.ColorOrange) - fmt.Fprintf(&b, indentTable+progressSymbol(t.ChangeType)+"%s: %s ⊘ Cancelled at %d%%\n", t.TableName, bar, cancelledPercent) + fmt.Fprintf(&b, indentTable+progressSymbol(t.ChangeType)+"%s: %s 🚫 Cancelled at %d%%\n", t.TableName, bar, cancelledPercent) } else { - fmt.Fprintf(&b, indentTable+progressSymbol(t.ChangeType)+"%s: ⊘ Cancelled (not started)\n", t.TableName) + fmt.Fprintf(&b, indentTable+progressSymbol(t.ChangeType)+"%s: 🚫 Cancelled (not started)\n", t.TableName) } if t.DDL != "" { b.WriteString(formatProgressDDLForDialect(t.Dialect, t.DDL)) @@ -838,7 +838,7 @@ type StopData struct { // WriteStopSuccess writes the stop command success output. func WriteStopSuccess(data StopData) { - fmt.Printf("%s%s⏸️ Schema change stopped%s\n", ANSIBold, ANSIYellow, ANSIReset) + fmt.Printf("%s%s⏹️ Schema change stopped%s\n", ANSIBold, ANSIYellow, ANSIReset) fmt.Println() fmt.Printf("Database: %s\n", data.Database) fmt.Printf("Environment: %s\n", data.Environment) diff --git a/pkg/cmd/internal/templates/progress_multi_test.go b/pkg/cmd/internal/templates/progress_multi_test.go index cb1ae01f2..1538d1771 100644 --- a/pkg/cmd/internal/templates/progress_multi_test.go +++ b/pkg/cmd/internal/templates/progress_multi_test.go @@ -43,7 +43,7 @@ func TestWriteProgressMultiDeploymentRendersAggregateAndSections(t *testing.T) { assertLess(t, output, "βœ… region-a β€” completed", "❌ region-b β€” failed") assert.Contains(t, output, "External operation ID: remote-region-a") assert.Contains(t, output, "External apply ID: remote-apply-region-a") - assertLess(t, output, "❌ region-b β€” failed", "⏸ region-c β€” halted β€” region-b failed") + assertLess(t, output, "❌ region-b β€” failed", "⏸️ region-c β€” halted β€” region-b failed") assert.Contains(t, output, "users_a") assert.Contains(t, output, "users_b") assert.Contains(t, output, "users_c") diff --git a/pkg/cmd/internal/templates/progress_states_test.go b/pkg/cmd/internal/templates/progress_states_test.go index 45a2c704c..052c18734 100644 --- a/pkg/cmd/internal/templates/progress_states_test.go +++ b/pkg/cmd/internal/templates/progress_states_test.go @@ -950,7 +950,7 @@ func TestFormatTableProgressOperatorHaltedBars(t *testing.T) { RowsCopied: 300, RowsTotal: 1000, }) - assert.Contains(t, cancelled, "⊘ Cancelled at 30%") + assert.Contains(t, cancelled, "🚫 Cancelled at 30%") assert.Contains(t, cancelled, ui.ColorOrange) assert.NotContains(t, cancelled, ui.ColorRed) diff --git a/pkg/presentation/presentation.go b/pkg/presentation/presentation.go index 3539da285..3e638fb36 100644 --- a/pkg/presentation/presentation.go +++ b/pkg/presentation/presentation.go @@ -285,11 +285,11 @@ func deriveDeployment(ops []Operation, i int) Deployment { case state.ApplyOperation.FailedRetryable: d.set(StateRetrying, "retrying", "πŸ”", true) case state.ApplyOperation.Stopped: - d.set(StateStopped, "stopped β€” resume to continue", "⏸", true) + d.set(StateStopped, "stopped β€” resume to continue", "⏹️", true) case state.ApplyOperation.RevertWindow: d.set(StateRevertWindow, "in revert window", "⏳", true) case state.ApplyOperation.Cancelled: - d.set(StateCancelled, "cancelled", "β›”", false) + d.set(StateCancelled, "cancelled", "🚫", false) case state.ApplyOperation.Reverted: d.set(StateReverted, "reverted", "↩️", false) case state.ApplyOperation.Pending: @@ -319,10 +319,10 @@ func derivePending(d *Deployment, ops []Operation, i int) { } if h, paused := blockingSibling(ops, i); h != nil { if paused { - d.set(StatePaused, fmt.Sprintf("paused β€” %s failed; release or stop", h.Deployment), "⏸", true) + d.set(StatePaused, fmt.Sprintf("paused β€” %s failed; release or stop", h.Deployment), "⏸️", true) return } - d.set(StateHalted, fmt.Sprintf("halted β€” %s %s", h.Deployment, haltedReason(h.State)), "⏸", true) + d.set(StateHalted, fmt.Sprintf("halted β€” %s %s", h.Deployment, haltedReason(h.State)), "⏸️", true) return } for j := range i { diff --git a/pkg/presentation/presentation_test.go b/pkg/presentation/presentation_test.go index 545391dca..7a5978c95 100644 --- a/pkg/presentation/presentation_test.go +++ b/pkg/presentation/presentation_test.go @@ -81,9 +81,9 @@ func TestDeriveDeployment_StateLabels(t *testing.T) { {so.CuttingOver, StateCuttingOver, "cutting over", "πŸ”", true}, {so.Failed, StateFailed, "failed", "❌", true}, {so.FailedRetryable, StateRetrying, "retrying", "πŸ”", true}, - {so.Stopped, StateStopped, "stopped β€” resume to continue", "⏸", true}, + {so.Stopped, StateStopped, "stopped β€” resume to continue", "⏹️", true}, {so.RevertWindow, StateRevertWindow, "in revert window", "⏳", true}, - {so.Cancelled, StateCancelled, "cancelled", "β›”", false}, + {so.Cancelled, StateCancelled, "cancelled", "🚫", false}, {so.Reverted, StateReverted, "reverted", "↩️", false}, {"some_engine_state", StateUnknown, "some_engine_state", "", true}, } diff --git a/pkg/webhook/templates/apply.go b/pkg/webhook/templates/apply.go index a53dd638b..feba273d0 100644 --- a/pkg/webhook/templates/apply.go +++ b/pkg/webhook/templates/apply.go @@ -849,7 +849,7 @@ func renderTableProgress(sb *strings.Builder, dialect schema.Dialect, table Tabl } case state.Task.Cancelled: - fmt.Fprintf(sb, "**`%s`**: \u2298 Cancelled (not started)\n", table.TableName) + fmt.Fprintf(sb, "**`%s`**: 🚫 Cancelled (not started)\n", table.TableName) writeDDLLine(sb, dialect, table.DDL) case state.Task.RevertWindow: @@ -1661,7 +1661,7 @@ func groupStateEmoji(tables []TableProgressData) string { return "⏹️" } if states[state.Task.Cancelled] && !states[state.Task.Completed] { - return "⊘" + return "🚫" } return "βœ…" } diff --git a/pkg/webhook/templates/apply_test.go b/pkg/webhook/templates/apply_test.go index 2a416534d..d20a18bba 100644 --- a/pkg/webhook/templates/apply_test.go +++ b/pkg/webhook/templates/apply_test.go @@ -967,7 +967,7 @@ func TestRenderApplyStatusComment_Failed(t *testing.T) { assert.Contains(t, result, "lock wait timeout exceeded") assert.Contains(t, result, "πŸŸ₯") // red bar for failed table assert.Contains(t, result, "❌ Failed") - assert.Contains(t, result, "⊘ Cancelled (not started)") + assert.Contains(t, result, "🚫 Cancelled (not started)") // Progress summary assert.Contains(t, result, "πŸ“Š 1/3 complete") assert.Contains(t, result, "1 failed") diff --git a/pkg/webhook/templates/multi_apply_test.go b/pkg/webhook/templates/multi_apply_test.go index 93b5ed99c..57186450d 100644 --- a/pkg/webhook/templates/multi_apply_test.go +++ b/pkg/webhook/templates/multi_apply_test.go @@ -93,8 +93,8 @@ func TestRenderMultiDeploymentApplyComment_FailedHalt(t *testing.T) { assert.Contains(t, out, "schemabot apply -e production") assert.NotContains(t, out, "schemabot revert") assert.Contains(t, out, "- ❌ us β€” failed") - assert.Contains(t, out, "- ⏸ au β€” halted β€” us failed") - assert.Contains(t, out, "
\n⏸ au β€” halted β€” us failed") + assert.Contains(t, out, "- ⏸️ au β€” halted β€” us failed") + assert.Contains(t, out, "
\n⏸️ au β€” halted β€” us failed") // With no error detail on the failed operation, the first-failure line names // the deployment without a reason. assert.Contains(t, out, "> ❌ **First failure:** us\n") @@ -467,7 +467,7 @@ func TestRenderMultiDeploymentApplyComment_HaltedDetailUsesDerivedStatus(t *test }, }) - assert.Contains(t, out, "**Status**: ⏸ Halted β€” apse2 failed") + assert.Contains(t, out, "**Status**: ⏸️ Halted β€” apse2 failed") assert.NotContains(t, out, "**Status**: Starting") // The failed deployment keeps its raw-state gloss. assert.Contains(t, out, "**Status**: Failed") diff --git a/pkg/webhook/templates/sharded_apply_tenant_test.go b/pkg/webhook/templates/sharded_apply_tenant_test.go index 8175926c0..027a764f7 100644 --- a/pkg/webhook/templates/sharded_apply_tenant_test.go +++ b/pkg/webhook/templates/sharded_apply_tenant_test.go @@ -31,8 +31,8 @@ func TestShardedApplyHintsCarryTenant(t *testing.T) { Keyspaces: []ShardedKeyspace{{ Keyspace: "cdb_resolute_sharded", Shards: []ShardStatus{ - {Shard: "-40", Emoji: "⏸", Label: "stopped", State: state.ApplyOperation.Stopped}, - {Shard: "80-", Emoji: "⏸", Label: "stopped", State: state.ApplyOperation.Stopped}, + {Shard: "-40", Emoji: "⏹️", Label: "stopped", State: state.ApplyOperation.Stopped}, + {Shard: "80-", Emoji: "⏹️", Label: "stopped", State: state.ApplyOperation.Stopped}, }, Cells: []ShardCell{mutesCell("-40"), mutesCell("80-")}, }}, diff --git a/pkg/webhook/templates/sharded_apply_test.go b/pkg/webhook/templates/sharded_apply_test.go index 3add91c5b..21ee7c434 100644 --- a/pkg/webhook/templates/sharded_apply_test.go +++ b/pkg/webhook/templates/sharded_apply_test.go @@ -48,7 +48,7 @@ func TestRenderShardedApplyComment_FailedSurfacesError(t *testing.T) { ApplyID: "apply-x", Keyspaces: oneKeyspace([]ShardStatus{ {Shard: "-40", Emoji: "❌", Label: "failed", State: state.ApplyOperation.Failed, Error: failErr}, - {Shard: "80-", Emoji: "⏸", Label: "halted β€” -40 failed", State: state.ApplyOperation.Pending}, + {Shard: "80-", Emoji: "⏸️", Label: "halted β€” -40 failed", State: state.ApplyOperation.Pending}, }, []ShardCell{mutesCell("-40"), mutesCell("80-")}), }) @@ -282,14 +282,14 @@ func TestRenderShardedApplySummaryComment_FailedSurfacesErrorAndRetry(t *testing ApplyID: "apply-x", Keyspaces: oneKeyspace([]ShardStatus{ {Shard: "-40", Emoji: "❌", Label: "failed", State: state.ApplyOperation.Failed, Error: failErr}, - {Shard: "80-", Emoji: "⏸", Label: "halted β€” -40 failed", State: state.ApplyOperation.Pending}, + {Shard: "80-", Emoji: "⏸️", Label: "halted β€” -40 failed", State: state.ApplyOperation.Pending}, }, []ShardCell{mutesCell("-40"), mutesCell("80-")}), }) assert.Contains(t, out, "## ❌ Schema Change Failed β€” Staging") assert.NotContains(t, out, "Applied successfully", "a failed apply writes no success line") assert.Contains(t, out, "> ❌ **First failure:** shard -40 β€” "+failErr) - assert.Contains(t, out, "| `80-` | ⏸ halted β€” -40 failed |", "halted siblings keep their final state in the results") + assert.Contains(t, out, "| `80-` | ⏸️ halted β€” -40 failed |", "halted siblings keep their final state in the results") assert.Contains(t, out, "To retry:") }