feat(site/src): add restart action to workspace overflow menu - #29309
Merged
jeremyruppel merged 2 commits intoSep 16, 2026
Merged
jeremyruppel merged 2 commits into
jeremyruppel merged 2 commits into
Conversation
Add a Restart action to the three-dot overflow menu for running workspaces on the /workspaces page. Optimistically reflects the restart in the row so the list tracks the stopping/starting transitions. Generated by Coder Agents.
jeremyruppel
marked this pull request as ready for review
September 14, 2026 21:06
nickvigilante
added a commit
that referenced
this pull request
Sep 15, 2026
…29364) doc-check started a review chat on every non-draft pull request. A review loads the full skill context, the content guidelines, and the cumulative diff before it can conclude anything, so a dependency bump or a test-only change paid that cost only for the skill's own "what not to comment on" list to produce silence. With the wait raised to 40 minutes in #29363, such a run can also hold a runner idle for most of that. This classifies the changed paths first and skips the review when every changed file is in a class with no user-facing documentation surface. Comparing the match count against the total is what makes it "every file", so a diff that mixes a test file with a CLI flag still gets a full review. CI that builds, deploys, previews, or reviews the docs is carved back out of the `.github` skip, because a change there can change the docs themselves. The `doc-check` label and a manual dispatch bypass the skip entirely, so a review stays forceable from the pull request. Tier-2 and tier-3 priors move into `path-priors.md`, loaded only when the pre-filter is inconclusive, so they cost nothing on a skipped run. ## Verification Dry-ran the filter list against real and synthetic file lists with the same globber the action uses. | Pull request | Files | Outcome | |---|---|---| | #29309 restart action | 5 | REVIEW, 3 files outside the skip classes | | #29363 doc-check timeout | 1 | REVIEW, `ci_docs` carve-out fires | | #29306 Mermaid diagrams | 5 | REVIEW, 2 files outside the skip classes | | `go.mod` + `go.sum` | 2 | SKIP | | Go test + React test | 2 | SKIP | | `site/src/index.css` | 1 | SKIP | | `cli/server.go` + its test | 2 | REVIEW | | Regenerated CLI docs + `cli/list.go` | 2 | REVIEW | | `.github/workflows/release.yaml` | 1 | SKIP | `make pre-commit` passes, including `lint/actions/actionlint`. <details> <summary>Why the patterns use the <code>**/*</code> form</summary> The globber treats a `**` glued to a suffix inconsistently. Verified against picomatch with `dot: true`: | Pattern | `coderd/database/db_test.go` | `foo_test.go` | |---|---|---| | `**_test.go` | no match | match | | `**/*_test.go` | match | match | `**.test.ts` happens to match at any depth, but `**_test.go` only matches the repo root, so a nested Go test would have leaked through and started a review. Every pattern in the filter uses `**/*` instead, which behaves the same at every depth including the root. `.github/workflows/ci.yaml` carries a related note about the same class of bug in a different action's globber. </details> <details> <summary>Implementation plan and decision log</summary> Part of a broader restructure of the doc-check skill. The audit found five defects: no path pre-filter, no commit scoping, duplicated rules, no likelihood model, and no destination for adjacent docs-gap ideas. This PR addresses the first, which is the largest token win and the lowest risk. The remainder is tracked separately. **Rejected: `paths-ignore` on the `pull_request` trigger.** It does express "all changed files match" for free, which was the initial plan. But it applies to the trigger as a whole, including `labeled` and `ready_for_review`, so a `doc-check` label on a CSS-only pull request would have been filtered out too and the manual override would have silently died. A job-level filter step costs about 20 seconds of runner time and keeps the override working, so the filter lives in the job and the trigger is untouched. **Rejected: negation patterns for the docs-affecting CI carve-out.** `!`-prefixed patterns inside the `nodocs` filter would have made the result depend on pattern order. A separate `ci_docs` filter that must be empty is explicit and reads as what it means. **Deliberately not skipped: `coderd/database/migrations/`.** A migration alone has no user surface, but migrations usually ship next to an API change, and the all-files-must-match rule already handles that case. Left to the agent rather than hardcoded either way. **Known limitation.** A user-facing default change can hide inside an otherwise-skippable path. The all-files-must-match rule plus the label override is the mitigation; a path-only gate cannot close this completely. **Follow-ups this does not do.** Commit-scoped incremental reviews, a `concurrency` block, splitting `SKILL.md` and deleting the rules it restates from the content guidelines, run-outcome reporting so silence and failure are distinguishable, and routing adjacent docs-gap ideas into Linear. </details> DOCS-920 > Generated by Coder Agents on behalf of @nickvigilante.
aqandrew
approved these changes
Sep 15, 2026
jeremyruppel
deleted the
jeremy/devex-977-add-restart-action-to-workspace-overflow-menu
branch
September 16, 2026 14:19
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a
Restart…action to the three-dot overflow menu for each workspace on the/workspacespage (DEVEX-977). Previously users had to open a workspace to restart it.Restart…item inWorkspaceMoreActions, shown only for running workspaces (abilities.actions.includes("restart")), with a confirmation dialog consistent with the existing Stop flow.API.restartWorkspaceresolves only after the full stop→start sequence and the workspaces list has no live (websocket) updates, the row is optimistically set tostoppingwhen the restart begins. This shows progress immediately and flips the list to its fast poll interval, which then tracks the realstopping → starting → runningtransitions. The optimistic change is rolled back if the request fails.Screen.Recording.2026-09-14.at.5.02.36.PM.mov
Changes
WorkspaceMoreActions.tsx: newonRestart/isRestartingprops andRestart…menu item.WorkspacesTable.tsx: restart mutation wired to aConfirmDialog, gated on the running-state ability, with optimistic status update + rollback.api/queries/workspaces.ts:setOptimisticWorkspaceListBuildStatushelper that patches the row's build status across cached list queries and returns a rollback closure.Testing
pnpm --dir site exec vitest run(new/updated tests pass)pnpm --dir site exec tsc --noEmitmake fmt/make lintImplementation plan
DEVEX-977: Add Restart action to the workspace overflow menu
Goal
Add a
Restart…action to the three-dot overflow menu for each workspace row onthe
/workspacespage, so users can restart a running workspace directly from thelist without opening the workspace.
Context / findings
WorkspaceMoreActions(
site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx).It currently renders: Stop, Settings, Change version, Duplicate, Download logs,
and Delete.
Stopis passed in from the parent via anonStopcallback +isStoppingflag, with the confirmation dialog owned by the parent.WorkspaceActionsCellinsidesite/src/pages/WorkspacesPage/WorkspacesTable.tsx. It computesabilitiesvia
abilitiesByWorkspaceStatusand already wires upstopWorkspacemutationplus a
ConfirmDialogfor stop;onStopopens that dialog.abilitiesByWorkspaceStatus(site/src/modules/workspaces/actions.ts) alreadyincludes
"restart"in theactionslist forrunningworkspaces (when notgated behind update-required flows). So the eligibility signal already exists:
abilities.actions.includes("restart").API.restartWorkspace({ workspace, buildParameters }). It performsstop → waitForBuild → start → waitForBuild, returns
void, and bails if thestop is canceled.
Approach
Mirror the existing
onStoppattern so the menu stays a presentational componentand the parent owns the mutation + confirmation dialog.
1.
WorkspacesTable.tsx—WorkspaceActionsCellAPI.restartWorkspacedirectly.onRestart(gated onabilities.actions.includes("restart")) andisRestartingtoWorkspaceMoreActions.ConfirmDialog(type="info") for restart confirmation.table's existing simple
start/stopbehavior.2.
WorkspaceMoreActions.tsxonRestart?/isRestarting?and render aRestart…DropdownMenuItemnext toStop.3. Row status feedback
active build status.
API.restartWorkspaceresolves only at the very end, sothe row would otherwise stay
running. Optimistically set the row tostoppingon mutate (with rollback on error) so the row updates immediatelyand the fast poll tracks the real transitions.
4. Tests
assert
API.restartWorkspaceis called; assert the item is absent for stoppedworkspaces.
Decisions
ConfirmDialog(consistent with Stop) rather than thesingle-page
WarningDialog.consistent with the existing list-view start/stop actions.
🤖 Generated by Coder Agents.