@@ -2,6 +2,7 @@ import fs from 'node:fs/promises';
22import { createWriteStream , existsSync , mkdirSync , type WriteStream } from 'node:fs' ;
33import path from 'node:path' ;
44import { program } from 'commander' ;
5+ import { PostHog } from 'posthog-node' ;
56import { execa , type ResultPromise } from 'execa' ;
67import ora from 'ora' ;
78import pc from 'picocolors' ;
@@ -138,13 +139,31 @@ export async function prepareSupportingData() {
138139 ) ;
139140 if ( ! treeResponse . ok ) {
140141 spinner . fail ( 'Failed to fetch repository tree.' ) ;
141- program . error ( `GitHub API error: ${ treeResponse . statusText } ` ) ;
142+ const errorText = `GitHub API error: ${ treeResponse . statusText } ` ;
143+ captureOnboardingEvent ( {
144+ name : 'onboarding_step_failed' ,
145+ properties : {
146+ step_name : 'init' ,
147+ error_category : 'support_files' ,
148+ error_message : errorText ,
149+ } ,
150+ } ) ;
151+ program . error ( errorText ) ;
142152 }
143153
144154 const parsed = GitHubTreeSchema . safeParse ( await treeResponse . json ( ) ) ;
145155 if ( ! parsed . success ) {
146156 spinner . fail ( 'Failed to parse repository tree.' ) ;
147- program . error ( 'Unexpected response format from GitHub API. The repository structure may have changed.' ) ;
157+ const errorText = 'Unexpected response format from GitHub API. The repository structure may have changed.' ;
158+ captureOnboardingEvent ( {
159+ name : 'onboarding_step_failed' ,
160+ properties : {
161+ step_name : 'init' ,
162+ error_category : 'support_files' ,
163+ error_message : errorText ,
164+ } ,
165+ } ) ;
166+ program . error ( errorText ) ;
148167 }
149168
150169 const files = parsed . data . tree . filter ( ( entry ) => entry . type === 'blob' && entry . path . startsWith ( 'plugins/' ) ) ;
@@ -165,15 +184,28 @@ export async function prepareSupportingData() {
165184
166185 return { path : file . path , error : null } ;
167186 } catch ( err ) {
168- return { path : file . path , error : err instanceof Error ? err . message : String ( err ) } ;
187+ return {
188+ path : file . path ,
189+ error : err instanceof Error ? err . message : String ( err ) ,
190+ } ;
169191 }
170192 } ) ,
171193 ) ;
172194
173195 const failed = results . filter ( ( r ) => r . error !== null ) ;
174196 if ( failed . length > 0 ) {
175- spinner . fail ( `Failed to fetch some files from onboarding repository or store them in ${ cosmoDir } .` ) ;
176- program . error ( failed . map ( ( f ) => ` ${ f . path } : ${ f . error } ` ) . join ( '\n' ) ) ;
197+ const failText = `Failed to fetch some files from onboarding repository or store them in ${ cosmoDir } .` ;
198+ const errorText = failed . map ( ( f ) => ` ${ f . path } : ${ f . error } ` ) . join ( '\n' ) ;
199+ captureOnboardingEvent ( {
200+ name : 'onboarding_step_failed' ,
201+ properties : {
202+ step_name : 'init' ,
203+ error_category : 'support_files' ,
204+ error_message : `${ failText } \n${ errorText } ` ,
205+ } ,
206+ } ) ;
207+ spinner . fail ( failText ) ;
208+ program . error ( errorText ) ;
177209 }
178210
179211 spinner . succeed ( `Support files copied to ${ pc . bold ( cosmoDir ) } ` ) ;
@@ -227,14 +259,32 @@ export async function checkDockerReadiness(): Promise<void> {
227259 const spinner = demoSpinner ( 'Checking Docker availability…' ) . start ( ) ;
228260
229261 if ( ! ( await isDockerAvailable ( ) ) ) {
230- spinner . fail ( 'Docker is not available.' ) ;
262+ const failText = 'Docker is not available.' ;
263+ captureOnboardingEvent ( {
264+ name : 'onboarding_step_failed' ,
265+ properties : {
266+ step_name : 'init' ,
267+ error_category : 'docker_readiness' ,
268+ error_message : failText ,
269+ } ,
270+ } ) ;
271+ spinner . fail ( failText ) ;
231272 program . error (
232273 `Docker CLI is not installed or the daemon is not running.\nInstall Docker: ${ pc . underline ( 'https://docs.docker.com/get-docker/' ) } ` ,
233274 ) ;
234275 }
235276
236277 if ( ! ( await isBuildxAvailable ( ) ) ) {
237- spinner . fail ( 'Docker Buildx is not available.' ) ;
278+ const failText = 'Docker Buildx is not available.' ;
279+ captureOnboardingEvent ( {
280+ name : 'onboarding_step_failed' ,
281+ properties : {
282+ step_name : 'init' ,
283+ error_category : 'docker_readiness' ,
284+ error_message : failText ,
285+ } ,
286+ } ) ;
287+ spinner . fail ( failText ) ;
238288 program . error (
239289 `Docker Buildx plugin is required for multi-platform builds.\nSee: ${ pc . underline ( 'https://docs.docker.com/build/install-buildx/' ) } ` ,
240290 ) ;
@@ -249,9 +299,19 @@ export async function checkDockerReadiness(): Promise<void> {
249299 try {
250300 await createDockerContainerBuilder ( config . dockerBuilderName ) ;
251301 } catch ( err ) {
252- spinner . fail ( `Failed to create buildx builder "${ config . dockerBuilderName } ".` ) ;
302+ const failText = `Failed to create buildx builder "${ config . dockerBuilderName } ".` ;
303+ const errorText = err instanceof Error ? err . message : String ( err ) ;
304+ spinner . fail ( failText ) ;
305+ captureOnboardingEvent ( {
306+ name : 'onboarding_step_failed' ,
307+ properties : {
308+ step_name : 'init' ,
309+ error_category : 'docker_readiness' ,
310+ error_message : `${ failText } \n${ errorText } ` ,
311+ } ,
312+ } ) ;
253313 program . error (
254- `Could not create a docker-container buildx builder: ${ err instanceof Error ? err . message : String ( err ) } \nYou can create one manually: docker buildx create --use --driver docker-container --name ${ config . dockerBuilderName } ` ,
314+ `Could not create a docker-container buildx builder: ${ errorText } \nYou can create one manually: docker buildx create --use --driver docker-container --name ${ config . dockerBuilderName } ` ,
255315 ) ;
256316 }
257317
@@ -492,11 +552,20 @@ export async function publishAllPlugins({
492552export function captureOnboardingEvent ( {
493553 name,
494554 properties,
495- } : {
496- name : 'onboarding_step_completed' ;
497- properties : {
498- step_name : 'init' | 'check_onboarding' | 'create_federated_graph' | 'run_router_send_metrics' ;
499- } ;
500- } ) : void {
555+ } :
556+ | {
557+ name : 'onboarding_step_completed' ;
558+ properties : {
559+ step_name : 'init' | 'check_onboarding' | 'create_federated_graph' | 'run_router_send_metrics' ;
560+ } ;
561+ }
562+ | {
563+ name : 'onboarding_step_failed' ;
564+ properties : {
565+ step_name : 'init' | 'check_onboarding' | 'create_federated_graph' | 'run_router_send_metrics' ;
566+ error_category : 'resource' | 'support_files' | 'docker_readiness' | 'router' ;
567+ error_message : string ;
568+ } ;
569+ } ) : void {
501570 capture ( name , properties ) ;
502571}
0 commit comments