import * as assert from "assert"; import * as vscode from "vscode"; import type { CowritingApi } from "../../../src/extension"; // F8: with NO workspace folder open, authoring used to be stubbed (#8 registered // warning stubs and activate() returned undefined). F8 makes the authoring // commands REAL folder-less (the F6 #19 precedent), routing every doc to global // storage — so activate() returns a real API and propose→accept works on an // untitled buffer with no folder. This suite runs in a second EDH pass launched // WITHOUT a folder (see runTest.ts). suite("no-workspace authoring (F8 — real folder-less, #8 lineage)", () => { test("EDH really has no workspace folder", () => { assert.strictEqual(vscode.workspace.workspaceFolders, undefined); }); test("activate returns a real API even with no workspace folder (F8)", async () => { const ext = vscode.extensions.getExtension("benstull.vscode-cowriting-plugin")!; const api = (await ext.activate()) as CowritingApi; assert.ok(api?.proposalController, "no-folder activation returns the authoring API (F8)"); assert.ok(api?.sidecarRouter, "router exposed"); }); test("all contributed coauthoring commands are registered (real, not stubs)", async () => { const all = await vscode.commands.getCommands(true); for (const command of [ "cowriting.createThread", "cowriting.reply", "cowriting.resolveThread", "cowriting.reopenThread", "cowriting.edit", "cowriting.editSelection", "cowriting.applyAgentEdit", "cowriting.proposeAgentEdit", ]) { assert.ok(all.includes(command), `${command} is registered`); } // F10 (INV-32): proposals are preview-only — the in-editor accept/reject // commands and the attribution toggle were retired (no editor decorations). for (const retired of [ "cowriting.toggleAttribution", "cowriting.acceptProposal", "cowriting.rejectProposal", // #34: the F6 two-pane diff VIEW was removed (F10 preview is the single // review surface); its toggle command is gone (the baseline store stays). "cowriting.toggleDiffView", ]) { assert.ok(!all.includes(retired), `${retired} is retired`); } }); test("authoring works folder-less: propose→accept on an untitled buffer routes to global storage (F8)", async () => { const ext = vscode.extensions.getExtension("benstull.vscode-cowriting-plugin")!; const api = (await ext.activate()) as CowritingApi; const untitled = await vscode.workspace.openTextDocument({ content: "Edit this scratch sentence please.\n", language: "markdown", }); await vscode.window.showTextDocument(untitled); await new Promise((r) => setTimeout(r, 300)); const key = untitled.uri.toString(); const target = "Edit this scratch sentence please."; const start = untitled.getText().indexOf(target); const id = await vscode.commands.executeCommand("cowriting.proposeAgentEdit", { uri: key, start, end: start + target.length, newText: "REPLACED scratch sentence.", model: "sonnet", sessionId: "e2e-nf", turnId: "turn-nf", }); assert.ok(id, "propose returns an id for an untitled buffer with no folder"); assert.ok(await api.proposalController.acceptById(key, id!), "accept applies"); await new Promise((r) => setTimeout(r, 300)); assert.ok(untitled.getText().includes("REPLACED scratch sentence."), "replacement landed in the untitled buffer"); assert.strictEqual(api.sidecarRouter.sidecarPath(key), undefined, "untitled artifact is in-memory only (no disk)"); }); // F6 (#19) baseline data layer is workspace-INDEPENDENT: it captures a baseline // for an untitled buffer even with no folder open (the two-pane VIEW was // removed in #34; only the data layer remains). markReviewed stays real. // Native-surfaces migration (Task 2, INV-7): the baseline is established on // coediting ENTRY, not merely on open. test("F6 baseline data layer works with no folder open (untitled buffer)", async () => { const all = await vscode.commands.getCommands(true); assert.ok(all.includes("cowriting.markReviewed"), "markReviewed registered"); const ext = vscode.extensions.getExtension("benstull.vscode-cowriting-plugin")!; const api = (await ext.activate()) as CowritingApi; const untitled = await vscode.workspace.openTextDocument({ content: "no-folder scratch\n", language: "markdown" }); await vscode.window.showTextDocument(untitled); await vscode.commands.executeCommand("cowriting.coeditDocument"); await new Promise((r) => setTimeout(r, 300)); const key = untitled.uri.toString(); const baseline = api.diffViewController.getBaseline(key); assert.ok(baseline, "baseline captured for the untitled buffer with no folder"); assert.strictEqual(baseline!.reason, "entered"); // markReviewed resets the baseline to now — works folder-less. await vscode.commands.executeCommand("cowriting.markReviewed"); await new Promise((r) => setTimeout(r, 300)); assert.strictEqual(api.diffViewController.getBaseline(key)!.reason, "pinned", "markReviewed works with no folder"); }); });