Skip to content

Commit bf42b68

Browse files
fix: use dynamic name on new local workspace.
1 parent 09958ef commit bf42b68

4 files changed

Lines changed: 95 additions & 0 deletions

File tree

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,4 @@ Never:
101101
- Commit secrets or credentials.
102102
- Edit generated output folders unless explicitly requested.
103103
- Modify node_modules or lockfiles unless explicitly requested.
104+
- Reintroduce cross-workspace overwrite/delete behavior with any changes.

playwright/github-pr-drawer/open-pr-create.spec.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,87 @@ test('Local New workspace always creates a new stored workspace snapshot', async
11161116
await expect.poll(async () => countLocalRecords()).toBe(initialLocalRecordCount + 1)
11171117
})
11181118

1119+
test('Local New workspace shows forked head immediately when source workspace has prTitle', async ({
1120+
page,
1121+
}) => {
1122+
const seededWorkspaceId = 'local_seed_title_carryover_guard'
1123+
const seededWorkspaceTitle = 'Seed local context title'
1124+
1125+
await waitForAppReady(page, `${appEntryPath}`)
1126+
1127+
await seedLocalWorkspaceContexts(page, [
1128+
{
1129+
id: seededWorkspaceId,
1130+
repo: '',
1131+
base: 'main',
1132+
head: 'feat/component-seeded-title-guard',
1133+
prTitle: seededWorkspaceTitle,
1134+
prNumber: null,
1135+
prContextState: 'inactive',
1136+
},
1137+
])
1138+
1139+
await page.reload()
1140+
await waitForAppReady(page, `${appEntryPath}`)
1141+
await connectByotWithSingleRepo(page)
1142+
await selectWorkspacesRepositoryFilter(page, '__local__')
1143+
1144+
await page.getByRole('button', { name: 'New workspace', exact: true }).click()
1145+
await expect(page.getByRole('complementary', { name: 'Workspaces' })).toBeHidden()
1146+
1147+
let createdWorkspaceId = ''
1148+
await expect
1149+
.poll(async () => {
1150+
const records = await getAllWorkspaceRecords(page)
1151+
const createdRecord = records.find(record => {
1152+
const id = String(record?.id ?? '').trim()
1153+
const repo = String(record?.repo ?? '').trim()
1154+
const prTitle = String(record?.prTitle ?? '').trim()
1155+
return id !== seededWorkspaceId && !repo && !prTitle
1156+
})
1157+
1158+
createdWorkspaceId = String(createdRecord?.id ?? '').trim()
1159+
return createdWorkspaceId
1160+
})
1161+
.not.toBe('')
1162+
1163+
const createdRecords = await getAllWorkspaceRecords(page)
1164+
const createdRecord = createdRecords.find(record => {
1165+
const id = String(record?.id ?? '').trim()
1166+
return id === createdWorkspaceId
1167+
})
1168+
1169+
const createdHead = String(createdRecord?.head ?? '').trim()
1170+
expect(createdHead).toBeTruthy()
1171+
1172+
await page.getByRole('button', { name: 'Workspaces' }).click()
1173+
await selectWorkspacesRepositoryFilter(page, '__local__')
1174+
1175+
const selectedWorkspaceId = String(
1176+
(await page.locator('#workspaces-select option:checked').getAttribute('value')) ?? '',
1177+
).trim()
1178+
expect(selectedWorkspaceId).not.toBe(seededWorkspaceId)
1179+
1180+
const selectedLabelText = await page
1181+
.locator('#workspaces-select option:checked')
1182+
.textContent()
1183+
const selectedLabel = String(selectedLabelText ?? '').trim()
1184+
1185+
const selectedRecord = createdRecords.find(record => {
1186+
const id = String(record?.id ?? '').trim()
1187+
return id === selectedWorkspaceId
1188+
})
1189+
const selectedHead = String(selectedRecord?.head ?? '').trim()
1190+
const selectedPrTitle = String(selectedRecord?.prTitle ?? '').trim()
1191+
1192+
expect(selectedPrTitle).toBe('')
1193+
expect(selectedHead).toBeTruthy()
1194+
expect(selectedLabel).toBe(selectedHead)
1195+
expect(selectedLabel).not.toBe(seededWorkspaceTitle)
1196+
await expect(page.locator('#workspace-context-status')).toContainText(selectedHead)
1197+
await expect(page.locator('#workspace-context-status')).toContainText('local')
1198+
})
1199+
11191200
test('Non-Local New workspace forks a new repository-scoped workspace when entries exist', async ({
11201201
page,
11211202
}) => {

src/app.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,10 @@ const { syncActiveWorkspaceRepositoryScope, forkWorkspaceFromCurrentState } =
950950
githubPrTitle.value = value
951951
}
952952
},
953+
setActiveWorkspacePersistedMetadata: ({ prTitle, head } = {}) => {
954+
activeWorkspacePersistedPrTitle = toNonEmptyWorkspaceText(prTitle)
955+
activeWorkspacePersistedHeadBranch = toNonEmptyWorkspaceText(head)
956+
},
953957
})
954958

955959
editedIndicatorVisibilityController.setRefreshHandlers({

src/modules/app-core/workspace-scope-fork-actions.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export const createWorkspaceScopeForkActions = ({
2626
setWorkspaceScopeMarker,
2727
setHeadBranchValue,
2828
setPrTitleValue,
29+
setActiveWorkspacePersistedMetadata,
2930
}) => {
3031
const syncActiveWorkspaceRepositoryScope = async (
3132
repositoryFullName,
@@ -172,6 +173,14 @@ export const createWorkspaceScopeForkActions = ({
172173
typeof saved?.createdAt === 'number' && Number.isFinite(saved.createdAt)
173174
? saved.createdAt
174175
: now
176+
177+
if (typeof setActiveWorkspacePersistedMetadata === 'function') {
178+
setActiveWorkspacePersistedMetadata({
179+
prTitle: '',
180+
head: forkedHeadBranch,
181+
})
182+
}
183+
175184
setActiveWorkspaceRecordId(savedId)
176185
setActiveWorkspaceCreatedAt(savedCreatedAt)
177186

0 commit comments

Comments
 (0)