From b1db720d1fecb68a945e77cf5804f9db9f1ec4ee Mon Sep 17 00:00:00 2001 From: tristantr Date: Mon, 1 Jun 2026 15:58:48 +0200 Subject: [PATCH] ui(deploy-to-hub): user-facing rename from "workspace" to "project" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Hub-deploy surface now talks about *projects* (the bundle published to the Hub) instead of *workspaces* (which still means the source tenant). Tab is "Publish project", header copy mentions "project", the Hub URL in the breadcrumb points to /projects/, payload field is `project_slug`. Internal state names (`workspaceItems`, `workspaceStore`, `WorkspaceService`, …) stay — they refer to the instance workspace the items are read from, which has not been renamed. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../workspaceSettings/DeployToHub.svelte | 28 +++++++++---------- .../(logged)/workspace_settings/+page.svelte | 8 +++--- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/frontend/src/lib/components/workspaceSettings/DeployToHub.svelte b/frontend/src/lib/components/workspaceSettings/DeployToHub.svelte index fe1ba1610b..e54cfb5cf7 100644 --- a/frontend/src/lib/components/workspaceSettings/DeployToHub.svelte +++ b/frontend/src/lib/components/workspaceSettings/DeployToHub.svelte @@ -186,7 +186,7 @@ const EMPTY_SCHEMA = { type: 'object', properties: {}, required: [] } let hubSlug = $derived($workspaceStore ?? '') - let hubUrl = $derived(`https://hub.windmill.dev/workspaces/${hubSlug}`) + let hubUrl = $derived(`https://hub.windmill.dev/projects/${hubSlug}`) let hubVersion = $state(0) let deploymentStatus = $state< @@ -307,7 +307,7 @@ workspaceItems = next } catch (e: any) { if (seq === workspaceLoadSeq) { - sendUserToast(`Failed to load workspace items: ${e?.message ?? e}`, true) + sendUserToast(`Failed to load project items: ${e?.message ?? e}`, true) } } finally { if (seq === workspaceLoadSeq) loading = false @@ -631,7 +631,7 @@ language: it.language, schema: it.schema ?? undefined, lockfile: it.lock ?? undefined, - workspace_slug: slug + project_slug: slug }) if (typeof resp?.id === 'number') hubItemIds = { ...hubItemIds, [key]: resp.id } } else if (it.kind === 'flow') { @@ -643,7 +643,7 @@ schema: it.schema ?? undefined }, apps: [], - workspace_slug: slug + project_slug: slug }) if (typeof resp?.id === 'number') hubItemIds = { ...hubItemIds, [key]: resp.id } } else if (it.kind === 'app') { @@ -652,7 +652,7 @@ apps: [], summary: it.summary || it.newPath, description: undefined, - workspace_slug: slug + project_slug: slug }) } else if (it.kind === 'raw_app') { await postHub(workspace, '/hub/raw_apps', { @@ -660,7 +660,7 @@ apps: [], summary: it.summary || it.newPath, description: undefined, - workspace_slug: slug + project_slug: slug }) } } @@ -728,7 +728,7 @@ ) } if (triggers.length === 0) return - await postHub(workspace, '/hub/triggers', { triggers, workspace_slug: slug }) + await postHub(workspace, '/hub/triggers', { triggers, project_slug: slug }) } async function postHub( @@ -860,7 +860,7 @@ name, schema, description, - workspace_slug: slug + project_slug: slug }) return 0 } catch (e: any) { @@ -911,7 +911,7 @@ const stubs = [...stubsByPath.values()] if (stubs.length > 0) { try { - await postHub(workspace, '/hub/resources', { resources: stubs, workspace_slug: slug }) + await postHub(workspace, '/hub/resources', { resources: stubs, project_slug: slug }) } catch (e: any) { sendUserToast(`Resource sync failed: ${e?.message ?? e}`, true) failures++ @@ -1194,7 +1194,7 @@ const path = it.kind === 'script' ? 'scripts' : 'flows' await postHub(workspace, `/hub/${path}/${hubId}/recording`, { recording, - workspace_slug: effectiveSlug || sanitizeSlug(hubName) + project_slug: effectiveSlug || sanitizeSlug(hubName) }) recordings = { ...recordings, [it.key]: runJobId } patchItem(it.key, { rec: 'recorded' }) @@ -1270,7 +1270,7 @@ onToggleItem={toggleItem} onSelectAll={selectAll} onDeselectAll={deselectAll} - emptyMessage={loading ? 'Loading workspace items…' : 'No items to publish'} + emptyMessage={loading ? 'Loading project items…' : 'No items to publish'} > {#snippet header()} {@const stepNum = @@ -1280,11 +1280,11 @@ class="flex flex-col gap-2 rounded-md border bg-surface-secondary p-3 text-xs text-secondary" > - How to publish your workspace to the Hub + How to publish your project to the Hub
  • 1 ? 'opacity-60' : ''}> {stepNum > 1 ? '✓' : '1.'} - Bundle your workspace — pack every script, + Bundle your project — pack every script, flow, app and resource into a single draft.
  • 2 ? 'opacity-60' : 'opacity-40'}> @@ -1299,7 +1299,7 @@
    {#if phase === 'predeploy'} - Step 1: Bundle your workspace + Step 1: Bundle your project {:else if phase === 'draft'} Step 2: Generate iframes & recordings diff --git a/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte b/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte index 24b0df090e..7df9348a81 100644 --- a/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/workspace_settings/+page.svelte @@ -1103,9 +1103,9 @@ }, { id: 'hub', - label: 'Deploy to Hub', + label: 'Publish project', aiId: 'workspace-settings-hub', - aiDescription: 'Publish this workspace to the Hub' + aiDescription: 'Publish a project from this workspace to the Hub' } ] }, @@ -1968,8 +1968,8 @@ export async function main( /> {:else if tab == 'hub'}