Skip to content

Commit b247622

Browse files
fix: use dynamic name on new local workspace. (#134)
1 parent 09958ef commit b247622

4 files changed

Lines changed: 99 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: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,91 @@ 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 storedWorkspaceSelect = page.getByRole('combobox', {
1176+
name: 'Stored workspace',
1177+
})
1178+
const selectedWorkspaceId = String(
1179+
await storedWorkspaceSelect.evaluate(element => (element as HTMLSelectElement).value),
1180+
).trim()
1181+
expect(selectedWorkspaceId).not.toBe(seededWorkspaceId)
1182+
1183+
const selectedLabelText = await storedWorkspaceSelect.evaluate(element => {
1184+
const select = element as HTMLSelectElement
1185+
return select.selectedOptions.item(0)?.textContent ?? ''
1186+
})
1187+
const selectedLabel = String(selectedLabelText ?? '').trim()
1188+
1189+
const selectedRecord = createdRecords.find(record => {
1190+
const id = String(record?.id ?? '').trim()
1191+
return id === selectedWorkspaceId
1192+
})
1193+
const selectedHead = String(selectedRecord?.head ?? '').trim()
1194+
const selectedPrTitle = String(selectedRecord?.prTitle ?? '').trim()
1195+
1196+
expect(selectedPrTitle).toBe('')
1197+
expect(selectedHead).toBeTruthy()
1198+
expect(selectedLabel).toBe(selectedHead)
1199+
expect(selectedLabel).not.toBe(seededWorkspaceTitle)
1200+
await expect(page.locator('#workspace-context-status')).toContainText(selectedHead)
1201+
await expect(page.locator('#workspace-context-status')).toContainText('local')
1202+
})
1203+
11191204
test('Non-Local New workspace forks a new repository-scoped workspace when entries exist', async ({
11201205
page,
11211206
}) => {

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)