Skip to content

Commit ba9668d

Browse files
committed
clean up logging
1 parent c48eb02 commit ba9668d

37 files changed

+310
-170
lines changed

apps/array/src/api/generated.ts

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19466,31 +19466,4 @@ export class ApiClient {
1946619466

1946719467
export function createApiClient(fetcher: Fetcher, baseUrl?: string) {
1946819468
return new ApiClient(fetcher).setBaseUrl(baseUrl ?? "");
19469-
}
19470-
19471-
/**
19472-
Example usage:
19473-
const api = createApiClient((method, url, params) =>
19474-
fetch(url, { method, body: JSON.stringify(params) }).then((res) => res.json()),
19475-
);
19476-
api.get("/users").then((users) => console.log(users));
19477-
api.post("/users", { body: { name: "John" } }).then((user) => console.log(user));
19478-
api.put("/users/:id", { path: { id: 1 }, body: { name: "John" } }).then((user) => console.log(user));
19479-
19480-
// With error handling
19481-
const result = await api.get("/users/{id}", { path: { id: "123" }, withResponse: true });
19482-
if (result.ok) {
19483-
// Access data directly
19484-
const user = result.data;
19485-
console.log(user);
19486-
19487-
// Or use the json() method for compatibility
19488-
const userFromJson = await result.json();
19489-
console.log(userFromJson);
19490-
} else {
19491-
const error = result.data;
19492-
console.error(`Error ${result.status}:`, error);
19493-
}
19494-
*/
19495-
19496-
// </ApiClient>
19469+
}

apps/array/src/api/posthogClient.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import { logger } from "@renderer/lib/logger";
12
import type { LogEntry, RepositoryConfig, Task, TaskRun } from "@shared/types";
23
import { buildApiFetcher } from "./fetcher";
34
import { createApiClient, type Schemas } from "./generated";
45

6+
const log = logger.scope("posthog-client");
7+
58
export class PostHogAPIClient {
69
private api: ReturnType<typeof createApiClient>;
710
private _teamId: number | null = null;
@@ -195,7 +198,7 @@ export class PostHogAPIClient {
195198
const response = await fetch(logUrl);
196199

197200
if (!response.ok) {
198-
console.warn(
201+
log.warn(
199202
`Failed to fetch logs: ${response.status} ${response.statusText}`,
200203
);
201204
return [];
@@ -211,7 +214,7 @@ export class PostHogAPIClient {
211214
.split("\n")
212215
.map((line) => JSON.parse(line) as LogEntry);
213216
} catch (err) {
214-
console.warn("Failed to fetch task logs from latest run", err);
217+
log.warn("Failed to fetch task logs from latest run", err);
215218
return [];
216219
}
217220
}

apps/array/src/main/lib/logger.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import log from "electron-log/main";
2+
3+
log.transports.file.level = "info";
4+
log.transports.console.level = "debug";
5+
6+
export const logger = {
7+
info: (message: string, ...args: unknown[]) => log.info(message, ...args),
8+
warn: (message: string, ...args: unknown[]) => log.warn(message, ...args),
9+
error: (message: string, ...args: unknown[]) => log.error(message, ...args),
10+
debug: (message: string, ...args: unknown[]) => log.debug(message, ...args),
11+
12+
scope: (name: string) => {
13+
const scoped = log.scope(name);
14+
return {
15+
info: (message: string, ...args: unknown[]) => scoped.info(message, ...args),
16+
warn: (message: string, ...args: unknown[]) => scoped.warn(message, ...args),
17+
error: (message: string, ...args: unknown[]) => scoped.error(message, ...args),
18+
debug: (message: string, ...args: unknown[]) => scoped.debug(message, ...args),
19+
};
20+
},
21+
};
22+
23+
export type Logger = typeof logger;
24+
export type ScopedLogger = ReturnType<typeof logger.scope>;

apps/array/src/main/preload.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
TabContextMenuResult,
77
TaskContextMenuResult,
88
} from "./services/contextMenu.types.js";
9+
import 'electron-log/preload'
910

1011
interface MessageBoxOptions {
1112
type?: "none" | "info" | "error" | "question" | "warning";

apps/array/src/main/services/agent.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import {
99
type IpcMainInvokeEvent,
1010
ipcMain,
1111
} from "electron";
12+
import { logger } from "../lib/logger";
13+
14+
const log = logger.scope("agent");
1215

1316
interface AgentStartParams {
1417
taskId: string;
@@ -96,12 +99,9 @@ export function registerAgentIpc(
9699
process.env.CLAUDE_CONFIG_DIR || join(app.getPath("home"), ".claude");
97100
const statsigPath = join(claudeConfigDir, "statsig");
98101
rmSync(statsigPath, { recursive: true, force: true });
99-
console.log(
100-
"[agent] Cleared statsig cache to work around input_examples bug",
101-
);
102+
log.info("Cleared statsig cache to work around input_examples bug");
102103
} catch (error) {
103-
// Ignore errors if the folder doesn't exist
104-
console.warn("[agent] Could not clear statsig cache:", error);
104+
log.warn("Could not clear statsig cache:", error);
105105
}
106106

107107
const taskId = randomUUID();
@@ -123,7 +123,7 @@ export function registerAgentIpc(
123123
if (stderrBuffer.length > 50) {
124124
stderrBuffer.shift();
125125
}
126-
console.error(`[agent][claude-stderr] ${text}`);
126+
log.error(`[claude-stderr] ${text}`);
127127
emitToRenderer({
128128
type: "status",
129129
ts: Date.now(),
@@ -181,7 +181,7 @@ export function registerAgentIpc(
181181
});
182182
}
183183
} catch (err) {
184-
console.warn("[agent] failed to fetch task progress", err);
184+
log.warn("Failed to fetch task progress", err);
185185
}
186186
};
187187

@@ -214,7 +214,7 @@ export function registerAgentIpc(
214214
} catch {}
215215
symlinkSync(process.execPath, nodeSymlinkPath);
216216
} catch (err) {
217-
console.warn("[agent] Failed to setup mock node environment", err);
217+
log.warn("Failed to setup mock node environment", err);
218218
}
219219

220220
const newPath = `${mockNodeDir}:${process.env.PATH || ""}`;
@@ -259,7 +259,7 @@ export function registerAgentIpc(
259259

260260
emitToRenderer({ type: "done", success: true, ts: Date.now() });
261261
} catch (err) {
262-
console.error("[agent] task execution failed", err);
262+
log.error("Task execution failed", err);
263263
let errorMessage = err instanceof Error ? err.message : String(err);
264264
const cause =
265265
err instanceof Error && "cause" in err && err.cause

apps/array/src/main/services/fileWatcher.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import {
77
type IpcMainInvokeEvent,
88
ipcMain,
99
} from "electron";
10+
import { logger } from "../lib/logger";
11+
12+
const log = logger.scope("file-watcher");
1013

1114
const WATCHER_IGNORE_PATTERNS = ["**/node_modules/**", "**/.git/**"];
1215
const DEBOUNCE_MS = 100;
@@ -72,7 +75,7 @@ class FileService {
7275
return a.name.localeCompare(b.name);
7376
});
7477
} catch (error) {
75-
console.error("Failed to list directory:", error);
78+
log.error("Failed to list directory:", error);
7679
return [];
7780
}
7881
}
@@ -115,7 +118,7 @@ class FileService {
115118
repoPath,
116119
(err, events) => {
117120
if (err) {
118-
console.error("Watcher error:", err);
121+
log.error("Watcher error:", err);
119122
return;
120123
}
121124

@@ -162,7 +165,7 @@ class FileService {
162165
gitDirToWatch,
163166
(err, events) => {
164167
if (err) {
165-
console.error("Git watcher error:", err);
168+
log.error("Git watcher error:", err);
166169
return;
167170
}
168171
if (
@@ -175,7 +178,7 @@ class FileService {
175178
},
176179
);
177180
} catch (error) {
178-
console.warn("Failed to set up git watcher:", error);
181+
log.warn("Failed to set up git watcher:", error);
179182
}
180183

181184
state.subscription = subscription;
@@ -196,7 +199,7 @@ class FileService {
196199
ignore: WATCHER_IGNORE_PATTERNS,
197200
});
198201
} catch (error) {
199-
console.error("Failed to write snapshot:", error);
202+
log.error("Failed to write snapshot:", error);
200203
}
201204

202205
await state.subscription?.unsubscribe();

apps/array/src/main/services/folders.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ import type {
55
TaskFolderAssociation,
66
WorktreeInfo,
77
} from "../../shared/types";
8+
import { logger } from "../lib/logger";
89
import { clearAllStoreData, foldersStore } from "./store";
910

11+
const log = logger.scope("folders");
12+
1013
function generateFolderId(): string {
1114
return `folder_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
1215
}
@@ -54,7 +57,7 @@ async function removeFolder(folderId: string): Promise<void> {
5457

5558
foldersStore.set("folders", filtered);
5659
foldersStore.set("taskAssociations", filteredAssociations);
57-
console.log(`Removed folder with ID: ${folderId}`);
60+
log.debug(`Removed folder with ID: ${folderId}`);
5861
}
5962

6063
async function updateFolderAccessed(folderId: string): Promise<void> {
@@ -148,7 +151,7 @@ export function registerFoldersIpc(): void {
148151
try {
149152
return await getFolders();
150153
} catch (error) {
151-
console.error("Failed to get folders:", error);
154+
log.error("Failed to get folders:", error);
152155
return [];
153156
}
154157
},
@@ -163,7 +166,7 @@ export function registerFoldersIpc(): void {
163166
try {
164167
return await addFolder(folderPath);
165168
} catch (error) {
166-
console.error(`Failed to add folder ${folderPath}:`, error);
169+
log.error(`Failed to add folder ${folderPath}:`, error);
167170
throw error;
168171
}
169172
},
@@ -175,7 +178,7 @@ export function registerFoldersIpc(): void {
175178
try {
176179
await removeFolder(folderId);
177180
} catch (error) {
178-
console.error(`Failed to remove folder ${folderId}:`, error);
181+
log.error(`Failed to remove folder ${folderId}:`, error);
179182
throw error;
180183
}
181184
},
@@ -187,7 +190,7 @@ export function registerFoldersIpc(): void {
187190
try {
188191
await updateFolderAccessed(folderId);
189192
} catch (error) {
190-
console.error(`Failed to update folder with ID: ${folderId}:`, error);
193+
log.error(`Failed to update folder with ID: ${folderId}:`, error);
191194
}
192195
},
193196
);
@@ -197,9 +200,9 @@ export function registerFoldersIpc(): void {
197200
async (_event: IpcMainInvokeEvent): Promise<void> => {
198201
try {
199202
clearAllStoreData();
200-
console.log("Cleared all application data");
203+
log.info("Cleared all application data");
201204
} catch (error) {
202-
console.error("Failed to clear all data:", error);
205+
log.error("Failed to clear all data:", error);
203206
throw error;
204207
}
205208
},
@@ -211,7 +214,7 @@ export function registerFoldersIpc(): void {
211214
try {
212215
return await getTaskAssociations();
213216
} catch (error) {
214-
console.error("Failed to get task associations:", error);
217+
log.error("Failed to get task associations:", error);
215218
return [];
216219
}
217220
},
@@ -226,7 +229,7 @@ export function registerFoldersIpc(): void {
226229
try {
227230
return await getTaskAssociation(taskId);
228231
} catch (error) {
229-
console.error(`Failed to get task association for ${taskId}:`, error);
232+
log.error(`Failed to get task association for ${taskId}:`, error);
230233
return null;
231234
}
232235
},
@@ -244,7 +247,7 @@ export function registerFoldersIpc(): void {
244247
try {
245248
return await setTaskAssociation(taskId, folderId, folderPath, worktree);
246249
} catch (error) {
247-
console.error(`Failed to set task association for ${taskId}:`, error);
250+
log.error(`Failed to set task association for ${taskId}:`, error);
248251
throw error;
249252
}
250253
},
@@ -260,7 +263,7 @@ export function registerFoldersIpc(): void {
260263
try {
261264
return await updateTaskWorktree(taskId, worktree);
262265
} catch (error) {
263-
console.error(`Failed to update worktree for ${taskId}:`, error);
266+
log.error(`Failed to update worktree for ${taskId}:`, error);
264267
return null;
265268
}
266269
},
@@ -272,7 +275,7 @@ export function registerFoldersIpc(): void {
272275
try {
273276
await removeTaskAssociation(taskId);
274277
} catch (error) {
275-
console.error(
278+
log.error(
276279
`Failed to remove task association for ${taskId}:`,
277280
error,
278281
);
@@ -287,7 +290,7 @@ export function registerFoldersIpc(): void {
287290
try {
288291
await clearTaskWorktree(taskId);
289292
} catch (error) {
290-
console.error(`Failed to clear worktree for ${taskId}:`, error);
293+
log.error(`Failed to clear worktree for ${taskId}:`, error);
291294
throw error;
292295
}
293296
},

0 commit comments

Comments
 (0)