Files
awesome-copilot/extensions/signals-dashboard/launch-profile.test.mjs
T
jennyf19 4af329f943 Add cost-aware Workshop desk profiles (#2532)
* feat: add cost-aware Workshop desk profiles

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 83dd4f49-a03d-44a0-bdd1-8c4f54da8ec2

* fix: address Copilot review feedback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 83dd4f49-a03d-44a0-bdd1-8c4f54da8ec2

* fix: isolate Agency MCP discovery

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 83dd4f49-a03d-44a0-bdd1-8c4f54da8ec2

* fix: label desk launch profile controls

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 83dd4f49-a03d-44a0-bdd1-8c4f54da8ec2

---------

Co-authored-by: Jenny Ferries <jenny.ferries@microsoft.com>
Copilot-Session: 83dd4f49-a03d-44a0-bdd1-8c4f54da8ec2
2026-08-05 13:58:54 +10:00

143 lines
5.4 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import {
buildDeskAgentArgv,
isDeskProfile,
isSafeWindowsCmdShim,
isWindowsAppExecutionAlias,
normalizeDeskProfile,
parsePluginMcpNames,
quoteWindowsCmdArgument,
} from "./launch-profile.mjs";
test("normalizes supported profiles and defaults unknown values to repo", () => {
assert.equal(isDeskProfile("repo"), true);
assert.equal(isDeskProfile("CONNECTED"), true);
assert.equal(isDeskProfile("other"), false);
assert.equal(normalizeDeskProfile("CONNECTED"), "connected");
assert.equal(normalizeDeskProfile("other"), "repo");
});
test("recognizes Windows App Execution Alias paths without trusting repository executables", () => {
assert.equal(isWindowsAppExecutionAlias(
"C:\\Users\\person\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe",
"C:\\Users\\person\\AppData\\Local"), true);
assert.equal(isWindowsAppExecutionAlias(
"C:\\repo\\wt.exe",
"C:\\Users\\person\\AppData\\Local"), false);
assert.equal(isWindowsAppExecutionAlias(
"C:\\Users\\person\\AppData\\Local\\Microsoft\\WindowsApps\\wt.cmd",
"C:\\Users\\person\\AppData\\Local"), false);
});
test("quotes trusted cmd shim arguments and rejects percent-bearing paths", () => {
assert.equal(
quoteWindowsCmdArgument("C:\\Program Files\\Agency\\agency.cmd"),
"\"C:\\Program Files\\Agency\\agency.cmd\"");
assert.equal(quoteWindowsCmdArgument("--scope"), "\"--scope\"");
assert.equal(isSafeWindowsCmdShim("C:\\Program Files\\Agency\\agency.cmd"), true);
assert.equal(isSafeWindowsCmdShim("C:\\Users\\%USERNAME%\\agency.cmd"), false);
});
test("executes a Windows cmd shim with safe quoting", {
skip: process.platform !== "win32",
}, () => {
const root = mkdtempSync(join(tmpdir(), "workshop-profile-"));
const shimDir = join(root, "Shim Name");
mkdirSync(shimDir);
const shim = join(shimDir, "copilot.cmd");
writeFileSync(shim, "@echo off\r\necho {\"plugins\":[]}\r\n");
const cmd = join(process.env.SystemRoot, "System32", "cmd.exe");
const commandLine = `"${[shim, "plugins", "list"]
.map(quoteWindowsCmdArgument)
.join(" ")}"`;
const result = spawnSync(cmd, ["/d", "/s", "/c", commandLine], {
encoding: "utf8",
windowsHide: true,
windowsVerbatimArguments: true,
});
assert.equal(result.status, 0, result.stderr);
assert.match(result.stdout, /\{"plugins":\[\]\}/);
});
test("extracts enabled plugin-scoped MCP names and rejects unsafe names", () => {
const names = parsePluginMcpNames(JSON.stringify({
plugins: [
{ kind: "mcp", name: "teams", scope: "plugin", enabled: true },
{ kind: "mcp", name: "repo-mcp", source: "plugin", enabled: true },
{ kind: "mcp", name: "teams", scope: "plugin", enabled: true },
{ kind: "mcp", name: "disabled", scope: "plugin", enabled: false },
{ kind: "mcp", name: "workspace", scope: "repository", enabled: true },
{ kind: "skill", name: "not-an-mcp", scope: "plugin", enabled: true },
{ kind: "mcp", name: "bad;name", scope: "plugin", enabled: true },
],
}));
assert.deepEqual(names, ["teams", "repo-mcp"]);
assert.deepEqual(parsePluginMcpNames(`Agency startup\n${JSON.stringify({
plugins: [{ kind: "mcp", name: "ado", scope: "plugin", enabled: true }],
})}`), ["ado"]);
assert.equal(parsePluginMcpNames("not json"), null);
assert.equal(parsePluginMcpNames("{}"), null);
});
test("builds an Agency repo profile on top of the existing wrapper", () => {
assert.deepEqual(buildDeskAgentArgv({
deskName: "cost-desk",
workshopDir: "C:\\workshop",
useAgency: true,
agencyCommand: "C:\\tools\\agency.exe",
profile: "repo",
pluginMcpNames: ["teams", "ado"],
}), [
"C:\\tools\\agency.exe", "copilot", "--no-default-mcps",
"--disable-mcp-server", "teams",
"--disable-mcp-server", "ado",
"--add-dir", "C:\\workshop",
]);
});
test("builds a plain Copilot repo profile without Agency-only flags", () => {
assert.deepEqual(buildDeskAgentArgv({
deskName: "cost-desk",
workshopDir: "/workshop",
useAgency: false,
copilotCommand: "/usr/local/bin/copilot",
profile: "repo",
pluginMcpNames: ["calendar"],
}), [
"/usr/local/bin/copilot", "--name", "cost-desk",
"--disable-mcp-server", "calendar",
"--add-dir", "/workshop",
]);
});
test("connected preserves tools while Agency discovery failure still removes defaults", () => {
assert.deepEqual(buildDeskAgentArgv({
deskName: "cost-desk",
workshopDir: "/workshop",
useAgency: true,
profile: "connected",
pluginMcpNames: ["teams"],
}), [
"agency", "copilot", "--add-dir", "/workshop",
]);
assert.deepEqual(buildDeskAgentArgv({
deskName: "cost-desk",
workshopDir: "/workshop",
useAgency: true,
profile: "repo",
pluginMcpNames: [],
discoverySucceeded: false,
}), [
"agency", "copilot", "--no-default-mcps", "--add-dir", "/workshop",
]);
});