refactor(telemetry): drop install events from cli-installer
This commit is contained in:
@@ -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()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -23,11 +23,8 @@ import {
|
|||||||
validateNonTuiArgs,
|
validateNonTuiArgs,
|
||||||
} from "./install-validators"
|
} from "./install-validators"
|
||||||
import { getUnsupportedOpenCodeVersionMessage } from "./minimum-opencode-version"
|
import { getUnsupportedOpenCodeVersionMessage } from "./minimum-opencode-version"
|
||||||
import { createCliPostHog, getPostHogDistinctId } from "../shared/posthog"
|
|
||||||
|
|
||||||
export async function runCliInstaller(args: InstallArgs, version: string): Promise<number> {
|
export async function runCliInstaller(args: InstallArgs, version: string): Promise<number> {
|
||||||
const posthog = createCliPostHog()
|
|
||||||
const distinctId = getPostHogDistinctId()
|
|
||||||
const validation = validateNonTuiArgs(args)
|
const validation = validateNonTuiArgs(args)
|
||||||
if (!validation.valid) {
|
if (!validation.valid) {
|
||||||
printHeader(false)
|
printHeader(false)
|
||||||
@@ -65,16 +62,6 @@ export async function runCliInstaller(args: InstallArgs, version: string): Promi
|
|||||||
const unsupportedVersionMessage = getUnsupportedOpenCodeVersionMessage(openCodeVersion)
|
const unsupportedVersionMessage = getUnsupportedOpenCodeVersionMessage(openCodeVersion)
|
||||||
if (unsupportedVersionMessage) {
|
if (unsupportedVersionMessage) {
|
||||||
printWarning(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
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,16 +77,6 @@ export async function runCliInstaller(args: InstallArgs, version: string): Promi
|
|||||||
const pluginResult = await addPluginToOpenCodeConfig(version)
|
const pluginResult = await addPluginToOpenCodeConfig(version)
|
||||||
if (!pluginResult.success) {
|
if (!pluginResult.success) {
|
||||||
printError(`Failed: ${pluginResult.error}`)
|
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
|
return 1
|
||||||
}
|
}
|
||||||
printSuccess(
|
printSuccess(
|
||||||
@@ -110,16 +87,6 @@ export async function runCliInstaller(args: InstallArgs, version: string): Promi
|
|||||||
const omoResult = writeOmoConfig(config)
|
const omoResult = writeOmoConfig(config)
|
||||||
if (!omoResult.success) {
|
if (!omoResult.success) {
|
||||||
printError(`Failed: ${omoResult.error}`)
|
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
|
return 1
|
||||||
}
|
}
|
||||||
printSuccess(`Config written ${SYMBOLS.arrow} ${color.dim(omoResult.configPath)}`)
|
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(color.dim("oMoMoMoMo... Enjoy!"))
|
||||||
console.log()
|
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) {
|
if ((config.hasClaude || config.hasGemini || config.hasCopilot) && !args.skipAuth) {
|
||||||
printBox(
|
printBox(
|
||||||
`Run ${color.cyan("opencode auth login")} and select your provider:\n` +
|
`Run ${color.cyan("opencode auth login")} and select your provider:\n` +
|
||||||
|
|||||||
Reference in New Issue
Block a user