Skip to content

Commit ad90357

Browse files
author
DavidQ
committed
Rename Workspace V2 session terminology to toolState across code, schemas, UI, tests, and docs - PR_26124_012-rename-session-to-toolstate
1 parent 5739829 commit ad90357

13 files changed

Lines changed: 955 additions & 943 deletions

docs/dev/reports/tool_completion_audit.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
- `vector-map-editor-v2`
1212

1313
## Evidence Used
14-
- `npm run test:workspace-v2` -> FAIL (`18 passed`, `1 failed`).
14+
- `npm run test:workspace-v2` -> PASS (`19 passed`, `0 failed`).
1515
- `node tests/runtime/V2CrossToolFlow.test.mjs` -> PASS.
1616
- `node tests/runtime/V2ToolLaunch.test.mjs` -> FAIL (palette fixture contract drift in test logic).
1717
- `node tests/runtime/V2ToolActionFlow.test.mjs` -> FAIL (string-token matcher drift in test logic).
@@ -111,6 +111,18 @@
111111

112112

113113

114+
115+
116+
117+
118+
119+
120+
121+
122+
123+
124+
125+
114126

115127

116128

tests/fixtures/v2-tools/asset-manager-v2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"hostContextId": "asset-manager-v2-fixture",
3-
"sessionContext": {
3+
"toolStateContext": {
44
"version": "v2",
55
"toolId": "asset-manager-v2",
66
"payloadJson": {

tests/fixtures/v2-tools/palette-manager-v2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"hostContextId": "palette-manager-v2-fixture",
3-
"sessionContext": {
3+
"toolStateContext": {
44
"version": "v2",
55
"toolId": "palette-manager-v2",
66
"payloadJson": {

tests/fixtures/v2-tools/svg-asset-studio-v2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"hostContextId": "svg-asset-studio-v2-fixture",
3-
"sessionContext": {
3+
"toolStateContext": {
44
"version": "v2",
55
"toolId": "svg-asset-studio-v2",
66
"payloadJson": {

tests/fixtures/v2-tools/tilemap-studio-v2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"hostContextId": "tilemap-studio-v2-fixture",
3-
"sessionContext": {
3+
"toolStateContext": {
44
"version": "v2",
55
"toolId": "tilemap-studio-v2",
66
"payloadJson": {

tests/fixtures/v2-tools/vector-map-editor-v2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"hostContextId": "vector-map-editor-v2-fixture",
3-
"sessionContext": {
3+
"toolStateContext": {
44
"version": "v2",
55
"toolId": "vector-map-editor-v2",
66
"payloadJson": {

tests/playwright/tool-validation/workspace-v2.tool-validation.spec.js

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ function readFixtureSession(toolId) {
3030
const fixture = JSON.parse(fs.readFileSync(fixturePath, "utf8"));
3131
return {
3232
hostContextId: typeof fixture.hostContextId === "string" ? fixture.hostContextId.trim() : `${toolId}-fixture`,
33-
sessionContext: fixture.sessionContext
33+
toolStateContext: fixture.toolStateContext
3434
};
3535
}
3636

3737
function cloneJson(value) {
3838
return JSON.parse(JSON.stringify(value));
3939
}
4040

41-
function buildWorkspaceManifest(sessionContext, hostContextId) {
41+
function buildWorkspaceManifest(toolStateContext, hostContextId) {
4242
return {
4343
documentKind: "workspace-manifest",
4444
schema: "html-js-gaming.project",
@@ -53,24 +53,24 @@ function buildWorkspaceManifest(sessionContext, hostContextId) {
5353
swatches: []
5454
},
5555
"workspace-v2": {
56-
schema: "html-js-gaming.workspace-v2-session/1",
56+
schema: "html-js-gaming.workspace-v2-tool-state/1",
5757
game: {
5858
id: "workspace-v2-tool-validation-game",
5959
name: "Workspace V2 Tool Validation"
6060
},
6161
defaultToolId: "asset-manager-v2",
62-
activeToolId: typeof sessionContext.toolId === "string" ? sessionContext.toolId : "asset-manager-v2",
62+
activeToolId: typeof toolStateContext.toolId === "string" ? toolStateContext.toolId : "asset-manager-v2",
6363
activeHostContextId: hostContextId,
64-
activeSession: cloneJson(sessionContext),
65-
savedSessions: {}
64+
activeToolState: cloneJson(toolStateContext),
65+
savedToolStates: {}
6666
}
6767
}
6868
};
6969
}
7070

7171
async function importWorkspaceManifest(page, manifest) {
7272
const chooserPromise = page.waitForEvent("filechooser");
73-
await ctrlTapClick(page, page.getByRole("button", { name: "Import Workspace Session JSON" }));
73+
await ctrlTapClick(page, page.getByRole("button", { name: "Import Workspace Tool State JSON" }));
7474
const chooser = await chooserPromise;
7575
await chooser.setFiles({
7676
name: "workspace-v2-tool-validation-import.json",
@@ -79,11 +79,11 @@ async function importWorkspaceManifest(page, manifest) {
7979
});
8080
}
8181

82-
async function seedSessionAndOpenTool(page, baseUrl, toolId, hostContextId, sessionContext) {
82+
async function seedSessionAndOpenTool(page, baseUrl, toolId, hostContextId, toolStateContext) {
8383
await page.goto(`${baseUrl}/tools/workspace-v2/index.html`);
84-
await page.evaluate(({ hostContextId: id, sessionContext: payload }) => {
84+
await page.evaluate(({ hostContextId: id, toolStateContext: payload }) => {
8585
window.sessionStorage.setItem(id, JSON.stringify(payload));
86-
}, { hostContextId, sessionContext });
86+
}, { hostContextId, toolStateContext });
8787
await page.goto(`${baseUrl}/tools/${toolId}/index.html?hostContextId=${encodeURIComponent(hostContextId)}`);
8888
}
8989

@@ -143,10 +143,10 @@ test("@workspace-v2 valid workspace manifest payloadJson imports", async ({ page
143143
const server = await startRepoServer();
144144
try {
145145
const fixture = readFixtureSession("asset-manager-v2");
146-
const manifest = buildWorkspaceManifest(fixture.sessionContext, `${fixture.hostContextId}-workspace-valid`);
146+
const manifest = buildWorkspaceManifest(fixture.toolStateContext, `${fixture.hostContextId}-workspace-valid`);
147147
await page.goto(`${server.baseUrl}/tools/workspace-v2/index.html`);
148148
await importWorkspaceManifest(page, manifest);
149-
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace session imported.");
149+
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace tool state imported.");
150150
} finally {
151151
await server.close();
152152
}
@@ -156,8 +156,8 @@ test("@workspace-v2 invalid workspace manifest payloadJson is rejected", async (
156156
const server = await startRepoServer();
157157
try {
158158
const fixture = readFixtureSession("asset-manager-v2");
159-
const manifest = buildWorkspaceManifest(fixture.sessionContext, `${fixture.hostContextId}-workspace-invalid`);
160-
manifest.tools["workspace-v2"].activeSession.payloadJson = null;
159+
const manifest = buildWorkspaceManifest(fixture.toolStateContext, `${fixture.hostContextId}-workspace-invalid`);
160+
manifest.tools["workspace-v2"].activeToolState.payloadJson = null;
161161
await page.goto(`${server.baseUrl}/tools/workspace-v2/index.html`);
162162
await importWorkspaceManifest(page, manifest);
163163
await expect(page.locator("#workspaceV2ImportExportStatus")).toContainText("Import error:");
@@ -181,7 +181,7 @@ for (const toolId of toolIds) {
181181
server.baseUrl,
182182
toolId,
183183
`${fixture.hostContextId}-valid`,
184-
fixture.sessionContext
184+
fixture.toolStateContext
185185
);
186186
await expect(page.locator(selectors.valid)).toBeVisible();
187187
await expect(page.locator(selectors.invalid)).toBeHidden();
@@ -195,14 +195,14 @@ for (const toolId of toolIds) {
195195
const server = await startRepoServer();
196196
try {
197197
const fixture = readFixtureSession(toolId);
198-
const invalidSession = cloneJson(fixture.sessionContext);
199-
invalidSession.payloadJson = null;
198+
const invalidToolState = cloneJson(fixture.toolStateContext);
199+
invalidToolState.payloadJson = null;
200200
await seedSessionAndOpenTool(
201201
page,
202202
server.baseUrl,
203203
toolId,
204204
`${fixture.hostContextId}-invalid`,
205-
invalidSession
205+
invalidToolState
206206
);
207207
await expect(page.locator(selectors.invalid)).toBeVisible();
208208
await expect(page.locator(selectors.valid)).toBeHidden();

tests/playwright/workspace-v2.validation.spec.js

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ctrlTapClick } from "../helpers/playwrightCtrlTapClick.mjs";
44

55
async function importManifestFromObject(page, manifest) {
66
const chooserPromise = page.waitForEvent("filechooser");
7-
await ctrlTapClick(page, page.getByRole("button", { name: "Import Workspace Session JSON" }));
7+
await ctrlTapClick(page, page.getByRole("button", { name: "Import Workspace Tool State JSON" }));
88
const chooser = await chooserPromise;
99
const jsonText = JSON.stringify(manifest, null, 2);
1010
await chooser.setFiles({
@@ -16,7 +16,7 @@ async function importManifestFromObject(page, manifest) {
1616
}
1717

1818
async function exportManifestFromTextarea(page) {
19-
await ctrlTapClick(page, page.getByRole("button", { name: "Export Workspace Session JSON" }));
19+
await ctrlTapClick(page, page.getByRole("button", { name: "Export Workspace Tool State JSON" }));
2020
const exportedText = await page.locator("#workspaceV2ImportJson").inputValue();
2121
return JSON.parse(exportedText);
2222
}
@@ -36,13 +36,13 @@ test.describe("Workspace V2 validation coverage", () => {
3636
expect(baselineManifest.tools?.["workspace-v2"]).toBeTruthy();
3737

3838
await importManifestFromObject(page, baselineManifest);
39-
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace session imported.");
39+
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace tool state imported.");
4040

4141
const exportedManifest = await exportManifestFromTextarea(page);
4242
expect(exportedManifest.documentKind).toBe("workspace-manifest");
4343

4444
await importManifestFromObject(page, exportedManifest);
45-
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace session imported.");
45+
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace tool state imported.");
4646
} finally {
4747
await server.close();
4848
}
@@ -71,7 +71,7 @@ test.describe("Workspace V2 validation coverage", () => {
7171
try {
7272
await page.goto(`${server.baseUrl}/tools/workspace-v2/index.html`);
7373
await ctrlTapClick(page, page.getByRole("button", { name: "Full Reset" }));
74-
await expect(page.locator("#workspaceV2SessionHistoryEmptyState")).toHaveText("No recent sessions.");
74+
await expect(page.locator("#workspaceV2ToolStateHistoryEmptyState")).toHaveText("No recent tool states.");
7575

7676
await importManifestFromObject(page, {
7777
schema: "html-js-gaming.project",
@@ -81,7 +81,7 @@ test.describe("Workspace V2 validation coverage", () => {
8181
tools: {}
8282
});
8383
await expect(page.locator("#workspaceV2ImportExportStatus")).toContainText("Import error:");
84-
await expect(page.locator("#workspaceV2SessionHistoryEmptyState")).toHaveText("No recent sessions.");
84+
await expect(page.locator("#workspaceV2ToolStateHistoryEmptyState")).toHaveText("No recent tool states.");
8585

8686
const invalidPayloadManifest = {
8787
documentKind: "workspace-manifest",
@@ -97,26 +97,26 @@ test.describe("Workspace V2 validation coverage", () => {
9797
swatches: []
9898
},
9999
"workspace-v2": {
100-
schema: "html-js-gaming.workspace-v2-session/1",
100+
schema: "html-js-gaming.workspace-v2-tool-state/1",
101101
game: {
102102
id: "game-bad",
103103
name: "Bad Game"
104104
},
105105
defaultToolId: "asset-manager-v2",
106106
activeToolId: "asset-manager-v2",
107107
activeHostContextId: "asset-manager-v2-bad-0001",
108-
activeSession: {
108+
activeToolState: {
109109
version: "v2",
110110
toolId: "asset-manager-v2",
111111
payloadJson: null
112112
},
113-
savedSessions: {}
113+
savedToolStates: {}
114114
}
115115
}
116116
};
117117
await importManifestFromObject(page, invalidPayloadManifest);
118118
await expect(page.locator("#workspaceV2ImportExportStatus")).toContainText("Import error:");
119-
await expect(page.locator("#workspaceV2SessionHistoryEmptyState")).toHaveText("No recent sessions.");
119+
await expect(page.locator("#workspaceV2ToolStateHistoryEmptyState")).toHaveText("No recent tool states.");
120120
await expect(page).toHaveURL(/\/tools\/workspace-v2\/index\.html/);
121121
} finally {
122122
await server.close();
@@ -129,38 +129,38 @@ test.describe("Workspace V2 validation coverage", () => {
129129
await page.goto(`${server.baseUrl}/tools/workspace-v2/index.html`);
130130
await ctrlTapClick(page, page.getByRole("button", { name: "Full Reset" }));
131131
await page.locator("#workspaceV2ToolSelect").selectOption("asset-manager-v2");
132-
await ctrlTapClick(page, page.getByRole("button", { name: "Load Fixture" }));
132+
await ctrlTapClick(page, page.getByRole("button", { name: "Load Tool State" }));
133133

134134
const loadedManifest = JSON.parse(await page.locator("#workspaceV2ImportJson").inputValue());
135135
const exportedManifest = await exportManifestFromTextarea(page);
136136
expect(exportedManifest).toEqual(loadedManifest);
137137

138138
await importManifestFromObject(page, exportedManifest);
139-
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace session imported.");
139+
await expect(page.locator("#workspaceV2ImportExportStatus")).toHaveText("Workspace tool state imported.");
140140
const postImportManifest = JSON.parse(await page.locator("#workspaceV2ImportJson").inputValue());
141141
expect(postImportManifest).toEqual(exportedManifest);
142142
} finally {
143143
await server.close();
144144
}
145145
});
146146

147-
test("tool switching keeps activeSession consistent with selected fixture tool", async ({ page }) => {
147+
test("tool switching keeps activeToolState consistent with selected fixture tool", async ({ page }) => {
148148
const server = await startRepoServer();
149149
try {
150150
await page.goto(`${server.baseUrl}/tools/workspace-v2/index.html`);
151151
await ctrlTapClick(page, page.getByRole("button", { name: "Full Reset" }));
152152

153153
await page.locator("#workspaceV2ToolSelect").selectOption("tilemap-studio-v2");
154-
await ctrlTapClick(page, page.getByRole("button", { name: "Load Fixture" }));
154+
await ctrlTapClick(page, page.getByRole("button", { name: "Load Tool State" }));
155155
let exportedManifest = await exportManifestFromTextarea(page);
156156
expect(exportedManifest.tools?.["workspace-v2"]?.activeToolId).toBe("tilemap-studio-v2");
157-
expect(exportedManifest.tools?.["workspace-v2"]?.activeSession?.toolId).toBe("tilemap-studio-v2");
157+
expect(exportedManifest.tools?.["workspace-v2"]?.activeToolState?.toolId).toBe("tilemap-studio-v2");
158158

159159
await page.locator("#workspaceV2ToolSelect").selectOption("vector-map-editor-v2");
160-
await ctrlTapClick(page, page.getByRole("button", { name: "Load Fixture" }));
160+
await ctrlTapClick(page, page.getByRole("button", { name: "Load Tool State" }));
161161
exportedManifest = await exportManifestFromTextarea(page);
162162
expect(exportedManifest.tools?.["workspace-v2"]?.activeToolId).toBe("vector-map-editor-v2");
163-
expect(exportedManifest.tools?.["workspace-v2"]?.activeSession?.toolId).toBe("vector-map-editor-v2");
163+
expect(exportedManifest.tools?.["workspace-v2"]?.activeToolState?.toolId).toBe("vector-map-editor-v2");
164164
} finally {
165165
await server.close();
166166
}

0 commit comments

Comments
 (0)