Skip to content

Commit a155fae

Browse files
committed
🤖 refactor: use Config class from main app in extension
Replace duplicated config reading logic with direct import of Config class from main app. Extension now uses getAllWorkspaceMetadata() and enriches with extension-specific metadata (recency, streaming). Changes: - Import Config class from cmux/config - Remove readCmuxConfig() - use Config.loadConfigOrDefault() - Remove ProjectConfig, CmuxConfig type duplicates - Simplify getAllWorkspaces() to use Config.getAllWorkspaceMetadata() - Keep only extension-specific enrichment logic Results: - Code: 135 LoC → 92 LoC (43 LoC removed, 32% reduction) - Bundle: 5.2 KB → 21 KB (includes Config class, still small) - Extension: 53 KB → 58 KB (5 KB increase, acceptable) - Zero config logic duplication - Single source of truth for workspace metadata Generated with `cmux`
1 parent 224f636 commit a155fae

File tree

1 file changed

+28
-71
lines changed

1 file changed

+28
-71
lines changed

vscode/src/cmuxConfig.ts

Lines changed: 28 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,58 @@
11
import * as path from "path";
2-
import type { RuntimeConfig } from "cmux/types/runtime";
2+
import { Config } from "cmux/config";
33
import type { WorkspaceMetadata } from "cmux/types/workspace";
44
import {
55
type ExtensionMetadata,
66
readExtensionMetadata,
77
} from "cmux/utils/extensionMetadata";
88

99
/**
10-
* Project configuration from cmux
11-
*/
12-
export interface ProjectConfig {
13-
path: string;
14-
workspaces: WorkspaceMetadata[];
15-
}
16-
17-
/**
18-
* Full cmux configuration structure
19-
*/
20-
export interface CmuxConfig {
21-
projects: Array<[string, ProjectConfig]>;
22-
}
23-
24-
/**
25-
* Workspace with additional context for display
10+
* Workspace with extension metadata for display in VS Code extension.
11+
* Combines workspace metadata from main app with extension-specific data.
2612
*/
2713
export interface WorkspaceWithContext extends WorkspaceMetadata {
2814
projectPath: string;
2915
extensionMetadata?: ExtensionMetadata;
3016
}
3117

3218
/**
33-
* Read and parse the cmux configuration file
34-
*/
35-
export function readCmuxConfig(): CmuxConfig | null {
36-
const os = require("os");
37-
const fs = require("fs");
38-
const configPath = path.join(os.homedir(), ".cmux", "config.json");
39-
40-
if (!fs.existsSync(configPath)) {
41-
return null;
42-
}
43-
44-
try {
45-
const configData = fs.readFileSync(configPath, "utf-8");
46-
return JSON.parse(configData) as CmuxConfig;
47-
} catch (error) {
48-
console.error("Failed to read cmux config:", error);
49-
return null;
50-
}
51-
}
52-
53-
/**
54-
* Get all workspaces from the cmux configuration
19+
* Get all workspaces from cmux config, enriched with extension metadata.
20+
* Uses main app's Config class to read workspace metadata, then enriches
21+
* with extension-specific data (recency, streaming status).
5522
*/
5623
export function getAllWorkspaces(): WorkspaceWithContext[] {
57-
const config = readCmuxConfig();
58-
if (!config) {
59-
return [];
60-
}
61-
62-
const metadata = readExtensionMetadata();
63-
console.log(`[cmux] Read ${metadata.size} entries from extension metadata`);
64-
65-
const workspaces: WorkspaceWithContext[] = [];
66-
67-
for (const [projectPath, projectConfig] of config.projects) {
68-
const projectName = path.basename(projectPath);
69-
70-
for (const workspace of projectConfig.workspaces) {
71-
const meta = metadata.get(workspace.id);
72-
73-
if (meta) {
74-
console.log(`[cmux] ${workspace.id}: recency=${meta.recency}, streaming=${meta.streaming}`);
75-
}
76-
77-
workspaces.push({
78-
...workspace,
79-
// Ensure projectName is set (use from workspace or derive from path)
80-
projectName: workspace.projectName || projectName,
81-
projectPath,
82-
extensionMetadata: meta,
83-
});
24+
const config = new Config();
25+
const workspaces = config.getAllWorkspaceMetadata();
26+
const extensionMeta = readExtensionMetadata();
27+
28+
console.log(`[cmux] Read ${extensionMeta.size} entries from extension metadata`);
29+
30+
// Enrich with extension metadata
31+
const enriched: WorkspaceWithContext[] = workspaces.map((ws) => {
32+
const meta = extensionMeta.get(ws.id);
33+
if (meta) {
34+
console.log(
35+
`[cmux] ${ws.id}: recency=${meta.recency}, streaming=${meta.streaming}`
36+
);
8437
}
85-
}
86-
87-
// Sort by recency (metadata recency > createdAt > name)
38+
return {
39+
...ws,
40+
extensionMetadata: meta,
41+
};
42+
});
8843

44+
// Sort by recency (extension metadata > createdAt > name)
8945
const recencyOf = (w: WorkspaceWithContext): number =>
9046
w.extensionMetadata?.recency ?? (w.createdAt ? Date.parse(w.createdAt) : 0);
91-
workspaces.sort((a, b) => {
47+
48+
enriched.sort((a, b) => {
9249
const aRecency = recencyOf(a);
9350
const bRecency = recencyOf(b);
9451
if (aRecency !== bRecency) return bRecency - aRecency;
9552
return a.name.localeCompare(b.name);
9653
});
9754

98-
return workspaces;
55+
return enriched;
9956
}
10057

10158
/**

0 commit comments

Comments
 (0)