@vizzly-testing/cli 0.39.0 → 0.39.2

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.
Files changed (195) hide show
  1. package/README.md +12 -3
  2. package/bin/vizzly.js +1 -1
  3. package/dist/{cli.js → adapters/cli/cli.js} +50 -35
  4. package/dist/adapters/cli/setup.js +34 -0
  5. package/dist/{client → adapters/client}/index.js +6 -7
  6. package/dist/adapters/http/cloud-proxy.js +29 -0
  7. package/dist/{server → adapters/http}/http-server.js +12 -13
  8. package/dist/{server-manager/operations.js → adapters/http/server-lifecycle.js} +10 -13
  9. package/dist/{server-manager/index.js → adapters/http/server-manager.js} +23 -27
  10. package/dist/{plugin-api.js → adapters/plugins/plugin-api.js} +1 -1
  11. package/dist/{plugin-loader.js → adapters/plugins/plugin-loader.js} +1 -1
  12. package/dist/{services/index.js → adapters/plugins/services.js} +4 -9
  13. package/dist/adapters/sdk/index.d.ts +89 -0
  14. package/dist/{sdk → adapters/sdk}/index.js +22 -19
  15. package/dist/{commands/api.js → domains/api/api.commands.js} +3 -3
  16. package/dist/{auth/client.js → domains/auth/auth-client.js} +4 -3
  17. package/dist/domains/auth/auth-errors.js +50 -0
  18. package/dist/domains/auth/auth-headers.js +41 -0
  19. package/dist/domains/auth/auth.normalizers.js +50 -0
  20. package/dist/{server/routers/auth.js → domains/auth/auth.routes.js} +9 -9
  21. package/dist/domains/auth/auth.rules.js +19 -0
  22. package/dist/domains/auth/auth.serializers.js +32 -0
  23. package/dist/{auth/operations.js → domains/auth/auth.service.js} +115 -17
  24. package/dist/domains/auth/auth.validations.js +21 -0
  25. package/dist/{api/client.js → domains/auth/cloud-client.js} +11 -18
  26. package/dist/{commands/login.js → domains/auth/login.commands.js} +11 -8
  27. package/dist/{commands/logout.js → domains/auth/logout.commands.js} +6 -4
  28. package/dist/domains/auth/token-store.js +81 -0
  29. package/dist/{commands/whoami.js → domains/auth/whoami.commands.js} +6 -3
  30. package/dist/domains/baselines/baseline-download.js +192 -0
  31. package/dist/domains/baselines/baseline-write.js +22 -0
  32. package/dist/{server/routers/baseline.js → domains/baselines/baseline.routes.js} +3 -3
  33. package/dist/{tdd/services/baseline-manager.js → domains/baselines/baseline.service.js} +1 -39
  34. package/dist/{commands/baselines.js → domains/baselines/baselines.commands.js} +3 -3
  35. package/dist/domains/baselines/cloud-baselines.js +9 -0
  36. package/dist/domains/baselines/cloud-baselines.routes.js +42 -0
  37. package/dist/domains/builds/build.normalizers.js +35 -0
  38. package/dist/domains/builds/build.serializers.js +164 -0
  39. package/dist/domains/builds/build.service.js +119 -0
  40. package/dist/domains/builds/build.validations.js +39 -0
  41. package/dist/{commands/builds.js → domains/builds/builds.commands.js} +6 -74
  42. package/dist/domains/builds/cloud-builds.routes.js +31 -0
  43. package/dist/{commands/finalize.js → domains/builds/finalize.commands.js} +5 -17
  44. package/dist/{commands/status.js → domains/builds/status.commands.js} +9 -120
  45. package/dist/domains/comparisons/cloud-comparisons.js +43 -0
  46. package/dist/{tdd/services/comparison-service.js → domains/comparisons/comparison.service.js} +1 -1
  47. package/dist/{commands/comparisons.js → domains/comparisons/comparisons.commands.js} +7 -5
  48. package/dist/domains/config/config-defaults.js +27 -0
  49. package/dist/{utils → domains/config}/config-discovery.js +1 -9
  50. package/dist/{utils → domains/config}/config-loader.js +10 -9
  51. package/dist/{commands/config-cmd.js → domains/config/config.commands.js} +4 -4
  52. package/dist/{types → domains/config}/config.d.ts +3 -3
  53. package/dist/domains/config/config.normalizers.js +126 -0
  54. package/dist/{server/routers/config.js → domains/config/config.routes.js} +13 -13
  55. package/dist/domains/config/config.rules.js +47 -0
  56. package/dist/domains/config/config.serializers.js +202 -0
  57. package/dist/domains/config/config.service.js +625 -0
  58. package/dist/{utils/config-schema.js → domains/config/config.validations.js} +9 -9
  59. package/dist/{utils/environment-config.js → domains/config/environment.js} +1 -8
  60. package/dist/domains/context/compact-context.validations.js +60 -0
  61. package/dist/domains/context/context-presentation.js +368 -0
  62. package/dist/domains/context/context.commands.js +385 -0
  63. package/dist/domains/context/context.serializers.js +157 -0
  64. package/dist/domains/context/context.service.js +76 -0
  65. package/dist/domains/context/context.validations.js +100 -0
  66. package/dist/{context → domains/context}/local-workspace-provider.js +1 -1
  67. package/dist/{commands/doctor.js → domains/diagnostics/doctor.commands.js} +6 -5
  68. package/dist/{server/routers/health.js → domains/diagnostics/health.routes.js} +11 -20
  69. package/dist/{commands/preview.js → domains/previews/preview.commands.js} +9 -7
  70. package/dist/domains/previews/preview.service.js +37 -0
  71. package/dist/domains/projects/cloud-projects.routes.js +28 -0
  72. package/dist/{commands/orgs.js → domains/projects/orgs.commands.js} +6 -8
  73. package/dist/{utils → domains/projects}/project-binding.js +3 -3
  74. package/dist/domains/projects/project-errors.js +61 -0
  75. package/dist/{utils → domains/projects}/project-link-store.js +2 -2
  76. package/dist/domains/projects/project-requests.js +61 -0
  77. package/dist/{commands/project.js → domains/projects/project.commands.js} +9 -41
  78. package/dist/domains/projects/project.normalizers.js +69 -0
  79. package/dist/{project/operations.js → domains/projects/project.service.js} +89 -16
  80. package/dist/domains/projects/project.validations.js +31 -0
  81. package/dist/{commands/projects.js → domains/projects/projects.commands.js} +6 -8
  82. package/dist/{server/routers/projects.js → domains/projects/projects.routes.js} +5 -5
  83. package/dist/domains/reports/dashboard.routes.js +96 -0
  84. package/dist/{server/routers/events.js → domains/reports/events.routes.js} +14 -36
  85. package/dist/domains/reports/report-assets.routes.js +81 -0
  86. package/dist/domains/reports/report-state.js +51 -0
  87. package/dist/domains/reports/report-store.js +85 -0
  88. package/dist/domains/reports/report.serializers.js +99 -0
  89. package/dist/{services/static-report-generator.js → domains/reports/report.service.js} +11 -33
  90. package/dist/{commands/review.js → domains/review/review.commands.js} +4 -4
  91. package/dist/domains/runs/run-environment.js +69 -0
  92. package/dist/{services/test-runner.js → domains/runs/run-events.js} +11 -9
  93. package/dist/{commands/run.js → domains/runs/run.commands.js} +16 -13
  94. package/dist/domains/runs/run.normalizers.js +8 -0
  95. package/dist/domains/runs/run.rules.js +56 -0
  96. package/dist/domains/runs/run.serializers.js +101 -0
  97. package/dist/{test-runner/operations.js → domains/runs/run.service.js} +35 -7
  98. package/dist/domains/runs/run.validations.js +17 -0
  99. package/dist/{utils/session.js → domains/runs/session-store.js} +3 -2
  100. package/dist/{server/handlers/api-handler.js → domains/screenshots/cloud-handler.js} +4 -4
  101. package/dist/domains/screenshots/cloud-screenshots.js +109 -0
  102. package/dist/{utils/file-helpers.js → domains/screenshots/image-files.js} +1 -1
  103. package/dist/domains/screenshots/screenshot-hash.js +53 -0
  104. package/dist/domains/screenshots/screenshot-server-options.js +28 -0
  105. package/dist/{screenshot-server/operations.js → domains/screenshots/screenshot-server.js} +14 -1
  106. package/dist/domains/screenshots/screenshot.normalizers.js +40 -0
  107. package/dist/{server/routers/screenshot.js → domains/screenshots/screenshot.routes.js} +4 -4
  108. package/dist/domains/screenshots/screenshot.serializers.js +146 -0
  109. package/dist/{utils/security.js → domains/screenshots/screenshot.validations.js} +20 -70
  110. package/dist/{init/agents.js → domains/setup/agent-setup.js} +54 -14
  111. package/dist/{commands/init.js → domains/setup/init.commands.js} +11 -44
  112. package/dist/{server/handlers/tdd-handler.js → domains/tdd/screenshot-handler.js} +46 -281
  113. package/dist/{commands/tdd-daemon.js → domains/tdd/tdd-daemon.commands.js} +6 -6
  114. package/dist/{commands/tdd-screenshots.js → domains/tdd/tdd-screenshots.commands.js} +5 -5
  115. package/dist/{commands/tdd.js → domains/tdd/tdd.commands.js} +16 -15
  116. package/dist/{tdd/tdd-service.js → domains/tdd/tdd.service.js} +81 -405
  117. package/dist/domains/updates/cli-update.js +103 -0
  118. package/dist/domains/updates/update-check.js +2 -0
  119. package/dist/domains/updates/update-notifications.js +175 -0
  120. package/dist/domains/uploads/upload-defaults.js +4 -0
  121. package/dist/domains/uploads/upload-files.js +32 -0
  122. package/dist/domains/uploads/upload-settings.js +21 -0
  123. package/dist/domains/uploads/upload-timing.js +18 -0
  124. package/dist/{commands/upload.js → domains/uploads/upload.commands.js} +11 -9
  125. package/dist/domains/uploads/upload.normalizers.js +60 -0
  126. package/dist/domains/uploads/upload.serializers.js +179 -0
  127. package/dist/{uploader/operations.js → domains/uploads/upload.service.js} +85 -28
  128. package/dist/domains/uploads/upload.validations.js +77 -0
  129. package/dist/index.js +12 -12
  130. package/dist/reporter/reporter-bundle.iife.js +86 -86
  131. package/dist/reporter-ssr/ssr-entry.js +3 -6
  132. package/dist/shared/cloud-protocol.js +171 -0
  133. package/dist/{utils → shared}/file-changes.js +1 -1
  134. package/dist/shared/files.js +9 -0
  135. package/dist/{utils → shared}/global-config.js +7 -78
  136. package/dist/shared/log-level.js +7 -0
  137. package/dist/{utils → shared}/output.js +1 -1
  138. package/dist/{utils → shared}/package-info.js +5 -4
  139. package/dist/shared/paths.js +57 -0
  140. package/package.json +37 -36
  141. package/dist/api/core.js +0 -382
  142. package/dist/api/endpoints.js +0 -421
  143. package/dist/api/index.js +0 -19
  144. package/dist/auth/core.js +0 -237
  145. package/dist/auth/index.js +0 -31
  146. package/dist/commands/context.js +0 -1066
  147. package/dist/config/core.js +0 -439
  148. package/dist/config/operations.js +0 -327
  149. package/dist/project/core.js +0 -211
  150. package/dist/screenshot-server/core.js +0 -161
  151. package/dist/screenshot-server/index.js +0 -11
  152. package/dist/server/routers/assets.js +0 -95
  153. package/dist/server/routers/cloud-proxy.js +0 -146
  154. package/dist/server/routers/dashboard.js +0 -172
  155. package/dist/services/auth-service.js +0 -117
  156. package/dist/services/config-service.js +0 -313
  157. package/dist/services/project-service.js +0 -88
  158. package/dist/test-runner/core.js +0 -293
  159. package/dist/test-runner/index.js +0 -13
  160. package/dist/types/sdk.d.ts +0 -186
  161. package/dist/uploader/core.js +0 -432
  162. package/dist/uploader/index.js +0 -88
  163. /package/dist/{types/client.d.ts → adapters/client/index.d.ts} +0 -0
  164. /package/dist/{server → adapters/http}/middleware/cors.js +0 -0
  165. /package/dist/{server → adapters/http}/middleware/json-parser.js +0 -0
  166. /package/dist/{server → adapters/http}/middleware/response.js +0 -0
  167. /package/dist/{server-manager/core.js → adapters/http/server-options.js} +0 -0
  168. /package/dist/{utils/login-poll-wait.js → domains/auth/login-wait.js} +0 -0
  169. /package/dist/{tdd/metadata → domains/baselines}/baseline-metadata.js +0 -0
  170. /package/dist/{services/build-manager.js → domains/builds/build-info.js} +0 -0
  171. /package/dist/{tdd/services/result-service.js → domains/comparisons/comparison-results.js} +0 -0
  172. /package/dist/{init/core.js → domains/config/config-plan.js} +0 -0
  173. /package/dist/{utils/config-helpers.js → domains/config/config.js} +0 -0
  174. /package/dist/{utils/visual-context-normalizers.js → domains/context/context.normalizers.js} +0 -0
  175. /package/dist/{context → domains/context}/provider-resolver.js +0 -0
  176. /package/dist/{utils/context.js → domains/diagnostics/environment-context.js} +0 -0
  177. /package/dist/{utils/report-data.js → domains/reports/report.normalizers.js} +0 -0
  178. /package/dist/{utils/image-input-detector.js → domains/screenshots/image-input.js} +0 -0
  179. /package/dist/{tdd/core/signature.js → domains/screenshots/screenshot-identity.js} +0 -0
  180. /package/dist/{utils → domains/screenshots}/screenshot-options.js +0 -0
  181. /package/dist/{init/prompts.js → domains/setup/setup-prompts.js} +0 -0
  182. /package/dist/{tdd → domains/tdd}/runtime-context.js +0 -0
  183. /package/dist/{tdd → domains/tdd}/server-registry.js +0 -0
  184. /package/dist/{commands/tdd-daemon-process.js → domains/tdd/tdd-daemon-process.commands.js} +0 -0
  185. /package/dist/{types/index.d.ts → index.d.ts} +0 -0
  186. /package/dist/{utils → shared}/api-url.js +0 -0
  187. /package/dist/{utils → shared}/async-utils.js +0 -0
  188. /package/dist/{utils → shared}/browser.js +0 -0
  189. /package/dist/{utils → shared}/ci-env.js +0 -0
  190. /package/dist/{utils → shared}/colors.js +0 -0
  191. /package/dist/{utils → shared}/fetch-utils.js +0 -0
  192. /package/dist/{utils → shared}/git.js +0 -0
  193. /package/dist/{utils → shared}/patterns.js +0 -0
  194. /package/dist/{utils → shared}/secret-store.js +0 -0
  195. /package/dist/{errors → shared}/vizzly-error.js +0 -0
@@ -1,10 +1,91 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { glob } from 'glob';
3
+ import { getDefaultBranch } from '../../shared/git.js';
4
+ import * as output from '../../shared/output.js';
5
+ import { TimeoutError, UploadError, ValidationError } from '../../shared/vizzly-error.js';
6
+ import { createApiClient } from '../auth/cloud-client.js';
7
+ import { createBuild } from '../builds/build.service.js';
8
+ import { checkShas } from '../screenshots/cloud-screenshots.js';
9
+ import { buildFileMetadata, extractStatusCodeFromError, fileToScreenshotFormat } from './upload.normalizers.js';
10
+ import { buildBuildInfo, buildCompletedProgress, buildDeduplicationProgress, buildProcessingProgress, buildScanningProgress, buildUploadingProgress, buildUploadResult, buildWaitResult } from './upload.serializers.js';
11
+ import { validateApiKey, validateDirectoryStats, validateFilesFound, validateScreenshotsDir } from './upload.validations.js';
12
+ import { DEFAULT_BUILD_POLL_INTERVAL, DEFAULT_SHA_CHECK_BATCH_SIZE } from './upload-defaults.js';
13
+ import { buildScreenshotPattern, partitionFilesByExistence } from './upload-files.js';
14
+ import { resolveBatchSize, resolveTimeout } from './upload-settings.js';
15
+ import { getElapsedTime, isTimedOut } from './upload-timing.js';
16
+
1
17
  /**
2
- * Uploader Operations - I/O operations with dependency injection
3
- *
4
- * Each operation takes its dependencies as parameters for testability.
18
+ * Screenshot upload operations and the public uploader factory.
19
+ * Dependencies are explicit so callers can choose external integrations.
5
20
  */
6
21
 
7
- import { buildBuildInfo, buildCompletedProgress, buildDeduplicationProgress, buildFileMetadata, buildProcessingProgress, buildScanningProgress, buildScreenshotPattern, buildUploadingProgress, buildUploadResult, buildWaitResult, DEFAULT_BUILD_POLL_INTERVAL, DEFAULT_SHA_CHECK_BATCH_SIZE, extractStatusCodeFromError, fileToScreenshotFormat, getElapsedTime, isTimedOut, partitionFilesByExistence, validateApiKey, validateDirectoryStats, validateFilesFound, validateScreenshotsDir } from './core.js';
22
+ export function createUploader({
23
+ apiKey,
24
+ apiUrl,
25
+ userAgent,
26
+ command,
27
+ upload: uploadConfig = {}
28
+ } = {}, options = {}) {
29
+ let signal = options.signal || new AbortController().signal;
30
+ let client = createApiClient({
31
+ baseUrl: apiUrl,
32
+ token: apiKey,
33
+ command: command || 'upload',
34
+ sdkUserAgent: userAgent,
35
+ allowNoToken: true
36
+ });
37
+ let batchSize = resolveBatchSize(options, uploadConfig);
38
+ let timeout = resolveTimeout(options, uploadConfig);
39
+ let deps = options.deps || {
40
+ client,
41
+ createBuild,
42
+ getDefaultBranch,
43
+ glob,
44
+ readFile,
45
+ stat,
46
+ checkShas,
47
+ createError: (message, code, context) => {
48
+ let error = new UploadError(message, context);
49
+ error.code = code;
50
+ return error;
51
+ },
52
+ createValidationError: (message, context) => new ValidationError(message, context),
53
+ createUploadError: (message, context) => new UploadError(message, context),
54
+ createTimeoutError: (message, context) => new TimeoutError(message, context),
55
+ output
56
+ };
57
+ async function uploadScreenshots(uploadOptions) {
58
+ return upload({
59
+ uploadOptions,
60
+ config: {
61
+ apiKey,
62
+ apiUrl
63
+ },
64
+ signal,
65
+ batchSize,
66
+ deps: {
67
+ ...deps,
68
+ client: deps.client || client
69
+ }
70
+ });
71
+ }
72
+ async function waitForUploadedBuild(buildId, waitTimeout = timeout) {
73
+ return waitForBuild({
74
+ buildId,
75
+ timeout: waitTimeout,
76
+ signal,
77
+ client: deps.client || client,
78
+ deps: {
79
+ createError: deps.createError,
80
+ createTimeoutError: deps.createTimeoutError
81
+ }
82
+ });
83
+ }
84
+ return {
85
+ upload: uploadScreenshots,
86
+ waitForBuild: waitForUploadedBuild
87
+ };
88
+ }
8
89
  function delay(ms, signal) {
9
90
  if (ms <= 0) {
10
91
  return Promise.resolve();
@@ -33,10 +114,6 @@ function delay(ms, signal) {
33
114
  });
34
115
  }
35
116
 
36
- // ============================================================================
37
- // File Discovery
38
- // ============================================================================
39
-
40
117
  /**
41
118
  * Find all PNG screenshots in a directory
42
119
  * @param {Object} options - Options
@@ -58,10 +135,6 @@ export async function findScreenshots({
58
135
  });
59
136
  }
60
137
 
61
- // ============================================================================
62
- // File Processing
63
- // ============================================================================
64
-
65
138
  /**
66
139
  * Process files to extract metadata and compute hashes
67
140
  * @param {Object} options - Options
@@ -100,10 +173,6 @@ export async function processFiles({
100
173
  return results;
101
174
  }
102
175
 
103
- // ============================================================================
104
- // SHA Checking / Deduplication
105
- // ============================================================================
106
-
107
176
  /**
108
177
  * Check which files already exist on the server
109
178
  * @param {Object} options - Options
@@ -161,10 +230,6 @@ export async function checkExistingFiles({
161
230
  };
162
231
  }
163
232
 
164
- // ============================================================================
165
- // File Upload
166
- // ============================================================================
167
-
168
233
  /**
169
234
  * Upload files to Vizzly
170
235
  * @param {Object} options - Options
@@ -230,10 +295,6 @@ export async function uploadFiles({
230
295
  };
231
296
  }
232
297
 
233
- // ============================================================================
234
- // Build Waiting
235
- // ============================================================================
236
-
237
298
  /**
238
299
  * Wait for a build to complete
239
300
  * @param {Object} options - Options
@@ -299,10 +360,6 @@ export async function waitForBuild({
299
360
  });
300
361
  }
301
362
 
302
- // ============================================================================
303
- // Main Upload Operation
304
- // ============================================================================
305
-
306
363
  /**
307
364
  * Upload screenshots to Vizzly
308
365
  * @param {Object} options - Options
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Validate API key is present
3
+ * @param {string|undefined} apiKey - API key to validate
4
+ * @returns {{ valid: boolean, error: string|null }}
5
+ */
6
+ export function validateApiKey(apiKey) {
7
+ if (!apiKey) {
8
+ return {
9
+ valid: false,
10
+ error: 'API key is required'
11
+ };
12
+ }
13
+ return {
14
+ valid: true,
15
+ error: null
16
+ };
17
+ }
18
+
19
+ /**
20
+ * Validate screenshots directory path
21
+ * @param {string|undefined} screenshotsDir - Directory path
22
+ * @returns {{ valid: boolean, error: string|null }}
23
+ */
24
+ export function validateScreenshotsDir(screenshotsDir) {
25
+ if (!screenshotsDir) {
26
+ return {
27
+ valid: false,
28
+ error: 'Screenshots directory is required'
29
+ };
30
+ }
31
+ return {
32
+ valid: true,
33
+ error: null
34
+ };
35
+ }
36
+
37
+ /**
38
+ * Validate directory stats
39
+ * @param {Object} stats - fs.stat result
40
+ * @param {string} path - Directory path for error message
41
+ * @returns {{ valid: boolean, error: string|null }}
42
+ */
43
+ export function validateDirectoryStats(stats, path) {
44
+ if (!stats.isDirectory()) {
45
+ return {
46
+ valid: false,
47
+ error: `${path} is not a directory`
48
+ };
49
+ }
50
+ return {
51
+ valid: true,
52
+ error: null
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Validate files were found
58
+ * @param {Array} files - Array of file paths
59
+ * @param {string} directory - Directory that was searched
60
+ * @returns {{ valid: boolean, error: string|null, context?: Object }}
61
+ */
62
+ export function validateFilesFound(files, directory) {
63
+ if (!files || files.length === 0) {
64
+ return {
65
+ valid: false,
66
+ error: 'No screenshot files found',
67
+ context: {
68
+ directory,
69
+ pattern: '**/*.png'
70
+ }
71
+ };
72
+ }
73
+ return {
74
+ valid: true,
75
+ error: null
76
+ };
77
+ }
package/dist/index.js CHANGED
@@ -9,18 +9,18 @@ import 'dotenv/config';
9
9
  */
10
10
 
11
11
  // Client exports for convenience
12
- export { configure, setEnabled, vizzlyScreenshot } from './client/index.js';
13
- // Errors
14
- export { AuthError, BuildError, ConfigError, NetworkError, ScreenshotError, TimeoutError, UploadError, ValidationError, VizzlyError } from './errors/vizzly-error.js';
15
- export { createPluginServices } from './plugin-api.js';
12
+ export { configure, setEnabled, vizzlyScreenshot } from './adapters/client/index.js';
13
+ export { createPluginServices } from './adapters/plugins/plugin-api.js';
14
+ export { createServices } from './adapters/plugins/services.js';
16
15
  // Primary SDK export
17
- export { createVizzly, VizzlySDK } from './sdk/index.js';
18
- export { createServices } from './services/index.js';
19
- export { createTDDService } from './tdd/tdd-service.js';
20
- // Core services (for advanced usage)
21
- export { createUploader } from './uploader/index.js';
16
+ export { createVizzly, VizzlySDK } from './adapters/sdk/index.js';
22
17
  // Configuration helper
23
- export { defineConfig } from './utils/config-helpers.js';
18
+ export { defineConfig } from './domains/config/config.js';
24
19
  // Utilities
25
- export { loadConfig } from './utils/config-loader.js';
26
- export * as output from './utils/output.js';
20
+ export { loadConfig } from './domains/config/config-loader.js';
21
+ export { createTDDService } from './domains/tdd/tdd.service.js';
22
+ // Core services (for advanced usage)
23
+ export { createUploader } from './domains/uploads/upload.service.js';
24
+ export * as output from './shared/output.js';
25
+ // Errors
26
+ export { AuthError, BuildError, ConfigError, NetworkError, ScreenshotError, TimeoutError, UploadError, ValidationError, VizzlyError } from './shared/vizzly-error.js';