Skip to content

Commit ef5ce07

Browse files
committed
Move status detail helpers from commands to status layer
statusBar.ts was importing buildStatusDetails and preferredStatusAction from commands/showStatus.ts, creating an inverted dependency from the status layer to the commands layer. Extract these pure functions to status/details.ts so both the command and the status bar import from the same layer. Re-exports in showStatus.ts keep existing consumers working. Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
1 parent 2dc9c07 commit ef5ce07

3 files changed

Lines changed: 82 additions & 78 deletions

File tree

src/commands/showStatus.ts

Lines changed: 4 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
1-
import {
2-
describePatchloomCompatibility,
3-
describePatchloomSource,
4-
patchloomNeedsUpgrade,
5-
PatchloomStatus,
6-
resolvePatchloomStatus
7-
} from "../binary/patchloom";
8-
import { inspectWorkspaceReadiness, WorkspaceReadiness } from "../workspace/readiness";
1+
import { patchloomNeedsUpgrade, resolvePatchloomStatus } from "../binary/patchloom";
2+
import { buildStatusDetails, preferredStatusAction } from "../status/details";
3+
import { inspectWorkspaceReadiness } from "../workspace/readiness";
94

10-
export interface SetupAction {
11-
readonly title: string;
12-
readonly command: string;
13-
}
5+
export { buildStatusDetails, preferredStatusAction, type SetupAction } from "../status/details";
146

157
export async function showStatus(): Promise<void> {
168
const vscode = await import("vscode");
@@ -35,68 +27,3 @@ export async function showStatus(): Promise<void> {
3527
await vscode.commands.executeCommand(action.command);
3628
}
3729
}
38-
39-
export function buildStatusDetails(status: PatchloomStatus, workspaceReadiness?: WorkspaceReadiness): string {
40-
return [
41-
status.ready ? "Patchloom is ready." : "Patchloom is not ready.",
42-
status.message,
43-
`Source: ${describePatchloomSource(status.source)}`,
44-
status.version ? `Version: ${status.version}` : undefined,
45-
status.detectedVersion ? `Detected CLI version: ${status.detectedVersion}` : undefined,
46-
status.minimumSupportedVersion ? `Required CLI version: >= ${status.minimumSupportedVersion}` : undefined,
47-
status.compatibility ? `CLI compatibility: ${describePatchloomCompatibility(status.compatibility)}` : undefined,
48-
status.compatibilityMessage && patchloomNeedsUpgrade(status) ? status.compatibilityMessage : undefined,
49-
status.binaryPath ? `Path: ${status.binaryPath}` : undefined,
50-
status.managedInstall?.version ? `Managed install version: ${status.managedInstall.version}` : undefined,
51-
status.managedInstall ? `Managed install: ${status.managedInstall.exists ? "available" : "not installed"}` : undefined,
52-
status.managedInstall?.target ? `Managed target: ${status.managedInstall.target.targetTriple}` : undefined,
53-
status.managedInstall?.failure ? `Managed install last failure: ${status.managedInstall.failure.stage} (${status.managedInstall.failure.reason})` : undefined,
54-
...(status.diagnostics ?? []),
55-
workspaceReadiness?.workspaceName ? `Workspace: ${workspaceReadiness.workspaceName}` : undefined,
56-
workspaceReadiness?.hasWorkspace === false
57-
? "Workspace: no folder open"
58-
: undefined,
59-
`Environment: ${workspaceReadiness?.environmentLabel ?? "Local"}`,
60-
workspaceReadiness?.environmentSupport ? `Environment support: ${workspaceReadiness.environmentSupport}` : undefined,
61-
workspaceReadiness?.environmentNote,
62-
workspaceReadiness && workspaceReadiness.workspaceCount > 1 ? `Workspace folders: ${workspaceReadiness.workspaceCount}` : undefined,
63-
workspaceReadiness?.hasAgentsFile === undefined
64-
? undefined
65-
: `AGENTS.md: ${workspaceReadiness.hasAgentsFile ? "present" : "missing"}`,
66-
workspaceReadiness?.hasMcpConfig === undefined
67-
? undefined
68-
: `MCP config: ${workspaceReadiness.hasMcpConfig ? "present" : "missing"}`
69-
].filter((line): line is string => Boolean(line)).join("\n");
70-
}
71-
72-
export function preferredStatusAction(status: PatchloomStatus, workspaceReadiness?: WorkspaceReadiness): SetupAction | undefined {
73-
if (!status.ready) {
74-
return {
75-
title: "Open Settings",
76-
command: "patchloom.openPatchloomSettings"
77-
};
78-
}
79-
80-
if (patchloomNeedsUpgrade(status)) {
81-
return {
82-
title: "Open Releases",
83-
command: "patchloom.openPatchloomReleases"
84-
};
85-
}
86-
87-
if (workspaceReadiness?.hasWorkspace && workspaceReadiness.hasAgentsFile === false) {
88-
return {
89-
title: "Initialize Project",
90-
command: "patchloom.initializeProject"
91-
};
92-
}
93-
94-
if (workspaceReadiness?.hasMcpConfig === false) {
95-
return {
96-
title: "Configure MCP",
97-
command: "patchloom.configureMcp"
98-
};
99-
}
100-
101-
return undefined;
102-
}

src/status/details.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import {
2+
describePatchloomCompatibility,
3+
describePatchloomSource,
4+
patchloomNeedsUpgrade,
5+
PatchloomStatus
6+
} from "../binary/patchloom";
7+
import { WorkspaceReadiness } from "../workspace/readiness";
8+
9+
export interface SetupAction {
10+
readonly title: string;
11+
readonly command: string;
12+
}
13+
14+
export function buildStatusDetails(status: PatchloomStatus, workspaceReadiness?: WorkspaceReadiness): string {
15+
return [
16+
status.ready ? "Patchloom is ready." : "Patchloom is not ready.",
17+
status.message,
18+
`Source: ${describePatchloomSource(status.source)}`,
19+
status.version ? `Version: ${status.version}` : undefined,
20+
status.detectedVersion ? `Detected CLI version: ${status.detectedVersion}` : undefined,
21+
status.minimumSupportedVersion ? `Required CLI version: >= ${status.minimumSupportedVersion}` : undefined,
22+
status.compatibility ? `CLI compatibility: ${describePatchloomCompatibility(status.compatibility)}` : undefined,
23+
status.compatibilityMessage && patchloomNeedsUpgrade(status) ? status.compatibilityMessage : undefined,
24+
status.binaryPath ? `Path: ${status.binaryPath}` : undefined,
25+
status.managedInstall?.version ? `Managed install version: ${status.managedInstall.version}` : undefined,
26+
status.managedInstall ? `Managed install: ${status.managedInstall.exists ? "available" : "not installed"}` : undefined,
27+
status.managedInstall?.target ? `Managed target: ${status.managedInstall.target.targetTriple}` : undefined,
28+
status.managedInstall?.failure ? `Managed install last failure: ${status.managedInstall.failure.stage} (${status.managedInstall.failure.reason})` : undefined,
29+
...(status.diagnostics ?? []),
30+
workspaceReadiness?.workspaceName ? `Workspace: ${workspaceReadiness.workspaceName}` : undefined,
31+
workspaceReadiness?.hasWorkspace === false
32+
? "Workspace: no folder open"
33+
: undefined,
34+
`Environment: ${workspaceReadiness?.environmentLabel ?? "Local"}`,
35+
workspaceReadiness?.environmentSupport ? `Environment support: ${workspaceReadiness.environmentSupport}` : undefined,
36+
workspaceReadiness?.environmentNote,
37+
workspaceReadiness && workspaceReadiness.workspaceCount > 1 ? `Workspace folders: ${workspaceReadiness.workspaceCount}` : undefined,
38+
workspaceReadiness?.hasAgentsFile === undefined
39+
? undefined
40+
: `AGENTS.md: ${workspaceReadiness.hasAgentsFile ? "present" : "missing"}`,
41+
workspaceReadiness?.hasMcpConfig === undefined
42+
? undefined
43+
: `MCP config: ${workspaceReadiness.hasMcpConfig ? "present" : "missing"}`
44+
].filter((line): line is string => Boolean(line)).join("\n");
45+
}
46+
47+
export function preferredStatusAction(status: PatchloomStatus, workspaceReadiness?: WorkspaceReadiness): SetupAction | undefined {
48+
if (!status.ready) {
49+
return {
50+
title: "Open Settings",
51+
command: "patchloom.openPatchloomSettings"
52+
};
53+
}
54+
55+
if (patchloomNeedsUpgrade(status)) {
56+
return {
57+
title: "Open Releases",
58+
command: "patchloom.openPatchloomReleases"
59+
};
60+
}
61+
62+
if (workspaceReadiness?.hasWorkspace && workspaceReadiness.hasAgentsFile === false) {
63+
return {
64+
title: "Initialize Project",
65+
command: "patchloom.initializeProject"
66+
};
67+
}
68+
69+
if (workspaceReadiness?.hasMcpConfig === false) {
70+
return {
71+
title: "Configure MCP",
72+
command: "patchloom.configureMcp"
73+
};
74+
}
75+
76+
return undefined;
77+
}

src/status/statusBar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as vscode from "vscode";
22
import { patchloomNeedsUpgrade, resolvePatchloomStatus } from "../binary/patchloom";
3-
import { buildStatusDetails, preferredStatusAction } from "../commands/showStatus";
3+
import { buildStatusDetails, preferredStatusAction } from "./details";
44
import { inspectWorkspaceReadiness } from "../workspace/readiness";
55

66
let statusBarItem: vscode.StatusBarItem | undefined;

0 commit comments

Comments
 (0)