From be2eee63069d19091090b90ab5b68151aa8b81e7 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 2 May 2026 00:10:54 +0900 Subject: [PATCH] refactor(telemetry): drop install events from cli-installer --- src/cli/cli-installer.telemetry.test.ts | 74 ------------------------- src/cli/cli-installer.ts | 56 ------------------- 2 files changed, 130 deletions(-) delete mode 100644 src/cli/cli-installer.telemetry.test.ts diff --git a/src/cli/cli-installer.telemetry.test.ts b/src/cli/cli-installer.telemetry.test.ts deleted file mode 100644 index c1b8eb8ac..000000000 --- a/src/cli/cli-installer.telemetry.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { afterEach, describe, expect, it, mock, spyOn } from "bun:test" -import * as configManager from "./config-manager" -import type { InstallArgs } from "./types" - -describe("runCliInstaller telemetry isolation", () => { - afterEach(() => { - mock.restore() - }) - - it("does not crash CLI install when telemetry shutdown throws", async () => { - // given - const restoreSpies = [ - spyOn(configManager, "detectCurrentConfig").mockReturnValue({ - isInstalled: false, - installedVersion: null, - hasClaude: false, - isMax20: false, - hasOpenAI: false, - hasGemini: false, - hasCopilot: false, - hasOpencodeZen: false, - hasZaiCodingPlan: false, - hasKimiForCoding: false, - hasOpencodeGo: false, - hasVercelAiGateway: false, - }), - spyOn(configManager, "isOpenCodeInstalled").mockResolvedValue(true), - spyOn(configManager, "getOpenCodeVersion").mockResolvedValue("1.4.0"), - spyOn(configManager, "addPluginToOpenCodeConfig").mockResolvedValue({ - success: true, - configPath: "/tmp/opencode.jsonc", - }), - spyOn(configManager, "writeOmoConfig").mockReturnValue({ - success: true, - configPath: "/tmp/oh-my-opencode.jsonc", - }), - ] - - mock.module("../shared/posthog", () => ({ - createCliPostHog: mock(() => ({ - trackActive: mock(() => {}), - capture: mock(() => {}), - captureException: mock(() => {}), - shutdown: mock(async () => { - throw new Error("shutdown failed") - }), - })), - getPostHogDistinctId: mock(() => "install-distinct-id"), - })) - - const { runCliInstaller } = await import(`./cli-installer?telemetry=${Date.now()}-${Math.random()}`) - const args: InstallArgs = { - tui: false, - claude: "no", - openai: "yes", - gemini: "no", - copilot: "yes", - opencodeZen: "no", - zaiCodingPlan: "no", - kimiForCoding: "no", - opencodeGo: "no", - } - - // when - const result = await runCliInstaller(args, "3.4.0") - - // then - expect(result).toBe(0) - - for (const spy of restoreSpies) { - spy.mockRestore() - } - }) -}) diff --git a/src/cli/cli-installer.ts b/src/cli/cli-installer.ts index 72d5d8d7c..029215757 100644 --- a/src/cli/cli-installer.ts +++ b/src/cli/cli-installer.ts @@ -23,11 +23,8 @@ import { validateNonTuiArgs, } from "./install-validators" import { getUnsupportedOpenCodeVersionMessage } from "./minimum-opencode-version" -import { createCliPostHog, getPostHogDistinctId } from "../shared/posthog" export async function runCliInstaller(args: InstallArgs, version: string): Promise { - const posthog = createCliPostHog() - const distinctId = getPostHogDistinctId() const validation = validateNonTuiArgs(args) if (!validation.valid) { printHeader(false) @@ -65,16 +62,6 @@ export async function runCliInstaller(args: InstallArgs, version: string): Promi const unsupportedVersionMessage = getUnsupportedOpenCodeVersionMessage(openCodeVersion) if (unsupportedVersionMessage) { printWarning(unsupportedVersionMessage) - try { - posthog.capture({ distinctId, event: "install_failed", properties: { command: "install", reason: "unsupported_opencode_version", is_update: isUpdate } }) - } catch { - // telemetry failure is non-fatal, silently ignore - } - try { - await posthog.shutdown() - } catch { - // telemetry failure is non-fatal, silently ignore - } return 1 } } @@ -90,16 +77,6 @@ export async function runCliInstaller(args: InstallArgs, version: string): Promi const pluginResult = await addPluginToOpenCodeConfig(version) if (!pluginResult.success) { printError(`Failed: ${pluginResult.error}`) - try { - posthog.capture({ distinctId, event: "install_failed", properties: { command: "install", reason: "plugin_config_write_failed", is_update: isUpdate } }) - } catch { - // telemetry failure is non-fatal, silently ignore - } - try { - await posthog.shutdown() - } catch { - // telemetry failure is non-fatal, silently ignore - } return 1 } printSuccess( @@ -110,16 +87,6 @@ export async function runCliInstaller(args: InstallArgs, version: string): Promi const omoResult = writeOmoConfig(config) if (!omoResult.success) { printError(`Failed: ${omoResult.error}`) - try { - posthog.capture({ distinctId, event: "install_failed", properties: { command: "install", reason: "omo_config_write_failed", is_update: isUpdate } }) - } catch { - // telemetry failure is non-fatal, silently ignore - } - try { - await posthog.shutdown() - } catch { - // telemetry failure is non-fatal, silently ignore - } return 1 } printSuccess(`Config written ${SYMBOLS.arrow} ${color.dim(omoResult.configPath)}`) @@ -169,29 +136,6 @@ export async function runCliInstaller(args: InstallArgs, version: string): Promi console.log(color.dim("oMoMoMoMo... Enjoy!")) console.log() - try { - posthog.capture({ - distinctId, - event: "install_completed", - properties: { - command: "install", - is_update: isUpdate, - has_claude: config.hasClaude, - has_openai: config.hasOpenAI, - has_gemini: config.hasGemini, - has_copilot: config.hasCopilot, - has_opencode_zen: config.hasOpencodeZen, - }, - }) - } catch { - // telemetry failure is non-fatal, silently ignore - } - try { - await posthog.shutdown() - } catch { - // telemetry failure is non-fatal, silently ignore - } - if ((config.hasClaude || config.hasGemini || config.hasCopilot) && !args.skipAuth) { printBox( `Run ${color.cyan("opencode auth login")} and select your provider:\n` +