@pixelbyte-software/pixcode 1.47.5 → 1.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -30
- package/README.tr.md +1 -1
- package/dist/api-automation.html +1 -1
- package/dist/assets/index-DlAWSDTA.js +818 -0
- package/dist/assets/index-g9NMlzYt.css +32 -0
- package/dist/assets/{vendor-codemirror-CzSp4P1a.js → vendor-codemirror-CIYNS698.js} +8 -8
- package/dist/docs.html +10 -10
- package/dist/features.html +3 -3
- package/dist/index.html +3 -3
- package/dist/landing.html +21 -23
- package/dist/llms-full.txt +4 -8
- package/dist/llms.txt +5 -6
- package/dist/openapi.yaml +7 -7
- package/dist-server/server/index.js +4 -6
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js +1 -1
- package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/agent-card.js +4 -4
- package/dist-server/server/modules/orchestration/a2a/agent-card.js.map +1 -1
- package/dist-server/server/modules/orchestration/a2a/routes.js +6 -2
- package/dist-server/server/modules/orchestration/a2a/routes.js.map +1 -1
- package/dist-server/server/modules/orchestration/hermes/hermes.routes.js +62 -0
- package/dist-server/server/modules/orchestration/hermes/hermes.routes.js.map +1 -0
- package/dist-server/server/modules/orchestration/index.js +2 -1
- package/dist-server/server/modules/orchestration/index.js.map +1 -1
- package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js +2 -5
- package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js.map +1 -1
- package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js +1 -20
- package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js.map +1 -1
- package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js +4 -37
- package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js.map +1 -1
- package/dist-server/server/modules/orchestration/tasks/task-run-graph.js +4 -62
- package/dist-server/server/modules/orchestration/tasks/task-run-graph.js.map +1 -1
- package/dist-server/server/modules/orchestration/workflows/workflow-runner.js +14 -14
- package/dist-server/server/modules/orchestration/workflows/workflow-runner.js.map +1 -1
- package/dist-server/server/modules/orchestration/workflows/workflow-trace.js +2 -2
- package/dist-server/server/modules/orchestration/workflows/workflow-trace.js.map +1 -1
- package/dist-server/server/projects.js +0 -160
- package/dist-server/server/projects.js.map +1 -1
- package/dist-server/server/routes/mcp-utils.js +0 -18
- package/dist-server/server/routes/mcp-utils.js.map +1 -1
- package/dist-server/server/services/public-api-manifest.js +0 -5
- package/dist-server/server/services/public-api-manifest.js.map +1 -1
- package/dist-server/server/services/telegram/control-center.js +2 -144
- package/dist-server/server/services/telegram/control-center.js.map +1 -1
- package/dist-server/server/services/telegram/translations.js +2 -14
- package/dist-server/server/services/telegram/translations.js.map +1 -1
- package/package.json +1 -2
- package/scripts/smoke/default-landing-routing.mjs +7 -16
- package/scripts/smoke/{a2a-roundtrip.mjs → hermes-roundtrip.mjs} +23 -23
- package/scripts/smoke/mac-desktop-runtime.mjs +1 -7
- package/scripts/smoke/orchestration-live-run.mjs +1 -1
- package/scripts/smoke/orchestration-model-sync.mjs +2 -2
- package/scripts/smoke/orchestration-user-facing-output.mjs +2 -2
- package/scripts/smoke/pixcode-workbench-1-48.mjs +55 -0
- package/scripts/smoke/taskmaster-config.mjs +21 -56
- package/scripts/smoke/taskmaster-execution-telegram.mjs +1 -50
- package/scripts/smoke/taskmaster-onboarding.mjs +1 -50
- package/scripts/smoke/taskmaster-run-graph.mjs +1 -53
- package/scripts/smoke/vscode-workbench-layout.mjs +25 -62
- package/scripts/smoke/vscode-workbench-polish.mjs +19 -5
- package/server/index.js +5 -7
- package/server/modules/orchestration/a2a/adapters/claude-code.adapter.ts +1 -1
- package/server/modules/orchestration/a2a/adapters/codex.adapter.ts +1 -1
- package/server/modules/orchestration/a2a/adapters/cursor.adapter.ts +1 -1
- package/server/modules/orchestration/a2a/adapters/gemini.adapter.ts +1 -1
- package/server/modules/orchestration/a2a/adapters/opencode.adapter.ts +1 -1
- package/server/modules/orchestration/a2a/adapters/qwen.adapter.ts +1 -1
- package/server/modules/orchestration/a2a/agent-card.ts +4 -4
- package/server/modules/orchestration/a2a/routes.ts +7 -2
- package/server/modules/orchestration/hermes/hermes.routes.ts +69 -0
- package/server/modules/orchestration/index.ts +2 -1
- package/server/modules/orchestration/tasks/orchestration-task-store.ts +2 -6
- package/server/modules/orchestration/tasks/orchestration-task.routes.ts +1 -20
- package/server/modules/orchestration/tasks/orchestration-task.service.ts +4 -41
- package/server/modules/orchestration/tasks/orchestration-task.types.ts +2 -4
- package/server/modules/orchestration/tasks/task-run-graph.ts +6 -70
- package/server/modules/orchestration/workflows/workflow-runner.ts +14 -14
- package/server/modules/orchestration/workflows/workflow-trace.ts +2 -2
- package/server/modules/orchestration/workflows/workflow.types.ts +1 -1
- package/server/projects.js +0 -170
- package/server/routes/mcp-utils.js +0 -19
- package/server/services/public-api-manifest.js +0 -5
- package/server/services/telegram/control-center.js +2 -153
- package/server/services/telegram/translations.js +2 -14
- package/dist/assets/index-BBdWwJi6.css +0 -32
- package/dist/assets/index-DfqcgNYJ.js +0 -889
- package/dist-server/server/routes/taskmaster.js +0 -1793
- package/dist-server/server/routes/taskmaster.js.map +0 -1
- package/dist-server/server/services/taskmaster-config.js +0 -128
- package/dist-server/server/services/taskmaster-config.js.map +0 -1
- package/dist-server/server/utils/mcp-detector.js +0 -134
- package/dist-server/server/utils/mcp-detector.js.map +0 -1
- package/dist-server/server/utils/taskmaster-websocket.js +0 -118
- package/dist-server/server/utils/taskmaster-websocket.js.map +0 -1
- package/server/routes/taskmaster.js +0 -1918
- package/server/services/taskmaster-config.js +0 -146
- package/server/utils/mcp-detector.js +0 -147
- package/server/utils/taskmaster-websocket.js +0 -129
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// scripts/smoke/
|
|
2
|
-
// End-to-end smoke check for the
|
|
1
|
+
// scripts/smoke/hermes-roundtrip.mjs
|
|
2
|
+
// End-to-end smoke check for the Hermes task router.
|
|
3
3
|
//
|
|
4
|
-
// Usage: node scripts/smoke/
|
|
4
|
+
// Usage: node scripts/smoke/hermes-roundtrip.mjs [baseUrl]
|
|
5
5
|
// Default: http://127.0.0.1:3001
|
|
6
6
|
//
|
|
7
7
|
// Pre-reqs:
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
// - ANTHROPIC_API_KEY (or pixcode auth) configured for Claude Code
|
|
10
10
|
//
|
|
11
11
|
// What it does:
|
|
12
|
-
// 1. GET /
|
|
13
|
-
// 2. GET /
|
|
14
|
-
// 3. POST /
|
|
15
|
-
// 4. Streams /
|
|
12
|
+
// 1. GET /hermes/.well-known/agent-card.json - sanity check
|
|
13
|
+
// 2. GET /hermes/agents - confirms claude-code is registered
|
|
14
|
+
// 3. POST /hermes/tasks - submits a tiny task
|
|
15
|
+
// 4. Streams /hermes/tasks/:id/stream - prints events until terminal state
|
|
16
16
|
//
|
|
17
17
|
// Pass/fail:
|
|
18
18
|
// Exits 0 on terminal state "completed". Non-zero otherwise.
|
|
@@ -35,13 +35,13 @@ async function jpost(path, body) {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
async function main() {
|
|
38
|
-
console.log('1) /
|
|
39
|
-
const card = await jget('/
|
|
38
|
+
console.log('1) /hermes/.well-known/agent-card.json');
|
|
39
|
+
const card = await jget('/hermes/.well-known/agent-card.json');
|
|
40
40
|
console.log(' name=', card.name, 'version=', card.version);
|
|
41
41
|
if (card.name !== 'pixcode') throw new Error('AgentCard.name != "pixcode"');
|
|
42
42
|
|
|
43
|
-
console.log('2) /
|
|
44
|
-
const agents = await jget('/
|
|
43
|
+
console.log('2) /hermes/agents');
|
|
44
|
+
const agents = await jget('/hermes/agents');
|
|
45
45
|
const ids = agents.agents.map((a) => a.name);
|
|
46
46
|
console.log(' registered:', ids.join(', '));
|
|
47
47
|
const expectedAgents = [
|
|
@@ -58,8 +58,8 @@ async function main() {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
console.log('3) POST /
|
|
62
|
-
const resolveRes = await jpost('/
|
|
61
|
+
console.log('3) POST /hermes/adapters/resolve');
|
|
62
|
+
const resolveRes = await jpost('/hermes/adapters/resolve', {
|
|
63
63
|
adapterId: 'skill:typescript-edit',
|
|
64
64
|
routing: { preferredAdapterId: 'codex' },
|
|
65
65
|
});
|
|
@@ -69,8 +69,8 @@ async function main() {
|
|
|
69
69
|
throw new Error('skill resolution did not honor preferredAdapterId=codex');
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
console.log('4) POST /
|
|
73
|
-
const invalidSubmit = await jpost('/
|
|
72
|
+
console.log('4) POST /hermes/tasks (invalid adapter)');
|
|
73
|
+
const invalidSubmit = await jpost('/hermes/tasks', {
|
|
74
74
|
adapterId: 'missing-adapter',
|
|
75
75
|
message: {
|
|
76
76
|
messageId: 'm_invalid_adapter',
|
|
@@ -82,8 +82,8 @@ async function main() {
|
|
|
82
82
|
throw new Error(`invalid submit -> expected 404, got ${invalidSubmit.status}`);
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
console.log('5) POST /
|
|
86
|
-
const missingTaskMessage = await jpost('/
|
|
85
|
+
console.log('5) POST /hermes/messages (missing task)');
|
|
86
|
+
const missingTaskMessage = await jpost('/hermes/messages', {
|
|
87
87
|
messageId: 'm_missing_task',
|
|
88
88
|
role: 'user',
|
|
89
89
|
taskId: 'task_missing',
|
|
@@ -93,8 +93,8 @@ async function main() {
|
|
|
93
93
|
throw new Error(`missing task message -> expected 404, got ${missingTaskMessage.status}`);
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
console.log('6) POST /
|
|
97
|
-
const submitRes = await jpost('/
|
|
96
|
+
console.log('6) POST /hermes/tasks');
|
|
97
|
+
const submitRes = await jpost('/hermes/tasks', {
|
|
98
98
|
adapterId: 'claude-code',
|
|
99
99
|
message: {
|
|
100
100
|
messageId: 'm_smoke_1',
|
|
@@ -112,8 +112,8 @@ async function main() {
|
|
|
112
112
|
throw new Error('resolved adapterId was not persisted to task metadata');
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
console.log('7) GET /
|
|
116
|
-
const listedTasks = await jget('/
|
|
115
|
+
console.log('7) GET /hermes/tasks?adapterId=claude-code&limit=5');
|
|
116
|
+
const listedTasks = await jget('/hermes/tasks?adapterId=claude-code&limit=5');
|
|
117
117
|
if (!Array.isArray(listedTasks.tasks) || listedTasks.count < 1) {
|
|
118
118
|
throw new Error('task listing did not return any tasks');
|
|
119
119
|
}
|
|
@@ -125,8 +125,8 @@ async function main() {
|
|
|
125
125
|
throw new Error('task summary adapterId mismatch');
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
console.log('8) GET /
|
|
129
|
-
const streamRes = await fetch(`${baseUrl}/
|
|
128
|
+
console.log('8) GET /hermes/tasks/:id/stream (SSE)');
|
|
129
|
+
const streamRes = await fetch(`${baseUrl}/hermes/tasks/${task.id}/stream`);
|
|
130
130
|
if (!streamRes.ok) throw new Error(`stream -> ${streamRes.status}`);
|
|
131
131
|
|
|
132
132
|
const reader = streamRes.body.getReader();
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
|
|
4
4
|
const installJobs = readFileSync('server/services/install-jobs.js', 'utf8');
|
|
5
|
-
const taskmaster = readFileSync('server/routes/taskmaster.js', 'utf8');
|
|
6
5
|
const codexAuth = readFileSync('server/modules/providers/list/codex/codex-auth.provider.ts', 'utf8');
|
|
7
6
|
const cursorAuth = readFileSync('server/modules/providers/list/cursor/cursor-auth.provider.ts', 'utf8');
|
|
8
7
|
const geminiAuth = readFileSync('server/modules/providers/list/gemini/gemini-auth.provider.ts', 'utf8');
|
|
@@ -27,12 +26,7 @@ assert(
|
|
|
27
26
|
|
|
28
27
|
assert(
|
|
29
28
|
installJobs.includes("findExecutableOnPath('npm'") && installJobs.includes('buildCliSpawnEnv'),
|
|
30
|
-
'
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
assert(
|
|
34
|
-
taskmaster.includes('findExecutableOnPath') && !taskmaster.includes("spawn('which'"),
|
|
35
|
-
'TaskMaster status should use Pixcode executable resolution, not bare which from a minimal GUI PATH',
|
|
29
|
+
'CLI installers should resolve npm from the augmented runtime PATH before spawning',
|
|
36
30
|
);
|
|
37
31
|
|
|
38
32
|
assert(codexAuth.includes('CODEX_CLI_PATH'), 'Codex auth should honor CODEX_CLI_PATH');
|
|
@@ -70,7 +70,7 @@ function compactNodes(run) {
|
|
|
70
70
|
nodeId: node.nodeId,
|
|
71
71
|
label: node.agentLabel,
|
|
72
72
|
status: node.status,
|
|
73
|
-
taskId: node.
|
|
73
|
+
taskId: node.hermesTaskId,
|
|
74
74
|
messageCount: (node.messages || []).filter((message) => message.role !== 'user').length,
|
|
75
75
|
hasOutput: Boolean(node.outputText?.trim()),
|
|
76
76
|
error: node.error,
|
|
@@ -17,8 +17,8 @@ assert.ok(
|
|
|
17
17
|
);
|
|
18
18
|
|
|
19
19
|
assert.ok(
|
|
20
|
-
runner.includes('resolveWorkflowModel') && runner.includes('
|
|
21
|
-
'Workflow runner should validate provider models server-side before submitting
|
|
20
|
+
runner.includes('resolveWorkflowModel') && runner.includes('getProviderModelRegistryEntry'),
|
|
21
|
+
'Workflow runner should validate provider models server-side before submitting Hermes tasks.',
|
|
22
22
|
);
|
|
23
23
|
|
|
24
24
|
assert.ok(
|
|
@@ -7,11 +7,11 @@ const source = readFileSync('server/modules/orchestration/workflows/workflow-run
|
|
|
7
7
|
|
|
8
8
|
assert.ok(
|
|
9
9
|
source.includes('userFacingTaskText'),
|
|
10
|
-
'Workflow runner should normalize
|
|
10
|
+
'Workflow runner should normalize Hermes task output into user-facing text.',
|
|
11
11
|
);
|
|
12
12
|
assert.ok(
|
|
13
13
|
!source.includes('`${message.role}: ${message.text}`'),
|
|
14
|
-
'Workflow runner must not prefix final/user-facing output with raw
|
|
14
|
+
'Workflow runner must not prefix final/user-facing output with raw task roles like agent:.',
|
|
15
15
|
);
|
|
16
16
|
assert.ok(
|
|
17
17
|
source.includes('Do not expose internal prompts, memory lookup, skill/tool instructions, raw agent logs, or role prefixes like "agent:" and "user:".'),
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
|
|
4
|
+
const read = (path) => fs.readFileSync(path, 'utf8');
|
|
5
|
+
|
|
6
|
+
const preferenceHook = read('src/hooks/useWorkbenchLayoutPreference.ts');
|
|
7
|
+
const appContent = read('src/components/app/AppContent.tsx');
|
|
8
|
+
const loginForm = read('src/components/auth/view/LoginForm.tsx');
|
|
9
|
+
const appearanceTab = read('src/components/settings/view/tabs/AppearanceSettingsTab.tsx');
|
|
10
|
+
const workbench = read('src/components/vscode-workbench/view/VSCodeWorkbench.tsx');
|
|
11
|
+
const fileTreeData = read('src/components/file-tree/hooks/useFileTreeData.ts');
|
|
12
|
+
const settingsSidebar = read('src/components/settings/view/SettingsSidebar.tsx');
|
|
13
|
+
const settingsMainTabs = read('src/components/settings/view/SettingsMainTabs.tsx');
|
|
14
|
+
const settingsTypes = read('src/components/settings/types/types.ts');
|
|
15
|
+
const settingsController = read('src/components/settings/hooks/useSettingsController.ts');
|
|
16
|
+
const app = read('src/App.tsx');
|
|
17
|
+
const orchestration = read('src/components/orchestration/OrchestrationPage.tsx');
|
|
18
|
+
const serverIndex = read('server/index.js');
|
|
19
|
+
const hermesRoutes = read('server/modules/orchestration/hermes/hermes.routes.ts');
|
|
20
|
+
|
|
21
|
+
assert.match(
|
|
22
|
+
preferenceHook,
|
|
23
|
+
/export type WorkbenchLayoutPreference = 'vscode';/,
|
|
24
|
+
'Classic layout should be removed from the persisted layout type.',
|
|
25
|
+
);
|
|
26
|
+
assert.doesNotMatch(preferenceHook, /'classic'/, 'Workbench preference hook should not fall back to classic.');
|
|
27
|
+
assert.match(appContent, /<VSCodeWorkbench/, 'Desktop app should render the VS Code workbench.');
|
|
28
|
+
assert.doesNotMatch(appContent, /!useVscodeWorkbench/, 'AppContent should not keep a classic desktop branch.');
|
|
29
|
+
|
|
30
|
+
assert.doesNotMatch(loginForm, /login\.layout|setWorkbenchLayout|WorkbenchLayoutPreference|classic/i, 'Login should not expose layout switching.');
|
|
31
|
+
assert.doesNotMatch(appearanceTab, /workbenchLayout|WorkbenchLayoutPreference|onWorkbenchLayoutChange|classic/i, 'Appearance settings should not expose layout switching.');
|
|
32
|
+
|
|
33
|
+
assert.match(workbench, /useState<ActivityPanel>\('projects'\)/, 'Workbench should open on the Projects panel.');
|
|
34
|
+
assert.match(workbench, /Workspace 1|workspaceSlots|WorkbenchWorkspacePanel/, 'Workbench explorer should expose workspace slots.');
|
|
35
|
+
assert.match(workbench, /openEditorTabs|activeEditorPath/, 'Workbench editor should keep a Monaco-style tab set.');
|
|
36
|
+
assert.doesNotMatch(workbench, /<ChatInterface/, 'Right workbench panel should not render the chat composer.');
|
|
37
|
+
assert.match(workbench, /WorkbenchCliPanel/, 'Right workbench panel should render the CLI terminal panel.');
|
|
38
|
+
assert.doesNotMatch(workbench, /TaskMasterPanel|useTaskMaster|useTasksSettings|tabs\.tasks/, 'Workbench should not expose TaskMaster.');
|
|
39
|
+
|
|
40
|
+
assert.match(fileTreeData, /pixcode:file-tree-refresh/, 'File tree data should listen for websocket-backed file refresh events.');
|
|
41
|
+
assert.match(appContent, /pixcode:file-tree-refresh/, 'AppContent should bridge project websocket updates into file-tree refresh events.');
|
|
42
|
+
|
|
43
|
+
assert.doesNotMatch(app, /TaskMasterProvider/, 'App should not wrap the product UI in TaskMasterProvider.');
|
|
44
|
+
assert.doesNotMatch(settingsSidebar, /id: 'tasks'/, 'Settings sidebar should not show a Tasks tab.');
|
|
45
|
+
assert.doesNotMatch(settingsMainTabs, /id: 'tasks'/, 'Settings main tabs should not show a Tasks tab.');
|
|
46
|
+
assert.doesNotMatch(settingsTypes, /'tasks'/, 'Settings tab type should not include tasks.');
|
|
47
|
+
assert.doesNotMatch(settingsController, /'tasks'/, 'Settings controller should not treat tasks as a known tab.');
|
|
48
|
+
|
|
49
|
+
assert.match(orchestration, /Hermes/, 'Orchestration page should present Hermes as the control agent.');
|
|
50
|
+
assert.doesNotMatch(orchestration, /A2A|a2a/, 'Orchestration page should not present A2A terminology.');
|
|
51
|
+
assert.match(serverIndex, /app\.use\('\/hermes', createHermesTaskRouter\(\)\)/, 'Internal task router should be mounted behind Hermes.');
|
|
52
|
+
assert.doesNotMatch(serverIndex, /app\.use\('\/a2a'/, 'Server should not expose the old A2A route.');
|
|
53
|
+
assert.match(hermesRoutes, /createHermesRouter/, 'Hermes should have a dedicated orchestration API router.');
|
|
54
|
+
|
|
55
|
+
console.log('pixcode workbench 1.48 smoke passed');
|
|
@@ -1,59 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import assert from 'node:assert/strict';
|
|
4
|
-
import { readFileSync } from 'node:fs';
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
assert.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
assert.ok(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
&& taskmasterConfig.includes('CUSTOM_OPENAI_API_KEY')
|
|
26
|
-
&& taskmasterConfig.includes('buildTaskMasterConfigEnvValues'),
|
|
27
|
-
'TaskMaster config should support custom OpenAI-compatible API keys, API URLs, model values, and shared env resolution.',
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
assert.ok(
|
|
31
|
-
taskmasterRoutes.includes("router.get('/config'") && taskmasterRoutes.includes("router.put('/config'"),
|
|
32
|
-
'TaskMaster routes should expose authenticated config read/write endpoints.',
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
assert.ok(
|
|
36
|
-
taskmasterRoutes.includes('buildTaskMasterCliEnv') && taskmasterRoutes.includes('task-master-ai'),
|
|
37
|
-
'TaskMaster CLI execution should receive saved env config and detect both task-master and task-master-ai binaries.',
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
assert.ok(
|
|
41
|
-
tasksSettingsContext.includes('refreshTaskMasterInstallation'),
|
|
42
|
-
'Task settings context should expose a manual TaskMaster installation refresh action.',
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
assert.ok(
|
|
46
|
-
tasksSettingsTab.includes('/api/taskmaster/config')
|
|
47
|
-
&& tasksSettingsTab.includes('ANTHROPIC_API_KEY')
|
|
48
|
-
&& tasksSettingsTab.includes('OPENAI_BASE_URL')
|
|
49
|
-
&& tasksSettingsTab.includes('Custom OpenAI-compatible')
|
|
50
|
-
&& tasksSettingsTab.includes('OPENAI_COMPATIBLE_MODEL'),
|
|
51
|
-
'Task settings tab should let users save TaskMaster API keys, API URLs, and custom OpenAI-compatible provider settings.',
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
assert.ok(
|
|
55
|
-
mainContentState.includes('pixcode:create-project') && mainContentState.includes('mainContent.landing.taskSystem'),
|
|
56
|
-
'Landing Task system card should be actionable instead of a static locked-looking panel.',
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
console.log('taskmaster config smoke passed');
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
|
|
6
|
+
const read = (path) => readFileSync(path, 'utf8');
|
|
7
|
+
|
|
8
|
+
const serverIndex = read('server/index.js');
|
|
9
|
+
const api = read('src/utils/api.js');
|
|
10
|
+
const app = read('src/App.tsx');
|
|
11
|
+
const settings = read('src/components/settings/view/Settings.tsx');
|
|
12
|
+
const settingsSidebar = read('src/components/settings/view/SettingsSidebar.tsx');
|
|
13
|
+
|
|
14
|
+
assert.doesNotMatch(serverIndex, /taskmasterRoutes|\/api\/taskmaster/, 'TaskMaster API route should not be mounted.');
|
|
15
|
+
assert.doesNotMatch(api, /taskmaster:\s*\{|\/api\/taskmaster/, 'Frontend API client should not expose TaskMaster endpoints.');
|
|
16
|
+
assert.doesNotMatch(app, /TaskMasterProvider/, 'App should not mount TaskMasterProvider.');
|
|
17
|
+
assert.doesNotMatch(settings, /TasksSettingsTab|activeTab === 'tasks'/, 'Settings should not render the TaskMaster settings tab.');
|
|
18
|
+
assert.doesNotMatch(settingsSidebar, /mainTabs\.tasks|id: 'tasks'/, 'Settings navigation should not include Tasks.');
|
|
19
|
+
assert.ok(!existsSync('src/components/onboarding/view/subcomponents/TaskSystemStep.tsx'), 'TaskMaster onboarding step should be removed.');
|
|
20
|
+
assert.ok(!existsSync('src/components/task-master'), 'TaskMaster component directory should be removed.');
|
|
21
|
+
assert.ok(!existsSync('src/components/prd-editor'), 'TaskMaster PRD editor should be removed.');
|
|
22
|
+
assert.ok(!existsSync('server/routes/taskmaster.js'), 'TaskMaster backend route file should be removed.');
|
|
23
|
+
|
|
24
|
+
console.log('taskmaster removal smoke passed');
|
|
@@ -1,52 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import { readFileSync } from 'node:fs';
|
|
5
|
-
|
|
6
|
-
const taskmasterRoutes = readFileSync('server/routes/taskmaster.js', 'utf8');
|
|
7
|
-
const taskService = readFileSync('server/modules/orchestration/tasks/orchestration-task.service.ts', 'utf8');
|
|
8
|
-
const taskTypes = readFileSync('server/modules/orchestration/tasks/orchestration-task.types.ts', 'utf8');
|
|
9
|
-
const telegramControl = readFileSync('server/services/telegram/control-center.js', 'utf8');
|
|
10
|
-
const translations = readFileSync('server/services/telegram/translations.js', 'utf8');
|
|
11
|
-
|
|
12
|
-
assert.ok(
|
|
13
|
-
taskmasterRoutes.includes("router.post('/execute/:projectName/:taskId'"),
|
|
14
|
-
'TaskMaster route should expose project/task execution endpoint.',
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
assert.ok(
|
|
18
|
-
taskmasterRoutes.includes('orchestrationTaskService.dispatch') && taskmasterRoutes.includes('model'),
|
|
19
|
-
'TaskMaster execution should dispatch through orchestration with model support.',
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
assert.ok(
|
|
23
|
-
taskService.includes('projectPath?: string') || taskTypes.includes('projectPath?: string'),
|
|
24
|
-
'Orchestration task dispatch should carry projectPath into A2A workspace metadata.',
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
assert.ok(
|
|
28
|
-
taskService.includes('model: input.model') && taskService.includes('projectPath: input.projectPath'),
|
|
29
|
-
'Task dispatch should forward selected model and project path to A2A.',
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
assert.ok(
|
|
33
|
-
telegramControl.includes("'/tasks'") && telegramControl.includes("'/task'"),
|
|
34
|
-
'Telegram control should register TaskMaster commands.',
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
assert.ok(
|
|
38
|
-
telegramControl.includes('showTaskMasterTasks') && telegramControl.includes('runTaskMasterTask'),
|
|
39
|
-
'Telegram control should list and execute TaskMaster tasks.',
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
assert.ok(
|
|
43
|
-
telegramControl.includes('/api/taskmaster/execute/') && telegramControl.includes('monitorA2ATask'),
|
|
44
|
-
'Telegram TaskMaster execution should call the backend and monitor the A2A task.',
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
assert.ok(
|
|
48
|
-
translations.includes('control.button.tasks') && translations.includes('control.taskStarted'),
|
|
49
|
-
'Telegram translations should include TaskMaster task controls.',
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
console.log('taskmaster execution telegram smoke passed');
|
|
3
|
+
import './taskmaster-config.mjs';
|
|
@@ -1,52 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import { readFileSync } from 'node:fs';
|
|
5
|
-
|
|
6
|
-
const installJobs = readFileSync('server/services/install-jobs.js', 'utf8');
|
|
7
|
-
const taskmasterRoutes = readFileSync('server/routes/taskmaster.js', 'utf8');
|
|
8
|
-
const onboarding = readFileSync('src/components/onboarding/view/Onboarding.tsx', 'utf8');
|
|
9
|
-
const stepProgress = readFileSync('src/components/onboarding/view/subcomponents/OnboardingStepProgress.tsx', 'utf8');
|
|
10
|
-
const taskStep = readFileSync('src/components/onboarding/view/subcomponents/TaskSystemStep.tsx', 'utf8');
|
|
11
|
-
|
|
12
|
-
assert.ok(
|
|
13
|
-
installJobs.includes("'task-master': 'task-master'"),
|
|
14
|
-
'TaskMaster package should be verified by the sandbox CLI installer.',
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
assert.ok(
|
|
18
|
-
taskmasterRoutes.includes("router.post('/install'"),
|
|
19
|
-
'TaskMaster routes should expose an authenticated install endpoint.',
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
assert.ok(
|
|
23
|
-
taskmasterRoutes.includes("router.get('/install/:jobId/stream'"),
|
|
24
|
-
'TaskMaster install should expose the same resilient log stream pattern as provider installs.',
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
assert.ok(
|
|
28
|
-
taskmasterRoutes.includes("provider: 'taskmaster'") && taskmasterRoutes.includes("packageName: 'task-master'"),
|
|
29
|
-
'TaskMaster install route should install the task-master npm package under the taskmaster job provider.',
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
assert.ok(
|
|
33
|
-
onboarding.includes('TaskSystemStep') && onboarding.includes('currentStep < 2'),
|
|
34
|
-
'Onboarding should include a third Task system step before completion.',
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
assert.ok(
|
|
38
|
-
onboarding.includes("localStorage.setItem('tasks-enabled'"),
|
|
39
|
-
'Onboarding should persist the user task-system choice.',
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
assert.ok(
|
|
43
|
-
stepProgress.includes('Task System'),
|
|
44
|
-
'Onboarding progress should show the Task System step.',
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
assert.ok(
|
|
48
|
-
taskStep.includes('/api/taskmaster/installation-status') && taskStep.includes('/api/taskmaster/install'),
|
|
49
|
-
'TaskSystemStep should check and install TaskMaster through the backend API.',
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
console.log('taskmaster onboarding smoke passed');
|
|
3
|
+
import './taskmaster-config.mjs';
|
|
@@ -1,55 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import fs from 'node:fs';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
|
|
7
|
-
const root = process.cwd();
|
|
8
|
-
|
|
9
|
-
function read(relativePath) {
|
|
10
|
-
return fs.readFileSync(path.join(root, relativePath), 'utf8');
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const graph = read('server/modules/orchestration/tasks/task-run-graph.ts');
|
|
14
|
-
assert.match(graph, /PIXCODE_TASK_RUN_GRAPH_PROTOCOL/, 'Task/run graph should declare a stable protocol id.');
|
|
15
|
-
assert.match(graph, /pixcode\.task-run-graph\.v1/, 'Task/run graph should use the v1 protocol id.');
|
|
16
|
-
assert.match(graph, /buildTaskRunGraph/, 'Task/run graph builder is missing.');
|
|
17
|
-
assert.match(graph, /acceptanceCriteria/, 'Task/run graph should expose acceptance criteria.');
|
|
18
|
-
assert.match(graph, /changedFiles/, 'Task/run graph should expose changed files.');
|
|
19
|
-
assert.match(graph, /workflowRuns/, 'Task/run graph should expose workflow runs.');
|
|
20
|
-
assert.match(graph, /taskmasterId/, 'Task/run graph should link TaskMaster ids.');
|
|
21
|
-
|
|
22
|
-
const taskTypes = read('server/modules/orchestration/tasks/orchestration-task.types.ts');
|
|
23
|
-
assert.match(taskTypes, /workflowRunIds\?: string\[\]/, 'Orchestration tasks should persist workflow run ids.');
|
|
24
|
-
assert.match(taskTypes, /acceptanceCriteria/, 'Orchestration tasks should persist acceptance criteria snapshots.');
|
|
25
|
-
assert.match(taskTypes, /changedFiles\?: string\[\]/, 'Orchestration tasks should persist changed file snapshots.');
|
|
26
|
-
|
|
27
|
-
const taskService = read('server/modules/orchestration/tasks/orchestration-task.service.ts');
|
|
28
|
-
assert.match(taskService, /linkWorkflowRun/, 'Orchestration task service should link workflow runs to tasks.');
|
|
29
|
-
assert.match(taskService, /updateFromWorkflowRun/, 'Orchestration task service should write workflow results back to tasks.');
|
|
30
|
-
|
|
31
|
-
const workflowRunner = read('server/modules/orchestration/workflows/workflow-runner.ts');
|
|
32
|
-
assert.match(workflowRunner, /linkWorkflowRun/, 'Workflow runner should link runs to orchestration tasks.');
|
|
33
|
-
assert.match(workflowRunner, /updateFromWorkflowRun/, 'Workflow runner should write terminal run results to the task graph.');
|
|
34
|
-
|
|
35
|
-
const taskmasterRoute = read('server/routes/taskmaster.js');
|
|
36
|
-
assert.match(taskmasterRoute, /buildTaskRunGraph/, 'TaskMaster routes should attach task graph data.');
|
|
37
|
-
assert.match(taskmasterRoute, /taskGraph/, 'TaskMaster task responses should include taskGraph.');
|
|
38
|
-
assert.match(taskmasterRoute, /workflowRunner\.start/, 'TaskMaster execute route should support starting workflow runs.');
|
|
39
|
-
|
|
40
|
-
const workflowPanel = read('src/components/orchestration/workflows/WorkflowRunPanel.tsx');
|
|
41
|
-
assert.match(workflowPanel, /linkedTask/, 'Workflow run panel should render linked task metadata.');
|
|
42
|
-
assert.match(workflowPanel, /taskmasterId/, 'Workflow run panel should read taskmasterId metadata.');
|
|
43
|
-
|
|
44
|
-
const taskDetail = read('src/components/task-master/view/TaskDetailModal.tsx');
|
|
45
|
-
assert.match(taskDetail, /taskGraph/, 'Task detail modal should render task graph data.');
|
|
46
|
-
assert.match(taskDetail, /Associated runs/, 'Task detail modal should show associated runs.');
|
|
47
|
-
assert.match(taskDetail, /Changed files/, 'Task detail modal should show changed files.');
|
|
48
|
-
assert.match(taskDetail, /Acceptance criteria/, 'Task detail modal should show acceptance criteria.');
|
|
49
|
-
|
|
50
|
-
const en = read('src/i18n/locales/en/common.json');
|
|
51
|
-
const tr = read('src/i18n/locales/tr/common.json');
|
|
52
|
-
assert.match(en, /"linkedTask"/, 'English linked task translation is missing.');
|
|
53
|
-
assert.match(tr, /"linkedTask"/, 'Turkish linked task translation is missing.');
|
|
54
|
-
|
|
55
|
-
console.log('taskmaster run graph smoke passed');
|
|
3
|
+
import './taskmaster-config.mjs';
|
|
@@ -16,85 +16,48 @@ const appContent = read('src/components/app/AppContent.tsx');
|
|
|
16
16
|
const workbench = read('src/components/vscode-workbench/view/VSCodeWorkbench.tsx');
|
|
17
17
|
const appearanceTab = read('src/components/settings/view/tabs/AppearanceSettingsTab.tsx');
|
|
18
18
|
const loginForm = read('src/components/auth/view/LoginForm.tsx');
|
|
19
|
-
const issuePlan = read('docs/issues/vscode-workbench-layout.md');
|
|
20
19
|
|
|
21
20
|
const enCommon = JSON.parse(read('src/i18n/locales/en/common.json'));
|
|
22
|
-
const enSettings = JSON.parse(read('src/i18n/locales/en/settings.json'));
|
|
23
|
-
const enAuth = JSON.parse(read('src/i18n/locales/en/auth.json'));
|
|
24
21
|
|
|
25
22
|
assert(
|
|
26
|
-
preferenceHook.includes('
|
|
27
|
-
&& preferenceHook.includes(
|
|
28
|
-
&& preferenceHook.includes("'
|
|
29
|
-
|
|
30
|
-
'Workbench layout preference hook should persist classic/vscode and broadcast updates.',
|
|
23
|
+
preferenceHook.includes("export type WorkbenchLayoutPreference = 'vscode';")
|
|
24
|
+
&& preferenceHook.includes('WORKBENCH_LAYOUT_CHANGE_EVENT')
|
|
25
|
+
&& !preferenceHook.includes("'classic'"),
|
|
26
|
+
'Workbench layout preference should be VS Code-only and should not preserve Classic fallback.',
|
|
31
27
|
);
|
|
32
28
|
|
|
33
29
|
assert(
|
|
34
|
-
appContent.includes('
|
|
35
|
-
&& appContent.includes('VSCodeWorkbench')
|
|
36
|
-
&& appContent.includes('useVscodeWorkbench')
|
|
37
|
-
|
|
38
|
-
&& appContent.includes('<VSCodeWorkbench'),
|
|
39
|
-
'AppContent should switch desktop users from the classic shell into VSCodeWorkbench.',
|
|
30
|
+
appContent.includes('VSCodeWorkbench')
|
|
31
|
+
&& appContent.includes('<VSCodeWorkbench')
|
|
32
|
+
&& !appContent.includes('!useVscodeWorkbench'),
|
|
33
|
+
'AppContent should render the VS Code workbench as the desktop shell.',
|
|
40
34
|
);
|
|
41
35
|
|
|
42
36
|
assert(
|
|
43
|
-
workbench.includes('
|
|
44
|
-
&& workbench.includes('
|
|
45
|
-
&& workbench.includes('
|
|
46
|
-
&& workbench.includes('
|
|
47
|
-
&& workbench.includes('
|
|
48
|
-
&& workbench.includes('
|
|
49
|
-
&& workbench.includes('
|
|
50
|
-
&& workbench.includes('
|
|
51
|
-
&& workbench.includes('
|
|
52
|
-
|
|
53
|
-
'VSCodeWorkbench should compose existing files/editor/git/shell/chat surfaces with vertical resizers.',
|
|
37
|
+
workbench.includes('WorkbenchProjectLanding')
|
|
38
|
+
&& workbench.includes("useState<ActivityPanel>('projects')")
|
|
39
|
+
&& workbench.includes('WorkbenchWorkspacePanel')
|
|
40
|
+
&& workbench.includes('Workspace 1')
|
|
41
|
+
&& workbench.includes('openEditorTabs')
|
|
42
|
+
&& workbench.includes('activeEditorPath')
|
|
43
|
+
&& workbench.includes('WorkbenchCliPanel')
|
|
44
|
+
&& !workbench.includes('<ChatInterface')
|
|
45
|
+
&& !workbench.includes('TaskMasterPanel'),
|
|
46
|
+
'VSCodeWorkbench should open on Projects, expose workspace slots, tab files, and use terminal-only CLI panel.',
|
|
54
47
|
);
|
|
55
48
|
|
|
56
49
|
assert(
|
|
57
|
-
appearanceTab.includes('workbenchLayout')
|
|
58
|
-
&& appearanceTab.includes('onWorkbenchLayoutChange')
|
|
59
|
-
&&
|
|
60
|
-
&&
|
|
61
|
-
'Appearance settings should expose
|
|
50
|
+
!appearanceTab.includes('workbenchLayout')
|
|
51
|
+
&& !appearanceTab.includes('onWorkbenchLayoutChange')
|
|
52
|
+
&& !loginForm.includes('login.layout')
|
|
53
|
+
&& !loginForm.includes('setWorkbenchLayout'),
|
|
54
|
+
'Login and Appearance settings should not expose layout switching.',
|
|
62
55
|
);
|
|
63
56
|
|
|
64
57
|
assert(
|
|
65
|
-
|
|
66
|
-
&& loginForm.includes('login.layout')
|
|
67
|
-
&& loginForm.includes('setWorkbenchLayout'),
|
|
68
|
-
'Login should let users choose the workspace layout before signing in.',
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
assert(
|
|
72
|
-
enCommon.vscodeWorkbench?.title
|
|
73
|
-
&& enCommon.vscodeWorkbench?.activity?.explorer
|
|
58
|
+
enCommon.vscodeWorkbench?.activity?.explorer
|
|
74
59
|
&& enCommon.vscodeWorkbench?.panels?.cli,
|
|
75
|
-
'English common locale should include
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
assert(
|
|
79
|
-
enSettings.appearanceSettings?.workbenchLayout?.title
|
|
80
|
-
&& enSettings.appearanceSettings?.workbenchLayout?.options?.vscode?.label,
|
|
81
|
-
'English settings locale should include workbench layout settings copy.',
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
assert(
|
|
85
|
-
enAuth.login?.layout?.title
|
|
86
|
-
&& enAuth.login?.layout?.options?.vscode,
|
|
87
|
-
'English auth locale should include login layout selector copy.',
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
assert(
|
|
91
|
-
issuePlan.includes('Issue 1')
|
|
92
|
-
&& issuePlan.includes('Issue 2')
|
|
93
|
-
&& issuePlan.includes('Issue 3')
|
|
94
|
-
&& issuePlan.includes('Issue 4')
|
|
95
|
-
&& issuePlan.includes('Issue 5')
|
|
96
|
-
&& issuePlan.includes('Status: Completed'),
|
|
97
|
-
'Local issue plan should track the sliced work and completion notes while GitHub is unavailable.',
|
|
60
|
+
'English common locale should include VS Code workbench copy.',
|
|
98
61
|
);
|
|
99
62
|
|
|
100
63
|
console.log('vscode workbench layout smoke passed');
|
|
@@ -41,6 +41,18 @@ assert.match(
|
|
|
41
41
|
'Projects activity should use a dedicated project-directory panel.',
|
|
42
42
|
);
|
|
43
43
|
|
|
44
|
+
assert.match(
|
|
45
|
+
workbench,
|
|
46
|
+
/function WorkbenchProjectLanding/,
|
|
47
|
+
'Workbench center should show a project landing page instead of a blank editor when no project is selected.',
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
assert.match(
|
|
51
|
+
workbench,
|
|
52
|
+
/function WorkbenchCliPanel/,
|
|
53
|
+
'Right workbench pane should use a terminal-only CLI panel.',
|
|
54
|
+
);
|
|
55
|
+
|
|
44
56
|
assert.doesNotMatch(
|
|
45
57
|
workbench,
|
|
46
58
|
/return <Sidebar \{\.\.\.sidebarProps\} isMobile=\{false\} \/>/,
|
|
@@ -59,6 +71,12 @@ assert.match(
|
|
|
59
71
|
'Projects panel should show file counts.',
|
|
60
72
|
);
|
|
61
73
|
|
|
74
|
+
assert.match(
|
|
75
|
+
workbench,
|
|
76
|
+
/Work in this folder/,
|
|
77
|
+
'Project cards should make the folder binding explicit.',
|
|
78
|
+
);
|
|
79
|
+
|
|
62
80
|
assert.match(projectType, /fileCount\?: number/, 'Project type should expose optional fileCount metadata.');
|
|
63
81
|
assert.match(projectsServer, /async function countProjectFiles/, 'Backend should count project files for the workbench project list.');
|
|
64
82
|
|
|
@@ -74,11 +92,7 @@ assert.doesNotMatch(
|
|
|
74
92
|
'Workbench center panel should be allowed to shrink with narrow three-pane layouts.',
|
|
75
93
|
);
|
|
76
94
|
|
|
77
|
-
assert.
|
|
78
|
-
workbench,
|
|
79
|
-
/compactComposer/,
|
|
80
|
-
'Workbench should request compact composer behavior in the right CLI pane.',
|
|
81
|
-
);
|
|
95
|
+
assert.doesNotMatch(workbench, /<ChatInterface/, 'Workbench should not embed the chat composer in the right CLI pane.');
|
|
82
96
|
|
|
83
97
|
assert.match(
|
|
84
98
|
workbench,
|