Skip to content

Commit 35e39d5

Browse files
author
DavidQ
committed
Remove deprecated Workspace V2 and fix Workspace Manager status clear behavior - PR_26127_011-workspace-v2-cleanup-and-status-clear-fix
1 parent c010582 commit 35e39d5

13 files changed

Lines changed: 47 additions & 363 deletions
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# PR_26127_011-workspace-v2-cleanup-and-status-clear-fix
2+
3+
## Summary
4+
- Deleted deprecated `tools/workspace-v2` files and removed the empty directory from the working tree.
5+
- Updated the Workspace V2 validation gate to run Workspace Manager V2 coverage only.
6+
- Removed legacy Workspace V2 coverage/report registration.
7+
- Removed the Workspace Manager V2 `Load Asteroids` menu control and action wiring.
8+
- Fixed Status `Clear` so it clears only log content and does not toggle the accordion.
9+
- Kept Workspace JSON copy button label as `copy`.
10+
- Preserved Pong and Gravity Well manifest cleanup; `assets.image.background.preview` was not re-added.
11+
12+
## Validation
13+
- PASS: `npm run test:workspace-v2`
14+
- PASS: Confirmed `tools/workspace-v2` no longer exists.
15+
- PASS: Confirmed no Playwright/package/tool references launch or validate deprecated `tools/workspace-v2`.
16+
- PASS: Confirmed sample JSON files were not modified.
17+
- SKIPPED: Full samples smoke test, per Workspace V2 cleanup scope.
18+
19+
## Notes
20+
- `test:workspace-v2` now targets `tests/playwright/tools/WorkspaceManagerV2.spec.mjs` as the Workspace Manager V2 gate.
21+
- Gravity Well and Pong manifest tests now assert the current single preview asset state and explicitly verify `assets.image.background.preview` remains absent.
22+
- Status `Clear` now stops event propagation before clearing the log textarea, keeping the accordion expanded/collapsed state unchanged.

docs/dev/workspace_v2_playwright_gate.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# Workspace V2 Playwright Validation Gate
1+
# Workspace Manager V2 Playwright Validation Gate
22

3-
Use this gate for repeatable local validation of Workspace V2 UI behavior.
3+
Use this gate for repeatable local validation of Workspace Manager V2 UI behavior.
44

55
## Command
66
- `npm run test:workspace-v2`
77

88
## What It Runs
9-
- Executes the installed Playwright UI regression command for Workspace V2.
9+
- Executes the installed Playwright UI regression command for Workspace Manager V2.
1010
- Fails fast and returns a non-zero exit code on any test failure.
1111

1212
## Output Paths
@@ -26,5 +26,5 @@ Use this gate for repeatable local validation of Workspace V2 UI behavior.
2626
- CI/local gate should treat this as a hard failure
2727

2828
## Smoke Test Policy
29-
- For Workspace V2 gate-only PRs, full samples smoke test should be skipped.
29+
- For Workspace Manager V2 gate-only PRs, full samples smoke test should be skipped.
3030
- Run full samples smoke only when shared sample framework/runtime is changed.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"codex:review-artifacts": "node ./scripts/write-codex-review-artifacts.mjs",
1515
"test:asset-manager-v2": "playwright test tests/playwright/tools/AssetManagerV2.spec.mjs --project=playwright --workers=1 --reporter=list",
1616
"test:preview-generator-v2": "playwright test tests/playwright/tools/PreviewGeneratorV2Baseline.spec.mjs --project=playwright --workers=1 --reporter=list",
17-
"test:workspace-v2": "playwright test tests/playwright/tools/AssetManagerV2.spec.mjs tests/playwright/tools/PreviewGeneratorV2Baseline.spec.mjs tests/playwright/tools/WorkspaceManagerV2.spec.mjs --project=playwright --workers=1 --reporter=list",
17+
"test:workspace-v2": "playwright test tests/playwright/tools/WorkspaceManagerV2.spec.mjs --project=playwright --workers=1 --reporter=list",
1818
"test:launch-smoke": "node ./tests/runtime/LaunchSmokeAllEntries.test.mjs",
1919
"test:launch-smoke:games": "node ./tests/runtime/LaunchSmokeAllEntries.test.mjs --games",
2020
"test:workspace-manager:games": "node ./tests/runtime/GamesIndexWorkspaceManagerOpen.test.mjs",

tests/helpers/playwrightV8CoverageReporter.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,6 @@ export class PlaywrightV8CoverageReporter {
326326
{ name: "Asset Manager V2", prefix: "tools/asset-manager-v2/" },
327327
{ name: "Palette Manager V2", prefix: "tools/palette-manager-v2/" },
328328
{ name: "Tool Template V2", prefix: "tools/templates-v2/" },
329-
{ name: "Workspace V2", prefix: "tools/workspace-v2/" },
330329
{ name: "Workspace Manager V2", prefix: "tools/workspace-manager-v2/" },
331330
{ name: "Workspace Manager", prefix: "tools/workspace-manager/" }
332331
];

tests/playwright/tools/WorkspaceManagerV2.spec.mjs

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -166,18 +166,26 @@ test.describe("Workspace Manager V2 bootstrap", () => {
166166
await expect(page.locator("#importManifestButton")).toHaveText("Import Manifest");
167167
await expect(page.locator("#exportManifestButton")).toBeDisabled();
168168
await expect(page.locator("#seedUatManifestButton")).toBeHidden();
169-
await expect(page.locator("#loadAsteroidsButton")).toHaveText("Load Asteroids");
169+
await expect(page.locator("#loadAsteroidsButton")).toHaveCount(0);
170170
await expect(page.locator("#launchAssetManagerV2Button")).toHaveCount(0);
171171
await expect(page.locator("#workspaceToolsContent #workspaceToolTiles")).toBeVisible();
172172
await expect(page.locator("#workspaceContextContent")).toHaveCount(0);
173173
await expect(page.locator("#workspaceJsonContent #workspaceContextOutput")).toBeVisible();
174-
await expect(page.locator("#copyWorkspaceJsonButton")).toHaveText("[copy]");
174+
await expect(page.locator("#copyWorkspaceJsonButton")).toHaveText("copy");
175175
const centerControlLabels = await page.locator(".workspace-manager-v2__panel--center > .accordion-v2 > .accordion-v2__header > span:first-child")
176176
.evaluateAll((labels) => labels.map((label) => label.textContent.trim()));
177177
expect(centerControlLabels).toEqual(["Tools", "Workspace JSON"]);
178178
await expect(page.locator(".workspace-manager-v2__status-accordion-header")).toContainText("Status");
179179
const statusHeaderOrder = await page.locator(".workspace-manager-v2__status-accordion-header").evaluate((header) => Array.from(header.querySelectorAll(":scope > span, :scope > div > span, :scope > div > button"), (element) => element.textContent.trim()));
180180
expect(statusHeaderOrder).toEqual(["Status", "+", "Clear"]);
181+
const statusHeader = page.locator('.workspace-manager-v2__status-accordion-header[aria-controls="statusLogContent"]');
182+
const statusContent = page.locator("#statusLogContent");
183+
await expect(statusHeader).toHaveAttribute("aria-expanded", "true");
184+
await expect(statusContent).toBeVisible();
185+
await page.locator("#clearStatusButton").click();
186+
await expect(page.locator("#statusLog")).toHaveValue("");
187+
await expect(statusHeader).toHaveAttribute("aria-expanded", "true");
188+
await expect(statusContent).toBeVisible();
181189
await expect(page.locator(".workspace-manager-v2__tool-group-title")).toHaveText(["Editors", "Utilities", "Viewers"]);
182190
await expect(page.locator("#workspaceToolTiles [data-workspace-tool-id]")).toHaveCount(4);
183191
await expect(page.locator('[data-workspace-tool-id="workspace-manager-v2"]')).toHaveCount(0);
@@ -607,10 +615,10 @@ test.describe("Workspace Manager V2 bootstrap", () => {
607615
await expect(page.locator("#activeGameSummary")).toContainText("games/GravityWell/");
608616
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"gameRoot": "games\/GravityWell\/"/);
609617
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"assetsPath": "games\/GravityWell\/assets"/);
610-
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"assets.image.background.preview"/);
611618
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"assets.image.preview.preview"/);
619+
await expect(page.locator("#workspaceContextOutput")).not.toHaveValue(/"assets.image.background.preview"/);
612620
await expect(page.locator("#workspaceContextOutput")).not.toHaveValue(/"asset-browser"|"palette-browser"|"vector-map-editor"/);
613-
await expect(page.locator('[data-workspace-tool-id="asset-manager-v2"]')).toContainText("2 managed assets");
621+
await expect(page.locator('[data-workspace-tool-id="asset-manager-v2"]')).toContainText("1 managed assets");
614622
await expect(page.locator('[data-workspace-tool-id="palette-manager-v2"]')).toContainText("10 palette swatches");
615623
const gravityManifest = JSON.parse(await page.locator("#workspaceContextOutput").inputValue());
616624
expect(Object.keys(gravityManifest.tools).sort()).toEqual(["asset-manager-v2", "palette-manager-v2"]);
@@ -621,25 +629,16 @@ test.describe("Workspace Manager V2 bootstrap", () => {
621629
role: "preview",
622630
source: "manifest"
623631
});
624-
expect(gravityManifest.tools["asset-manager-v2"].assets["assets.image.background.preview"]).toEqual({
625-
path: "assets/images/preview.svg",
626-
type: "image",
627-
kind: "svg",
628-
role: "background",
629-
source: "manifest",
630-
stretchOverride: {
631-
uniformEdgeStretchPx: 0
632-
}
633-
});
632+
expect(gravityManifest.tools["asset-manager-v2"].assets["assets.image.background.preview"]).toBeUndefined();
634633

635634
await page.locator("#activeGameSelect").selectOption("Pong");
636635
await expect(page.locator("#activeGameSummary")).toContainText("games/Pong/");
637636
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"gameRoot": "games\/Pong\/"/);
638637
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"assetsPath": "games\/Pong\/assets"/);
639-
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"assets.image.background.preview"/);
640638
await expect(page.locator("#workspaceContextOutput")).toHaveValue(/"assets.image.preview.preview"/);
639+
await expect(page.locator("#workspaceContextOutput")).not.toHaveValue(/"assets.image.background.preview"/);
641640
await expect(page.locator("#workspaceContextOutput")).not.toHaveValue(/"asset-browser"|"palette-browser"|"vector-map-editor"/);
642-
await expect(page.locator('[data-workspace-tool-id="asset-manager-v2"]')).toContainText("2 managed assets");
641+
await expect(page.locator('[data-workspace-tool-id="asset-manager-v2"]')).toContainText("1 managed assets");
643642
await expect(page.locator('[data-workspace-tool-id="palette-manager-v2"]')).toContainText("8 palette swatches");
644643
const pongManifest = JSON.parse(await page.locator("#workspaceContextOutput").inputValue());
645644
expect(Object.keys(pongManifest.tools).sort()).toEqual(["asset-manager-v2", "palette-manager-v2"]);
@@ -650,16 +649,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
650649
role: "preview",
651650
source: "manifest"
652651
});
653-
expect(pongManifest.tools["asset-manager-v2"].assets["assets.image.background.preview"]).toEqual({
654-
path: "assets/images/preview.svg",
655-
type: "image",
656-
kind: "svg",
657-
role: "background",
658-
source: "manifest",
659-
stretchOverride: {
660-
uniformEdgeStretchPx: 0
661-
}
662-
});
652+
expect(pongManifest.tools["asset-manager-v2"].assets["assets.image.background.preview"]).toBeUndefined();
663653

664654
expect(pageErrors).toEqual([]);
665655
} finally {

tools/workspace-manager-v2/index.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ <h2 class="tools-platform-frame__eyebrow">Games-only launch context</h2>
3838
<input id="importManifestInput" type="file" accept=".json,application/json" hidden>
3939
<button id="exportManifestButton" type="button" disabled>Export Manifest</button>
4040
<button id="seedUatManifestButton" type="button" hidden>UAT</button>
41-
<button id="loadAsteroidsButton" type="button">Load Asteroids</button>
4241
</nav>
4342

4443
<main class="workspace-manager-v2 app-shell" data-tool-id="workspace-manager-v2">
@@ -74,7 +73,7 @@ <h2 class="tools-platform-frame__eyebrow">Games-only launch context</h2>
7473
<span>Workspace JSON</span>
7574
<span class="workspace-manager-v2__json-header-actions">
7675
<span class="accordion-v2__icon" aria-hidden="true">+</span>
77-
<button id="copyWorkspaceJsonButton" class="workspace-manager-v2__json-copy-button" type="button">Copy</button>
76+
<button id="copyWorkspaceJsonButton" class="workspace-manager-v2__json-copy-button" type="button">copy</button>
7877
</span>
7978
</div>
8079
<div id="workspaceJsonContent" class="accordion-v2__content">

tools/workspace-manager-v2/js/WorkspaceManagerV2App.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@ export class WorkspaceManagerV2App {
3838
onImportManifest: (file) => {
3939
void this.importWorkspaceManifest(file);
4040
},
41-
onLoadAsteroids: () => {
42-
void this.selectGame("Asteroids");
43-
},
4441
onSeedUat: () => {
4542
void this.seedTemporaryUatManifest();
4643
}

tools/workspace-manager-v2/js/bootstrap.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ window.addEventListener("DOMContentLoaded", () => {
2727
exportButton: requireElement("#exportManifestButton"),
2828
importButton: requireElement("#importManifestButton"),
2929
importInput: requireElement("#importManifestInput"),
30-
loadAsteroidsButton: requireElement("#loadAsteroidsButton"),
3130
uatButton: requireElement("#seedUatManifestButton")
3231
}),
3332
statusLog: new StatusLogControl({

tools/workspace-manager-v2/js/controls/ManifestMenuControl.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,18 @@ export class ManifestMenuControl {
33
exportButton,
44
importButton,
55
importInput,
6-
loadAsteroidsButton,
76
uatButton
87
}) {
98
this.exportButton = exportButton;
109
this.importButton = importButton;
1110
this.importInput = importInput;
12-
this.loadAsteroidsButton = loadAsteroidsButton;
1311
this.uatButton = uatButton;
1412
}
1513

1614
mount({
1715
isUatMode,
1816
onExportManifest,
1917
onImportManifest,
20-
onLoadAsteroids,
2118
onSeedUat
2219
}) {
2320
this.importButton.addEventListener("click", () => {
@@ -28,7 +25,6 @@ export class ManifestMenuControl {
2825
onImportManifest(this.importInput.files?.[0] || null);
2926
});
3027
this.exportButton.addEventListener("click", onExportManifest);
31-
this.loadAsteroidsButton.addEventListener("click", onLoadAsteroids);
3228
this.uatButton.addEventListener("click", onSeedUat);
3329
this.uatButton.hidden = !isUatMode;
3430
}

tools/workspace-manager-v2/js/controls/StatusLogControl.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ export class StatusLogControl {
55
}
66

77
mount() {
8-
this.clearButton.addEventListener("click", () => {
8+
this.clearButton.addEventListener("click", (event) => {
9+
event.preventDefault();
10+
event.stopPropagation();
911
this.log.value = "";
1012
});
1113
}

0 commit comments

Comments
 (0)