Re-run setup and cleanup scripts (#1981)
## Summary I've implemented the "re-run setup/cleanup script" functionality in the new UI command bar. The changes include: ### Files Modified 1. **`frontend/src/components/ui-new/actions/index.ts`** - Added `isAttemptRunning: boolean` to `ActionVisibilityContext` interface (line 109) - Added `RunSetupScript` and `RunCleanupScript` workspace actions (lines 737-777) - Both actions use the existing `attemptsApi.runSetupScript/runCleanupScript` methods - Actions are disabled when `isAttemptRunning` is true - Error handling for `no_script_configured` and `process_already_running` errors 2. **`frontend/src/components/ui-new/actions/useActionVisibility.ts`** - Import `useExecutionProcessesContext` - Added `isAttemptRunningVisible` to the hook call - Added `isAttemptRunning: isAttemptRunningVisible` to the returned context 3. **`frontend/src/components/ui-new/actions/pages.ts`** - Added a new "Scripts" group to the `workspaceActions` page containing both actions ### Testing The dev server is running at: - Frontend: http://localhost:3000/ - Backend: http://127.0.0.1:3001 To test: 1. Navigate to the new UI (`/workspaces`) 2. Select a workspace 3. Open the command bar (CMD+K) 4. Navigate to "Workspace Actions" 5. You should see a "Scripts" group with "Run Setup Script" and "Run Cleanup Script" options
This commit is contained in:
committed by
GitHub
parent
20b99300fe
commit
7bc52ac8c5
@@ -104,6 +104,9 @@ export interface ActionVisibilityContext {
|
|||||||
hasMultipleRepos: boolean;
|
hasMultipleRepos: boolean;
|
||||||
hasOpenPR: boolean;
|
hasOpenPR: boolean;
|
||||||
hasUnpushedCommits: boolean;
|
hasUnpushedCommits: boolean;
|
||||||
|
|
||||||
|
// Execution state
|
||||||
|
isAttemptRunning: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Base properties shared by all actions
|
// Base properties shared by all actions
|
||||||
@@ -729,6 +732,49 @@ export const Actions = {
|
|||||||
invalidateWorkspaceQueries(ctx.queryClient, workspaceId);
|
invalidateWorkspaceQueries(ctx.queryClient, workspaceId);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// === Script Actions ===
|
||||||
|
RunSetupScript: {
|
||||||
|
id: 'run-setup-script',
|
||||||
|
label: 'Run Setup Script',
|
||||||
|
icon: TerminalIcon,
|
||||||
|
requiresTarget: true,
|
||||||
|
isVisible: (ctx) => ctx.hasWorkspace,
|
||||||
|
isEnabled: (ctx) => !ctx.isAttemptRunning,
|
||||||
|
execute: async (_ctx, workspaceId) => {
|
||||||
|
const result = await attemptsApi.runSetupScript(workspaceId);
|
||||||
|
if (!result.success) {
|
||||||
|
if (result.error?.type === 'no_script_configured') {
|
||||||
|
throw new Error('No setup script configured for this project');
|
||||||
|
}
|
||||||
|
if (result.error?.type === 'process_already_running') {
|
||||||
|
throw new Error('Cannot run script while another process is running');
|
||||||
|
}
|
||||||
|
throw new Error('Failed to run setup script');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
RunCleanupScript: {
|
||||||
|
id: 'run-cleanup-script',
|
||||||
|
label: 'Run Cleanup Script',
|
||||||
|
icon: TerminalIcon,
|
||||||
|
requiresTarget: true,
|
||||||
|
isVisible: (ctx) => ctx.hasWorkspace,
|
||||||
|
isEnabled: (ctx) => !ctx.isAttemptRunning,
|
||||||
|
execute: async (_ctx, workspaceId) => {
|
||||||
|
const result = await attemptsApi.runCleanupScript(workspaceId);
|
||||||
|
if (!result.success) {
|
||||||
|
if (result.error?.type === 'no_script_configured') {
|
||||||
|
throw new Error('No cleanup script configured for this project');
|
||||||
|
}
|
||||||
|
if (result.error?.type === 'process_already_running') {
|
||||||
|
throw new Error('Cannot run script while another process is running');
|
||||||
|
}
|
||||||
|
throw new Error('Failed to run cleanup script');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const satisfies Record<string, ActionDefinition>;
|
} as const satisfies Record<string, ActionDefinition>;
|
||||||
|
|
||||||
// Helper to resolve dynamic label
|
// Helper to resolve dynamic label
|
||||||
|
|||||||
@@ -110,6 +110,14 @@ export const Pages: Record<StaticPageId, CommandBarPage> = {
|
|||||||
{ type: 'action', action: Actions.DeleteWorkspace },
|
{ type: 'action', action: Actions.DeleteWorkspace },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: 'group',
|
||||||
|
label: 'Scripts',
|
||||||
|
items: [
|
||||||
|
{ type: 'action', action: Actions.RunSetupScript },
|
||||||
|
{ type: 'action', action: Actions.RunCleanupScript },
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { useWorkspaceContext } from '@/contexts/WorkspaceContext';
|
|||||||
import { useUserSystem } from '@/components/ConfigProvider';
|
import { useUserSystem } from '@/components/ConfigProvider';
|
||||||
import { useDevServer } from '@/hooks/useDevServer';
|
import { useDevServer } from '@/hooks/useDevServer';
|
||||||
import { useBranchStatus } from '@/hooks/useBranchStatus';
|
import { useBranchStatus } from '@/hooks/useBranchStatus';
|
||||||
|
import { useExecutionProcessesContext } from '@/contexts/ExecutionProcessesContext';
|
||||||
import type { Workspace, Merge } from 'shared/types';
|
import type { Workspace, Merge } from 'shared/types';
|
||||||
import type {
|
import type {
|
||||||
ActionVisibilityContext,
|
ActionVisibilityContext,
|
||||||
@@ -31,6 +32,7 @@ export function useActionVisibilityContext(): ActionVisibilityContext {
|
|||||||
const { isStarting, isStopping, runningDevServers } =
|
const { isStarting, isStopping, runningDevServers } =
|
||||||
useDevServer(workspaceId);
|
useDevServer(workspaceId);
|
||||||
const { data: branchStatus } = useBranchStatus(workspaceId);
|
const { data: branchStatus } = useBranchStatus(workspaceId);
|
||||||
|
const { isAttemptRunningVisible } = useExecutionProcessesContext();
|
||||||
|
|
||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
// Compute isAllDiffsExpanded
|
// Compute isAllDiffsExpanded
|
||||||
@@ -79,6 +81,7 @@ export function useActionVisibilityContext(): ActionVisibilityContext {
|
|||||||
hasMultipleRepos: repos.length > 1,
|
hasMultipleRepos: repos.length > 1,
|
||||||
hasOpenPR,
|
hasOpenPR,
|
||||||
hasUnpushedCommits,
|
hasUnpushedCommits,
|
||||||
|
isAttemptRunning: isAttemptRunningVisible,
|
||||||
};
|
};
|
||||||
}, [
|
}, [
|
||||||
layout.isChangesMode,
|
layout.isChangesMode,
|
||||||
@@ -98,6 +101,7 @@ export function useActionVisibilityContext(): ActionVisibilityContext {
|
|||||||
isStopping,
|
isStopping,
|
||||||
runningDevServers,
|
runningDevServers,
|
||||||
branchStatus,
|
branchStatus,
|
||||||
|
isAttemptRunningVisible,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user