@c15t/cli 1.2.0-canary.6 → 1.2.0-canary.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +90 -91
- package/dist/utils/telemetry.d.ts +38 -37
- package/dist/utils/telemetry.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -327,44 +327,43 @@ const createCliLogger = (level)=>{
|
|
|
327
327
|
return extendedLogger;
|
|
328
328
|
};
|
|
329
329
|
const TELEMETRY_DISABLED_ENV = 'C15T_TELEMETRY_DISABLED';
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
}({});
|
|
330
|
+
const TelemetryEventName = {
|
|
331
|
+
CLI_INVOKED: 'cli.invoked',
|
|
332
|
+
CLI_COMPLETED: 'cli.completed',
|
|
333
|
+
CLI_EXITED: 'cli.exited',
|
|
334
|
+
CLI_ENVIRONMENT_DETECTED: 'cli.environment_detected',
|
|
335
|
+
COMMAND_EXECUTED: 'command.executed',
|
|
336
|
+
COMMAND_SUCCEEDED: 'command.succeeded',
|
|
337
|
+
COMMAND_FAILED: 'command.failed',
|
|
338
|
+
COMMAND_UNKNOWN: 'command.unknown',
|
|
339
|
+
INTERACTIVE_MENU_OPENED: 'ui.menu.opened',
|
|
340
|
+
INTERACTIVE_MENU_EXITED: 'ui.menu.exited',
|
|
341
|
+
CONFIG_LOADED: 'config.loaded',
|
|
342
|
+
CONFIG_ERROR: 'config.error',
|
|
343
|
+
CONFIG_UPDATED: 'config.updated',
|
|
344
|
+
HELP_DISPLAYED: 'help.displayed',
|
|
345
|
+
VERSION_DISPLAYED: 'version.displayed',
|
|
346
|
+
ONBOARDING_STARTED: 'onboarding.started',
|
|
347
|
+
ONBOARDING_COMPLETED: 'onboarding.completed',
|
|
348
|
+
ONBOARDING_EXITED: 'onboarding.exited',
|
|
349
|
+
ONBOARDING_STORAGE_MODE_SELECTED: 'onboarding.storage_mode_selected',
|
|
350
|
+
ONBOARDING_C15T_MODE_CONFIGURED: 'onboarding.c15t_mode_configured',
|
|
351
|
+
ONBOARDING_OFFLINE_MODE_CONFIGURED: 'onboarding.offline_mode_configured',
|
|
352
|
+
ONBOARDING_SELF_HOSTED_CONFIGURED: 'onboarding.self_hosted_configured',
|
|
353
|
+
ONBOARDING_CUSTOM_MODE_CONFIGURED: 'onboarding.custom_mode_configured',
|
|
354
|
+
ONBOARDING_DEPENDENCIES_CHOICE: 'onboarding.dependencies_choice',
|
|
355
|
+
ONBOARDING_DEPENDENCIES_INSTALLED: 'onboarding.dependencies_installed',
|
|
356
|
+
ONBOARDING_GITHUB_STAR: 'onboarding.github_star',
|
|
357
|
+
ERROR_OCCURRED: 'error.occurred',
|
|
358
|
+
MIGRATION_STARTED: 'migration.started',
|
|
359
|
+
MIGRATION_PLANNED: 'migration.planned',
|
|
360
|
+
MIGRATION_EXECUTED: 'migration.executed',
|
|
361
|
+
MIGRATION_COMPLETED: 'migration.completed',
|
|
362
|
+
MIGRATION_FAILED: 'migration.failed',
|
|
363
|
+
GENERATE_STARTED: 'generate.started',
|
|
364
|
+
GENERATE_COMPLETED: 'generate.completed',
|
|
365
|
+
GENERATE_FAILED: 'generate.failed'
|
|
366
|
+
};
|
|
368
367
|
class Telemetry {
|
|
369
368
|
client = null;
|
|
370
369
|
disabled;
|
|
@@ -415,7 +414,7 @@ class Telemetry {
|
|
|
415
414
|
if (this.disabled || !this.client) return;
|
|
416
415
|
const safeFlags = {};
|
|
417
416
|
for (const [key, value] of Object.entries(flags))if ('config' !== key && void 0 !== value) safeFlags[key] = value;
|
|
418
|
-
this.trackEvent(
|
|
417
|
+
this.trackEvent(TelemetryEventName.COMMAND_EXECUTED, {
|
|
419
418
|
command,
|
|
420
419
|
args: args.join(' '),
|
|
421
420
|
flagsData: JSON.stringify(safeFlags)
|
|
@@ -423,7 +422,7 @@ class Telemetry {
|
|
|
423
422
|
}
|
|
424
423
|
trackError(error, command) {
|
|
425
424
|
if (this.disabled || !this.client) return;
|
|
426
|
-
this.trackEvent(
|
|
425
|
+
this.trackEvent(TelemetryEventName.ERROR_OCCURRED, {
|
|
427
426
|
command,
|
|
428
427
|
error: error.message,
|
|
429
428
|
errorName: error.name,
|
|
@@ -982,7 +981,7 @@ async function startOnboarding(context, existingConfig) {
|
|
|
982
981
|
const { logger, cwd, telemetry } = context;
|
|
983
982
|
const handleCancel = (value)=>{
|
|
984
983
|
if (__WEBPACK_EXTERNAL_MODULE__clack_prompts_3cae1695__.isCancel(value)) {
|
|
985
|
-
telemetry.trackEvent(
|
|
984
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_EXITED, {
|
|
986
985
|
reason: 'user_cancelled',
|
|
987
986
|
stage: 'setup'
|
|
988
987
|
});
|
|
@@ -993,7 +992,7 @@ async function startOnboarding(context, existingConfig) {
|
|
|
993
992
|
};
|
|
994
993
|
const isUpdate = !!existingConfig;
|
|
995
994
|
logger.info(isUpdate ? 'Starting configuration update...' : 'Starting onboarding process...');
|
|
996
|
-
telemetry.trackEvent(isUpdate ?
|
|
995
|
+
telemetry.trackEvent(isUpdate ? TelemetryEventName.CONFIG_UPDATED : TelemetryEventName.ONBOARDING_STARTED, {
|
|
997
996
|
isUpdate
|
|
998
997
|
});
|
|
999
998
|
telemetry.flushSync();
|
|
@@ -1009,7 +1008,7 @@ async function startOnboarding(context, existingConfig) {
|
|
|
1009
1008
|
logger.debug(`Detected package manager: ${packageManager}`);
|
|
1010
1009
|
if (framework) logger.debug(`Detected framework: ${framework}`);
|
|
1011
1010
|
logger.debug(`React detected: ${hasReact}`);
|
|
1012
|
-
telemetry.trackEvent(
|
|
1011
|
+
telemetry.trackEvent(TelemetryEventName.CLI_ENVIRONMENT_DETECTED, {
|
|
1013
1012
|
packageManager,
|
|
1014
1013
|
framework: framework || 'unknown',
|
|
1015
1014
|
hasReact
|
|
@@ -1054,7 +1053,7 @@ async function startOnboarding(context, existingConfig) {
|
|
|
1054
1053
|
if (handleCancel(storageModeSelection)) return;
|
|
1055
1054
|
const storageMode = storageModeSelection;
|
|
1056
1055
|
logger.debug(`Selected storage mode: ${storageMode}`);
|
|
1057
|
-
telemetry.trackEvent(
|
|
1056
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_STORAGE_MODE_SELECTED, {
|
|
1058
1057
|
storageMode,
|
|
1059
1058
|
isUpdate
|
|
1060
1059
|
});
|
|
@@ -1071,27 +1070,27 @@ async function startOnboarding(context, existingConfig) {
|
|
|
1071
1070
|
if (isUpdate && existingConfig && isClientOptions(existingConfig) && existingConfig.backendURL) initialBackendURL = existingConfig.backendURL;
|
|
1072
1071
|
const c15tResult = await setupC15tMode(context, projectRoot, s, initialBackendURL, handleCancel);
|
|
1073
1072
|
c15tResult.clientConfigContent;
|
|
1074
|
-
telemetry.trackEvent(
|
|
1073
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_C15T_MODE_CONFIGURED, {
|
|
1075
1074
|
usingEnvFile: c15tResult.usingEnvFile,
|
|
1076
1075
|
hasInitialBackendURL: !!initialBackendURL
|
|
1077
1076
|
});
|
|
1078
1077
|
} else if ('offline' === storageMode) {
|
|
1079
1078
|
const offlineResult = await setupOfflineMode(context, projectRoot, s, handleCancel);
|
|
1080
1079
|
offlineResult.clientConfigContent;
|
|
1081
|
-
telemetry.trackEvent(
|
|
1080
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_OFFLINE_MODE_CONFIGURED, {});
|
|
1082
1081
|
} else if ('self-hosted' === storageMode) {
|
|
1083
1082
|
const selfHostedResult = await setupSelfHostedMode(context, projectRoot, s, handleCancel);
|
|
1084
1083
|
selfHostedResult.clientConfigContent;
|
|
1085
1084
|
selfHostedResult.backendConfigContent;
|
|
1086
1085
|
dependenciesToAdd.push(...selfHostedResult.dependencies);
|
|
1087
|
-
telemetry.trackEvent(
|
|
1086
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_SELF_HOSTED_CONFIGURED, {
|
|
1088
1087
|
databaseType: selfHostedResult.adapterChoice,
|
|
1089
1088
|
dependencies: selfHostedResult.dependencies.join(',')
|
|
1090
1089
|
});
|
|
1091
1090
|
} else if ('custom' === storageMode) {
|
|
1092
1091
|
const customResult = await setupCustomMode(context, projectRoot, s);
|
|
1093
1092
|
customResult.clientConfigContent;
|
|
1094
|
-
telemetry.trackEvent(
|
|
1093
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_CUSTOM_MODE_CONFIGURED, {});
|
|
1095
1094
|
}
|
|
1096
1095
|
let addDeps = false;
|
|
1097
1096
|
if (dependenciesToAdd.length > 0) {
|
|
@@ -1102,7 +1101,7 @@ async function startOnboarding(context, existingConfig) {
|
|
|
1102
1101
|
});
|
|
1103
1102
|
if (handleCancel(addDepsSelection)) return;
|
|
1104
1103
|
addDeps = addDepsSelection;
|
|
1105
|
-
telemetry.trackEvent(
|
|
1104
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_DEPENDENCIES_CHOICE, {
|
|
1106
1105
|
confirmed: addDeps,
|
|
1107
1106
|
dependencies: dependenciesToAdd.join(','),
|
|
1108
1107
|
packageManager
|
|
@@ -1116,7 +1115,7 @@ async function startOnboarding(context, existingConfig) {
|
|
|
1116
1115
|
s.stop(`✅ Dependencies installed: ${dependenciesToAdd.map((d)=>__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan(d)).join(', ')}`);
|
|
1117
1116
|
spinnerActive = false;
|
|
1118
1117
|
ranInstall = true;
|
|
1119
|
-
telemetry.trackEvent(
|
|
1118
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_DEPENDENCIES_INSTALLED, {
|
|
1120
1119
|
success: true,
|
|
1121
1120
|
dependencies: dependenciesToAdd.join(','),
|
|
1122
1121
|
packageManager
|
|
@@ -1125,7 +1124,7 @@ async function startOnboarding(context, existingConfig) {
|
|
|
1125
1124
|
s.stop(__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].yellow('⚠️ Dependency installation failed.'));
|
|
1126
1125
|
spinnerActive = false;
|
|
1127
1126
|
logger.error('Installation Error:', installError);
|
|
1128
|
-
telemetry.trackEvent(
|
|
1127
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_DEPENDENCIES_INSTALLED, {
|
|
1129
1128
|
success: false,
|
|
1130
1129
|
error: installError instanceof Error ? installError.message : String(installError),
|
|
1131
1130
|
dependencies: dependenciesToAdd.join(','),
|
|
@@ -1195,12 +1194,12 @@ If you find this useful, we'd really appreciate a GitHub star - it helps others
|
|
|
1195
1194
|
initialValue: true
|
|
1196
1195
|
});
|
|
1197
1196
|
if (__WEBPACK_EXTERNAL_MODULE__clack_prompts_3cae1695__.isCancel(shouldOpenGithub)) {
|
|
1198
|
-
telemetry.trackEvent(
|
|
1197
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_GITHUB_STAR, {
|
|
1199
1198
|
action: 'cancelled'
|
|
1200
1199
|
});
|
|
1201
1200
|
return context.error.handleCancel('GitHub star prompt cancelled. Exiting onboarding.');
|
|
1202
1201
|
}
|
|
1203
|
-
telemetry.trackEvent(
|
|
1202
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_GITHUB_STAR, {
|
|
1204
1203
|
action: shouldOpenGithub ? 'opened_browser' : 'declined'
|
|
1205
1204
|
});
|
|
1206
1205
|
if (shouldOpenGithub) try {
|
|
@@ -1211,7 +1210,7 @@ If you find this useful, we'd really appreciate a GitHub star - it helps others
|
|
|
1211
1210
|
logger.debug('Failed to open browser:', error);
|
|
1212
1211
|
logger.info(`You can star us later by visiting: ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('https://github.com/c15t/c15t')}`);
|
|
1213
1212
|
}
|
|
1214
|
-
telemetry.trackEvent(
|
|
1213
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_COMPLETED, {
|
|
1215
1214
|
success: true,
|
|
1216
1215
|
storageMode,
|
|
1217
1216
|
installDependencies: ranInstall
|
|
@@ -1223,7 +1222,7 @@ If you find this useful, we'd really appreciate a GitHub star - it helps others
|
|
|
1223
1222
|
logger.error('An unexpected error occurred during onboarding:', error);
|
|
1224
1223
|
if (error instanceof Error && error.message) logger.error(`Error details: ${error.message}`);
|
|
1225
1224
|
logger.failed('Onboarding process could not be completed.');
|
|
1226
|
-
telemetry.trackEvent(
|
|
1225
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_COMPLETED, {
|
|
1227
1226
|
success: false,
|
|
1228
1227
|
error: error instanceof Error ? error.message : String(error)
|
|
1229
1228
|
});
|
|
@@ -1236,7 +1235,7 @@ async function setupGenerateEnvironment(context) {
|
|
|
1236
1235
|
logger.debug('Context flags:', flags);
|
|
1237
1236
|
logger.debug(`Context CWD: ${cwd}`);
|
|
1238
1237
|
if (!(0, __WEBPACK_EXTERNAL_MODULE_node_fs_5ea92f0c__.existsSync)(cwd)) {
|
|
1239
|
-
telemetry.trackEvent(
|
|
1238
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_FAILED, {
|
|
1240
1239
|
error: `Directory ${cwd} does not exist`,
|
|
1241
1240
|
stage: 'setup'
|
|
1242
1241
|
});
|
|
@@ -1258,7 +1257,7 @@ async function setupGenerateEnvironment(context) {
|
|
|
1258
1257
|
adapter: memAdapter
|
|
1259
1258
|
};
|
|
1260
1259
|
} catch (adapterError) {
|
|
1261
|
-
telemetry.trackEvent(
|
|
1260
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_FAILED, {
|
|
1262
1261
|
error: adapterError instanceof Error ? adapterError.message : String(adapterError),
|
|
1263
1262
|
stage: 'adapter_initialization'
|
|
1264
1263
|
});
|
|
@@ -1271,14 +1270,14 @@ async function setupGenerateEnvironment(context) {
|
|
|
1271
1270
|
adapter = await (0, __WEBPACK_EXTERNAL_MODULE__c15t_backend_pkgs_db_adapters_cee37d0f__.getAdapter)(config);
|
|
1272
1271
|
logger.debug('Adapter initialized successfully');
|
|
1273
1272
|
} catch (e) {
|
|
1274
|
-
telemetry.trackEvent(
|
|
1273
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_FAILED, {
|
|
1275
1274
|
error: e instanceof Error ? e.message : String(e),
|
|
1276
1275
|
stage: 'adapter_initialization_with_config'
|
|
1277
1276
|
});
|
|
1278
1277
|
return error.handleError(e, 'Failed to initialize database adapter');
|
|
1279
1278
|
}
|
|
1280
1279
|
if (!adapter) {
|
|
1281
|
-
telemetry.trackEvent(
|
|
1280
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_FAILED, {
|
|
1282
1281
|
error: 'Adapter initialization returned undefined',
|
|
1283
1282
|
stage: 'adapter_initialization_check'
|
|
1284
1283
|
});
|
|
@@ -1293,7 +1292,7 @@ async function setupGenerateEnvironment(context) {
|
|
|
1293
1292
|
async function generate(context) {
|
|
1294
1293
|
const { logger, error, telemetry } = context;
|
|
1295
1294
|
logger.debug('Starting generate command...');
|
|
1296
|
-
telemetry.trackEvent(
|
|
1295
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_STARTED, {});
|
|
1297
1296
|
const setupResult = await setupGenerateEnvironment(context);
|
|
1298
1297
|
let { config, adapter } = setupResult;
|
|
1299
1298
|
if (config) {
|
|
@@ -1301,7 +1300,7 @@ async function generate(context) {
|
|
|
1301
1300
|
if (isClientOptions(config)) {
|
|
1302
1301
|
if (config.mode) currentMode = config.mode;
|
|
1303
1302
|
} else if (isC15TOptions(config)) currentMode = 'backend';
|
|
1304
|
-
telemetry.trackEvent(
|
|
1303
|
+
telemetry.trackEvent(TelemetryEventName.CONFIG_LOADED, {
|
|
1305
1304
|
type: currentMode,
|
|
1306
1305
|
exists: true
|
|
1307
1306
|
});
|
|
@@ -1310,7 +1309,7 @@ async function generate(context) {
|
|
|
1310
1309
|
initialValue: false
|
|
1311
1310
|
});
|
|
1312
1311
|
if (!shouldUpdate) {
|
|
1313
|
-
telemetry.trackEvent(
|
|
1312
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_COMPLETED, {
|
|
1314
1313
|
success: false,
|
|
1315
1314
|
reason: 'user_cancelled'
|
|
1316
1315
|
});
|
|
@@ -1321,7 +1320,7 @@ async function generate(context) {
|
|
|
1321
1320
|
logger.debug('Reloading configuration after update...');
|
|
1322
1321
|
const postUpdateResult = await setupGenerateEnvironment(context);
|
|
1323
1322
|
if (!postUpdateResult.config) {
|
|
1324
|
-
telemetry.trackEvent(
|
|
1323
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_FAILED, {
|
|
1325
1324
|
error: 'Failed to load configuration after update'
|
|
1326
1325
|
});
|
|
1327
1326
|
return error.handleError(new Error('Failed to load configuration after update.'), 'Configuration Error');
|
|
@@ -1329,20 +1328,20 @@ async function generate(context) {
|
|
|
1329
1328
|
config = postUpdateResult.config;
|
|
1330
1329
|
postUpdateResult.adapter;
|
|
1331
1330
|
logger.info('Configuration updated successfully.');
|
|
1332
|
-
telemetry.trackEvent(
|
|
1331
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_COMPLETED, {
|
|
1333
1332
|
success: true,
|
|
1334
1333
|
configUpdated: true
|
|
1335
1334
|
});
|
|
1336
1335
|
} else {
|
|
1337
1336
|
logger.debug('Proceeding with existing configuration.');
|
|
1338
|
-
telemetry.trackEvent(
|
|
1337
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_COMPLETED, {
|
|
1339
1338
|
success: true,
|
|
1340
1339
|
configUpdated: false
|
|
1341
1340
|
});
|
|
1342
1341
|
}
|
|
1343
1342
|
} else {
|
|
1344
1343
|
logger.info('No configuration found.');
|
|
1345
|
-
telemetry.trackEvent(
|
|
1344
|
+
telemetry.trackEvent(TelemetryEventName.CONFIG_LOADED, {
|
|
1346
1345
|
exists: false
|
|
1347
1346
|
});
|
|
1348
1347
|
const shouldOnboard = await __WEBPACK_EXTERNAL_MODULE__clack_prompts_3cae1695__.confirm({
|
|
@@ -1350,7 +1349,7 @@ async function generate(context) {
|
|
|
1350
1349
|
initialValue: true
|
|
1351
1350
|
});
|
|
1352
1351
|
if (__WEBPACK_EXTERNAL_MODULE__clack_prompts_3cae1695__.isCancel(shouldOnboard) || !shouldOnboard) {
|
|
1353
|
-
telemetry.trackEvent(
|
|
1352
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_COMPLETED, {
|
|
1354
1353
|
success: false,
|
|
1355
1354
|
reason: 'onboarding_declined'
|
|
1356
1355
|
});
|
|
@@ -1360,7 +1359,7 @@ async function generate(context) {
|
|
|
1360
1359
|
logger.debug('Reloading configuration after onboarding...');
|
|
1361
1360
|
const postOnboardResult = await setupGenerateEnvironment(context);
|
|
1362
1361
|
if (!postOnboardResult.config) {
|
|
1363
|
-
telemetry.trackEvent(
|
|
1362
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_FAILED, {
|
|
1364
1363
|
error: 'Failed to load configuration even after onboarding'
|
|
1365
1364
|
});
|
|
1366
1365
|
return error.handleError(new Error('Failed to load configuration even after onboarding.'), 'Configuration Error');
|
|
@@ -1368,7 +1367,7 @@ async function generate(context) {
|
|
|
1368
1367
|
config = postOnboardResult.config;
|
|
1369
1368
|
postOnboardResult.adapter;
|
|
1370
1369
|
logger.info('New configuration loaded successfully.');
|
|
1371
|
-
telemetry.trackEvent(
|
|
1370
|
+
telemetry.trackEvent(TelemetryEventName.GENERATE_COMPLETED, {
|
|
1372
1371
|
success: true,
|
|
1373
1372
|
newConfigCreated: true
|
|
1374
1373
|
});
|
|
@@ -1379,19 +1378,19 @@ async function executeMigrations(context, runMigrationsFn) {
|
|
|
1379
1378
|
logger.info('Executing migrations...');
|
|
1380
1379
|
const s = __WEBPACK_EXTERNAL_MODULE__clack_prompts_3cae1695__.spinner();
|
|
1381
1380
|
s.start('Running migrations...');
|
|
1382
|
-
telemetry.trackEvent(
|
|
1381
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_EXECUTED, {
|
|
1383
1382
|
status: 'started'
|
|
1384
1383
|
});
|
|
1385
1384
|
try {
|
|
1386
1385
|
await runMigrationsFn();
|
|
1387
1386
|
s.stop('Migrations completed successfully!');
|
|
1388
1387
|
logger.success('🚀 Database migrated successfully');
|
|
1389
|
-
telemetry.trackEvent(
|
|
1388
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_EXECUTED, {
|
|
1390
1389
|
status: 'completed'
|
|
1391
1390
|
});
|
|
1392
1391
|
} catch (error) {
|
|
1393
1392
|
logger.error('Migration failed.');
|
|
1394
|
-
telemetry.trackEvent(
|
|
1393
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_EXECUTED, {
|
|
1395
1394
|
status: 'failed',
|
|
1396
1395
|
error: error instanceof Error ? error.message : String(error)
|
|
1397
1396
|
});
|
|
@@ -1523,7 +1522,7 @@ async function migrate(context) {
|
|
|
1523
1522
|
const { logger, flags, telemetry } = context;
|
|
1524
1523
|
logger.info('Starting migration process...');
|
|
1525
1524
|
logger.debug('Context:', context);
|
|
1526
|
-
telemetry.trackEvent(
|
|
1525
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_STARTED, {
|
|
1527
1526
|
skipConfirmation: true === flags.y
|
|
1528
1527
|
});
|
|
1529
1528
|
const skipConfirmation = flags.y;
|
|
@@ -1531,24 +1530,24 @@ async function migrate(context) {
|
|
|
1531
1530
|
const { config } = await setupEnvironment(context);
|
|
1532
1531
|
const planResult = await planMigrations(context, config, skipConfirmation);
|
|
1533
1532
|
logger.debug('Plan result:', planResult);
|
|
1534
|
-
telemetry.trackEvent(
|
|
1533
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_PLANNED, {
|
|
1535
1534
|
shouldRun: planResult.shouldRun,
|
|
1536
1535
|
hasMigrations: !!planResult.runMigrationsFn
|
|
1537
1536
|
});
|
|
1538
1537
|
if (planResult.shouldRun && planResult.runMigrationsFn) {
|
|
1539
1538
|
await executeMigrations(context, planResult.runMigrationsFn);
|
|
1540
|
-
telemetry.trackEvent(
|
|
1539
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_COMPLETED, {
|
|
1541
1540
|
success: true
|
|
1542
1541
|
});
|
|
1543
1542
|
} else {
|
|
1544
1543
|
logger.debug('Skipping migration execution based on plan result');
|
|
1545
|
-
telemetry.trackEvent(
|
|
1544
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_COMPLETED, {
|
|
1546
1545
|
success: true,
|
|
1547
1546
|
reason: planResult.shouldRun ? 'no_migrations_needed' : 'user_cancelled'
|
|
1548
1547
|
});
|
|
1549
1548
|
}
|
|
1550
1549
|
} catch (error) {
|
|
1551
|
-
telemetry.trackEvent(
|
|
1550
|
+
telemetry.trackEvent(TelemetryEventName.MIGRATION_FAILED, {
|
|
1552
1551
|
error: error instanceof Error ? error.message : String(error)
|
|
1553
1552
|
});
|
|
1554
1553
|
context.error.handleError(error, 'An unexpected error occurred during the migration process');
|
|
@@ -1919,7 +1918,7 @@ This data is not personally identifiable and helps us prioritize features.
|
|
|
1919
1918
|
To disable telemetry, use the ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('--no-telemetry')}
|
|
1920
1919
|
flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEMETRY_DISABLED=1')} in your environment.`, `${formatLogMessage('info', 'Telemetry Notice')}`);
|
|
1921
1920
|
try {
|
|
1922
|
-
telemetry.trackEvent(
|
|
1921
|
+
telemetry.trackEvent(TelemetryEventName.CLI_INVOKED, {
|
|
1923
1922
|
version,
|
|
1924
1923
|
nodeVersion: process.version,
|
|
1925
1924
|
platform: process.platform
|
|
@@ -1931,7 +1930,7 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
1931
1930
|
if (flags.version) {
|
|
1932
1931
|
logger.debug('Version flag detected');
|
|
1933
1932
|
logger.message(`c15t CLI version ${version}`);
|
|
1934
|
-
telemetry.trackEvent(
|
|
1933
|
+
telemetry.trackEvent(TelemetryEventName.VERSION_DISPLAYED, {
|
|
1935
1934
|
version
|
|
1936
1935
|
});
|
|
1937
1936
|
telemetry.flushSync();
|
|
@@ -1940,7 +1939,7 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
1940
1939
|
}
|
|
1941
1940
|
if (flags.help) {
|
|
1942
1941
|
logger.debug('Help flag detected. Displaying help and exiting.');
|
|
1943
|
-
telemetry.trackEvent(
|
|
1942
|
+
telemetry.trackEvent(TelemetryEventName.HELP_DISPLAYED, {
|
|
1944
1943
|
version
|
|
1945
1944
|
});
|
|
1946
1945
|
telemetry.flushSync();
|
|
@@ -1962,18 +1961,18 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
1962
1961
|
if (loadedConfig) if (isClientOptions(loadedConfig)) clientConfig = loadedConfig;
|
|
1963
1962
|
else if (isC15TOptions(loadedConfig)) backendConfig = loadedConfig;
|
|
1964
1963
|
else logger.warn('Loaded configuration is of an unknown type.');
|
|
1965
|
-
if (loadedConfig) telemetry.trackEvent(
|
|
1964
|
+
if (loadedConfig) telemetry.trackEvent(TelemetryEventName.CONFIG_LOADED, {
|
|
1966
1965
|
configType: clientConfig ? 'client' : backendConfig ? 'backend' : 'unknown',
|
|
1967
1966
|
hasBackend: Boolean(backendConfig)
|
|
1968
1967
|
});
|
|
1969
1968
|
} catch (loadError) {
|
|
1970
|
-
telemetry.trackEvent(
|
|
1969
|
+
telemetry.trackEvent(TelemetryEventName.CONFIG_ERROR, {
|
|
1971
1970
|
error: loadError instanceof Error ? loadError.message : String(loadError)
|
|
1972
1971
|
});
|
|
1973
1972
|
return error.handleError(loadError, 'An unexpected error occurred during configuration loading');
|
|
1974
1973
|
}
|
|
1975
1974
|
if (!clientConfig) {
|
|
1976
|
-
telemetry.trackEvent(
|
|
1975
|
+
telemetry.trackEvent(TelemetryEventName.ONBOARDING_STARTED, {});
|
|
1977
1976
|
await startOnboarding(context);
|
|
1978
1977
|
await telemetry.shutdown();
|
|
1979
1978
|
return;
|
|
@@ -1990,14 +1989,14 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
1990
1989
|
logger.info(`Executing command: ${command.name}`);
|
|
1991
1990
|
telemetry.trackCommand(command.name, commandArgs, flags);
|
|
1992
1991
|
await command.action(context);
|
|
1993
|
-
telemetry.trackEvent(
|
|
1992
|
+
telemetry.trackEvent(TelemetryEventName.COMMAND_SUCCEEDED, {
|
|
1994
1993
|
command: command.name,
|
|
1995
1994
|
executionTime: Date.now() - performance.now()
|
|
1996
1995
|
});
|
|
1997
1996
|
telemetry.flushSync();
|
|
1998
1997
|
} else {
|
|
1999
1998
|
logger.error(`Unknown command: ${commandName}`);
|
|
2000
|
-
telemetry.trackEvent(
|
|
1999
|
+
telemetry.trackEvent(TelemetryEventName.COMMAND_UNKNOWN, {
|
|
2001
2000
|
unknownCommand: commandName
|
|
2002
2001
|
});
|
|
2003
2002
|
telemetry.flushSync();
|
|
@@ -2007,7 +2006,7 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
2007
2006
|
}
|
|
2008
2007
|
} else {
|
|
2009
2008
|
logger.debug('No command specified, entering interactive selection.');
|
|
2010
|
-
telemetry.trackEvent(
|
|
2009
|
+
telemetry.trackEvent(TelemetryEventName.INTERACTIVE_MENU_OPENED, {});
|
|
2011
2010
|
const promptOptions = src_commands.map((cmd)=>({
|
|
2012
2011
|
value: cmd.name,
|
|
2013
2012
|
label: cmd.label,
|
|
@@ -2024,7 +2023,7 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
2024
2023
|
});
|
|
2025
2024
|
if (__WEBPACK_EXTERNAL_MODULE__clack_prompts_3cae1695__.isCancel(selectedCommandName) || 'exit' === selectedCommandName) {
|
|
2026
2025
|
logger.debug('Interactive selection cancelled or exit chosen.');
|
|
2027
|
-
telemetry.trackEvent(
|
|
2026
|
+
telemetry.trackEvent(TelemetryEventName.INTERACTIVE_MENU_EXITED, {
|
|
2028
2027
|
action: __WEBPACK_EXTERNAL_MODULE__clack_prompts_3cae1695__.isCancel(selectedCommandName) ? 'cancelled' : 'exit'
|
|
2029
2028
|
});
|
|
2030
2029
|
context.error.handleCancel('Operation cancelled.');
|
|
@@ -2034,13 +2033,13 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
2034
2033
|
logger.debug(`User selected command: ${selectedCommand.name}`);
|
|
2035
2034
|
telemetry.trackCommand(selectedCommand.name, [], flags);
|
|
2036
2035
|
await selectedCommand.action(context);
|
|
2037
|
-
telemetry.trackEvent(
|
|
2036
|
+
telemetry.trackEvent(TelemetryEventName.COMMAND_SUCCEEDED, {
|
|
2038
2037
|
command: selectedCommand.name,
|
|
2039
2038
|
executionTime: Date.now() - performance.now()
|
|
2040
2039
|
});
|
|
2041
2040
|
telemetry.flushSync();
|
|
2042
2041
|
} else {
|
|
2043
|
-
telemetry.trackEvent(
|
|
2042
|
+
telemetry.trackEvent(TelemetryEventName.COMMAND_UNKNOWN, {
|
|
2044
2043
|
unknownCommand: String(selectedCommandName)
|
|
2045
2044
|
});
|
|
2046
2045
|
telemetry.flushSync();
|
|
@@ -2049,12 +2048,12 @@ flag or set ${__WEBPACK_EXTERNAL_MODULE_picocolors__["default"].cyan('C15T_TELEM
|
|
|
2049
2048
|
}
|
|
2050
2049
|
}
|
|
2051
2050
|
logger.debug('Command execution completed');
|
|
2052
|
-
telemetry.trackEvent(
|
|
2051
|
+
telemetry.trackEvent(TelemetryEventName.CLI_COMPLETED, {
|
|
2053
2052
|
success: true
|
|
2054
2053
|
});
|
|
2055
2054
|
telemetry.flushSync();
|
|
2056
2055
|
} catch (executionError) {
|
|
2057
|
-
telemetry.trackEvent(
|
|
2056
|
+
telemetry.trackEvent(TelemetryEventName.COMMAND_FAILED, {
|
|
2058
2057
|
command: commandName,
|
|
2059
2058
|
error: executionError instanceof Error ? executionError.message : String(executionError)
|
|
2060
2059
|
});
|
|
@@ -1,43 +1,44 @@
|
|
|
1
1
|
import type { Logger } from '@doubletie/logger';
|
|
2
2
|
import { PostHog } from 'posthog-node';
|
|
3
3
|
import type { LogLevel } from './logger';
|
|
4
|
-
export declare
|
|
5
|
-
CLI_INVOKED
|
|
6
|
-
CLI_COMPLETED
|
|
7
|
-
CLI_EXITED
|
|
8
|
-
CLI_ENVIRONMENT_DETECTED
|
|
9
|
-
COMMAND_EXECUTED
|
|
10
|
-
COMMAND_SUCCEEDED
|
|
11
|
-
COMMAND_FAILED
|
|
12
|
-
COMMAND_UNKNOWN
|
|
13
|
-
INTERACTIVE_MENU_OPENED
|
|
14
|
-
INTERACTIVE_MENU_EXITED
|
|
15
|
-
CONFIG_LOADED
|
|
16
|
-
CONFIG_ERROR
|
|
17
|
-
CONFIG_UPDATED
|
|
18
|
-
HELP_DISPLAYED
|
|
19
|
-
VERSION_DISPLAYED
|
|
20
|
-
ONBOARDING_STARTED
|
|
21
|
-
ONBOARDING_COMPLETED
|
|
22
|
-
ONBOARDING_EXITED
|
|
23
|
-
ONBOARDING_STORAGE_MODE_SELECTED
|
|
24
|
-
ONBOARDING_C15T_MODE_CONFIGURED
|
|
25
|
-
ONBOARDING_OFFLINE_MODE_CONFIGURED
|
|
26
|
-
ONBOARDING_SELF_HOSTED_CONFIGURED
|
|
27
|
-
ONBOARDING_CUSTOM_MODE_CONFIGURED
|
|
28
|
-
ONBOARDING_DEPENDENCIES_CHOICE
|
|
29
|
-
ONBOARDING_DEPENDENCIES_INSTALLED
|
|
30
|
-
ONBOARDING_GITHUB_STAR
|
|
31
|
-
ERROR_OCCURRED
|
|
32
|
-
MIGRATION_STARTED
|
|
33
|
-
MIGRATION_PLANNED
|
|
34
|
-
MIGRATION_EXECUTED
|
|
35
|
-
MIGRATION_COMPLETED
|
|
36
|
-
MIGRATION_FAILED
|
|
37
|
-
GENERATE_STARTED
|
|
38
|
-
GENERATE_COMPLETED
|
|
39
|
-
GENERATE_FAILED
|
|
40
|
-
}
|
|
4
|
+
export declare const TelemetryEventName: {
|
|
5
|
+
readonly CLI_INVOKED: "cli.invoked";
|
|
6
|
+
readonly CLI_COMPLETED: "cli.completed";
|
|
7
|
+
readonly CLI_EXITED: "cli.exited";
|
|
8
|
+
readonly CLI_ENVIRONMENT_DETECTED: "cli.environment_detected";
|
|
9
|
+
readonly COMMAND_EXECUTED: "command.executed";
|
|
10
|
+
readonly COMMAND_SUCCEEDED: "command.succeeded";
|
|
11
|
+
readonly COMMAND_FAILED: "command.failed";
|
|
12
|
+
readonly COMMAND_UNKNOWN: "command.unknown";
|
|
13
|
+
readonly INTERACTIVE_MENU_OPENED: "ui.menu.opened";
|
|
14
|
+
readonly INTERACTIVE_MENU_EXITED: "ui.menu.exited";
|
|
15
|
+
readonly CONFIG_LOADED: "config.loaded";
|
|
16
|
+
readonly CONFIG_ERROR: "config.error";
|
|
17
|
+
readonly CONFIG_UPDATED: "config.updated";
|
|
18
|
+
readonly HELP_DISPLAYED: "help.displayed";
|
|
19
|
+
readonly VERSION_DISPLAYED: "version.displayed";
|
|
20
|
+
readonly ONBOARDING_STARTED: "onboarding.started";
|
|
21
|
+
readonly ONBOARDING_COMPLETED: "onboarding.completed";
|
|
22
|
+
readonly ONBOARDING_EXITED: "onboarding.exited";
|
|
23
|
+
readonly ONBOARDING_STORAGE_MODE_SELECTED: "onboarding.storage_mode_selected";
|
|
24
|
+
readonly ONBOARDING_C15T_MODE_CONFIGURED: "onboarding.c15t_mode_configured";
|
|
25
|
+
readonly ONBOARDING_OFFLINE_MODE_CONFIGURED: "onboarding.offline_mode_configured";
|
|
26
|
+
readonly ONBOARDING_SELF_HOSTED_CONFIGURED: "onboarding.self_hosted_configured";
|
|
27
|
+
readonly ONBOARDING_CUSTOM_MODE_CONFIGURED: "onboarding.custom_mode_configured";
|
|
28
|
+
readonly ONBOARDING_DEPENDENCIES_CHOICE: "onboarding.dependencies_choice";
|
|
29
|
+
readonly ONBOARDING_DEPENDENCIES_INSTALLED: "onboarding.dependencies_installed";
|
|
30
|
+
readonly ONBOARDING_GITHUB_STAR: "onboarding.github_star";
|
|
31
|
+
readonly ERROR_OCCURRED: "error.occurred";
|
|
32
|
+
readonly MIGRATION_STARTED: "migration.started";
|
|
33
|
+
readonly MIGRATION_PLANNED: "migration.planned";
|
|
34
|
+
readonly MIGRATION_EXECUTED: "migration.executed";
|
|
35
|
+
readonly MIGRATION_COMPLETED: "migration.completed";
|
|
36
|
+
readonly MIGRATION_FAILED: "migration.failed";
|
|
37
|
+
readonly GENERATE_STARTED: "generate.started";
|
|
38
|
+
readonly GENERATE_COMPLETED: "generate.completed";
|
|
39
|
+
readonly GENERATE_FAILED: "generate.failed";
|
|
40
|
+
};
|
|
41
|
+
export type TelemetryEventName = (typeof TelemetryEventName)[keyof typeof TelemetryEventName];
|
|
41
42
|
export interface TelemetryOptions {
|
|
42
43
|
/**
|
|
43
44
|
* Custom PostHog instance to use instead of the default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/utils/telemetry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMzC,
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/utils/telemetry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMzC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDrB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC7B,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAChC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAE9D;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,iBAAiB,CAA4C;IACrE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAqD;IACnE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAqB;IAEnC;;;;OAIG;gBACS,OAAO,CAAC,EAAE,gBAAgB;IA0BtC;;;;;;;OAOG;IACH,cAAc,CACb,SAAS,EAAE,kBAAkB,EAC7B,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAM,GACpE,IAAI;IAgDP;;;;;OAKG;IACH,UAAU,CACT,SAAS,EAAE,kBAAkB,EAC7B,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAM,GACpE,IAAI;IAKP;;;;;;OAMG;IACH,YAAY,CACX,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAM,GAC/D,IAAI;IAqBP;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAahD;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAQlC;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAShB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAgFlB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;;;OAIG;IACH,SAAS,IAAI,IAAI;CAgBjB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAErE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c15t/cli",
|
|
3
|
-
"version": "1.2.0-canary.
|
|
3
|
+
"version": "1.2.0-canary.8",
|
|
4
4
|
"description": "The CLI for c15t",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": "./dist/index.mjs",
|
|
@@ -28,15 +28,15 @@
|
|
|
28
28
|
"picocolors": "^1.1.1",
|
|
29
29
|
"posthog-node": "^4.11.7",
|
|
30
30
|
"zod": "^3.24.2",
|
|
31
|
-
"@c15t/
|
|
32
|
-
"@c15t/
|
|
31
|
+
"@c15t/react": "1.2.0-canary.8",
|
|
32
|
+
"@c15t/backend": "1.2.0-canary.8"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/figlet": "^1.7.0",
|
|
36
36
|
"@types/fs-extra": "^11.0.4",
|
|
37
37
|
"vitest": "^3.1.1",
|
|
38
|
-
"@c15t/
|
|
39
|
-
"@c15t/
|
|
38
|
+
"@c15t/vitest-config": "1.0.0",
|
|
39
|
+
"@c15t/typescript-config": "0.0.1-beta.1"
|
|
40
40
|
},
|
|
41
41
|
"publishConfig": {
|
|
42
42
|
"access": "public",
|