workspace-manager-cli 1.0.0

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 (50) hide show
  1. package/README.md +339 -0
  2. package/dist/build.d.ts +19 -0
  3. package/dist/build.d.ts.map +1 -0
  4. package/dist/build.js +384 -0
  5. package/dist/build.js.map +1 -0
  6. package/dist/bundler/build-bundler.d.ts +9 -0
  7. package/dist/bundler/build-bundler.d.ts.map +1 -0
  8. package/dist/bundler/build-bundler.js +218 -0
  9. package/dist/bundler/build-bundler.js.map +1 -0
  10. package/dist/bundler/package-merger.d.ts +21 -0
  11. package/dist/bundler/package-merger.d.ts.map +1 -0
  12. package/dist/bundler/package-merger.js +192 -0
  13. package/dist/bundler/package-merger.js.map +1 -0
  14. package/dist/bundler/vite-generator.d.ts +14 -0
  15. package/dist/bundler/vite-generator.d.ts.map +1 -0
  16. package/dist/bundler/vite-generator.js +186 -0
  17. package/dist/bundler/vite-generator.js.map +1 -0
  18. package/dist/config.d.ts +250 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +268 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/copy.d.ts +9 -0
  23. package/dist/copy.d.ts.map +1 -0
  24. package/dist/copy.js +56 -0
  25. package/dist/copy.js.map +1 -0
  26. package/dist/git.d.ts +76 -0
  27. package/dist/git.d.ts.map +1 -0
  28. package/dist/git.js +377 -0
  29. package/dist/git.js.map +1 -0
  30. package/dist/index-update-base.d.ts +2 -0
  31. package/dist/index-update-base.d.ts.map +1 -0
  32. package/dist/index-update-base.js +76 -0
  33. package/dist/index-update-base.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +626 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/lock.d.ts +39 -0
  39. package/dist/lock.d.ts.map +1 -0
  40. package/dist/lock.js +91 -0
  41. package/dist/lock.js.map +1 -0
  42. package/dist/logger.d.ts +42 -0
  43. package/dist/logger.d.ts.map +1 -0
  44. package/dist/logger.js +90 -0
  45. package/dist/logger.js.map +1 -0
  46. package/dist/status.d.ts +23 -0
  47. package/dist/status.d.ts.map +1 -0
  48. package/dist/status.js +158 -0
  49. package/dist/status.js.map +1 -0
  50. package/package.json +47 -0
package/dist/index.js ADDED
@@ -0,0 +1,626 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { select, confirm, input } from "@inquirer/prompts";
4
+ import { existsSync, writeFileSync } from "fs";
5
+ import { join } from "path";
6
+ import { loadConfig, getProjectTypeDescription, persistHashesToWorkspaceConfig, } from "./config.js";
7
+ import { cloneToCache, cloneBaseToCache, cloneCoreToCache, fetchLatest, checkoutRef, getCorePath, getGitInfo, listRemoteRefs, listRemoteRefsFromUrl, isGitRepo, } from "./git.js";
8
+ import { buildWorkspace } from "./build.js";
9
+ import { getStatus, printStatus } from "./status.js";
10
+ import { createLogger } from "./logger.js";
11
+ import { createRequire } from "module";
12
+ const require = createRequire(import.meta.url);
13
+ const pkg = require("../package.json");
14
+ const program = new Command();
15
+ /**
16
+ * Generate a default workspace.config.json file interactively
17
+ */
18
+ async function generateDefaultConfig(logger) {
19
+ try {
20
+ logger.info("No workspace.config.json found in current directory.");
21
+ // Ask for project type
22
+ const projectType = await select({
23
+ message: "What type of project is this?",
24
+ choices: [
25
+ {
26
+ name: "core + custom (Remote core repo + Local custom folder)",
27
+ value: "core-custom",
28
+ },
29
+ {
30
+ name: "base + core (Remote base repo + Local core folder)",
31
+ value: "base-core",
32
+ },
33
+ {
34
+ name: "base + core + custom (Remote base repo + Remote core repo + Local custom folder)",
35
+ value: "base-core-custom",
36
+ },
37
+ ],
38
+ default: "base-core-custom",
39
+ });
40
+ // Build unified config
41
+ const config = {
42
+ projectType: projectType,
43
+ };
44
+ // Collect input based on project type
45
+ switch (projectType) {
46
+ case "core-custom": {
47
+ // Remote core + local custom
48
+ const coreUrl = await input({
49
+ message: "Enter the CORE repository URL:",
50
+ default: "https://github.com/your-org/your-core-repo.git",
51
+ validate: (value) => {
52
+ if (!value.trim())
53
+ return "URL is required";
54
+ return true;
55
+ },
56
+ });
57
+ config.core = {
58
+ name: coreUrl.split("/").pop()?.replace(".git", "") || "core",
59
+ url: coreUrl,
60
+ ref: "main",
61
+ };
62
+ config.custom = {
63
+ path: "custom",
64
+ };
65
+ break;
66
+ }
67
+ case "base-core": {
68
+ // Remote base + local core
69
+ const baseUrl = await input({
70
+ message: "Enter the BASE repository URL:",
71
+ default: "https://github.com/your-org/your-base-repo.git",
72
+ validate: (value) => {
73
+ if (!value.trim())
74
+ return "URL is required";
75
+ return true;
76
+ },
77
+ });
78
+ config.base = {
79
+ name: baseUrl.split("/").pop()?.replace(".git", "") || "base",
80
+ url: baseUrl,
81
+ ref: "main",
82
+ };
83
+ config.core = {
84
+ path: "core",
85
+ };
86
+ break;
87
+ }
88
+ case "base-core-custom": {
89
+ // Remote base + remote core + local custom
90
+ const baseUrl = await input({
91
+ message: "Enter the BASE repository URL:",
92
+ default: "https://github.com/your-org/your-base-repo.git",
93
+ validate: (value) => {
94
+ if (!value.trim())
95
+ return "URL is required";
96
+ return true;
97
+ },
98
+ });
99
+ config.base = {
100
+ name: baseUrl.split("/").pop()?.replace(".git", "") || "base",
101
+ url: baseUrl,
102
+ ref: "main",
103
+ };
104
+ const coreUrl = await input({
105
+ message: "Enter the CORE repository URL:",
106
+ default: "https://github.com/your-org/your-core-repo.git",
107
+ validate: (value) => {
108
+ if (!value.trim())
109
+ return "URL is required";
110
+ return true;
111
+ },
112
+ });
113
+ config.core = {
114
+ name: coreUrl.split("/").pop()?.replace(".git", "") || "core",
115
+ url: coreUrl,
116
+ ref: "main",
117
+ };
118
+ config.custom = {
119
+ path: "custom",
120
+ };
121
+ break;
122
+ }
123
+ }
124
+ // Install command run after build
125
+ config.install = {
126
+ command: "npm install",
127
+ };
128
+ // Additional glob patterns to exclude when copying
129
+ // Examples: "**/*.log", "dist/**", "node_modules/**", "**/*.tmp"
130
+ config.excludes = ["**/*.log", "dist/**", "node_modules/**", "**/*.tmp"];
131
+ // Write config file
132
+ const configPath = join(process.cwd(), "workspace.config.json");
133
+ writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
134
+ logger.success(`Created ${configPath}`);
135
+ // Create .gitignore
136
+ const gitignorePath = join(process.cwd(), ".gitignore");
137
+ // Minimal, fixed .gitignore (workspace and cache)
138
+ const gitignoreContent = `# Workspace CLI
139
+ workspace/
140
+ .wmc-cache/
141
+ `;
142
+ writeFileSync(gitignorePath, gitignoreContent, "utf-8");
143
+ logger.success(`Created ${gitignorePath}`);
144
+ logger.info(`Project type: ${getProjectTypeDescription(projectType)}`);
145
+ logger.info("You can now run 'wmc init' to initialize the repositories.");
146
+ return true;
147
+ }
148
+ catch (err) {
149
+ const errorMessage = err instanceof Error ? err.message : String(err);
150
+ logger.error(`Failed to generate config: ${errorMessage}`);
151
+ return false;
152
+ }
153
+ }
154
+ /**
155
+ * Initialize logger and config with error handling
156
+ */
157
+ async function setup(options) {
158
+ const logger = createLogger({ json: options.json });
159
+ try {
160
+ const config = await loadConfig();
161
+ return { logger, config };
162
+ }
163
+ catch (err) {
164
+ // Check if error is due to missing config file
165
+ const errorMessage = err instanceof Error ? err.message : String(err);
166
+ const configExists = existsSync(join(process.cwd(), "workspace.config.json")) ||
167
+ existsSync(join(process.cwd(), "workspace.config.js"));
168
+ if (!configExists && !options.json) {
169
+ // Offer to generate config
170
+ logger.info("No config file found.");
171
+ const shouldGenerate = await confirm({
172
+ message: "Would you like to create a workspace config now?",
173
+ default: true,
174
+ });
175
+ if (shouldGenerate) {
176
+ const generated = await generateDefaultConfig(logger);
177
+ if (generated) {
178
+ // Try loading again
179
+ try {
180
+ const config = await loadConfig();
181
+ return { logger, config };
182
+ }
183
+ catch (retryErr) {
184
+ const retryError = retryErr instanceof Error ? retryErr.message : String(retryErr);
185
+ logger.error(`Failed to load generated config: ${retryError}`);
186
+ process.exit(1);
187
+ }
188
+ }
189
+ else {
190
+ logger.error("Config generation was not completed");
191
+ process.exit(1);
192
+ }
193
+ }
194
+ else {
195
+ logger.info("Config generation skipped");
196
+ process.exit(1);
197
+ }
198
+ }
199
+ logger.error(errorMessage);
200
+ if (options.json) {
201
+ logger.outputJson({
202
+ command: "setup",
203
+ success: false,
204
+ error: errorMessage,
205
+ });
206
+ }
207
+ process.exit(1);
208
+ }
209
+ }
210
+ program
211
+ .name("workspace-manager-cli")
212
+ .description("Assemble project workspace from shared core boilerplate plus custom folder")
213
+ .version(pkg.version ?? "0.0.0")
214
+ .option("--json", "Output machine-readable JSON");
215
+ // ============================================================================
216
+ // init command
217
+ // ============================================================================
218
+ program
219
+ .command("init")
220
+ .description("Initialize repositories (clone to cache)")
221
+ .option("-i, --interactive", "Interactively select branch or tag")
222
+ .option("--ref <ref>", "Override the ref (branch/tag/commit) to checkout for core")
223
+ .option("--base-ref <ref>", "Override the ref for base repository")
224
+ .option("--base-latest", "Fetch and checkout latest commit on base branch")
225
+ .option("--core-latest", "Fetch and checkout latest commit on core branch")
226
+ .option("--build", "Build workspace after initialization")
227
+ .option("--no-install", "Skip install when building (requires --build)")
228
+ .action(async (cmdOptions) => {
229
+ const options = program.opts();
230
+ const { logger, config } = await setup(options);
231
+ try {
232
+ logger.info(`Project type: ${getProjectTypeDescription(config.projectType)}`);
233
+ // Handle initialization based on project type
234
+ switch (config.projectType) {
235
+ case "core-custom":
236
+ await initCoreCustom(config, logger, cmdOptions, options);
237
+ break;
238
+ case "base-core":
239
+ await initBaseCore(config, logger, cmdOptions, options);
240
+ break;
241
+ case "base-core-custom":
242
+ await initBaseCoreCustom(config, logger, cmdOptions, options);
243
+ break;
244
+ }
245
+ logger.success("Initialization complete");
246
+ // Build workspace if --build flag is set
247
+ if (cmdOptions.build) {
248
+ logger.info("Building workspace...");
249
+ const result = await buildWorkspace(config, logger, {
250
+ noInstall: !cmdOptions.install,
251
+ });
252
+ if (!result.success) {
253
+ process.exit(1);
254
+ }
255
+ }
256
+ }
257
+ catch (err) {
258
+ logger.error(err instanceof Error ? err.message : String(err));
259
+ if (options.json) {
260
+ logger.outputJson({
261
+ command: "init",
262
+ success: false,
263
+ error: String(err),
264
+ });
265
+ }
266
+ process.exit(1);
267
+ }
268
+ });
269
+ /**
270
+ * Initialize for core-custom project type
271
+ */
272
+ async function initCoreCustom(config, logger, cmdOptions, options) {
273
+ if (!config.core || !("url" in config.core)) {
274
+ throw new Error("No remote core repository configured");
275
+ }
276
+ let selectedRef = cmdOptions.ref || config.core.ref;
277
+ // If --core-latest flag is set, use origin/<ref>
278
+ if (cmdOptions.coreLatest) {
279
+ selectedRef = `origin/${config.core.ref}`;
280
+ }
281
+ // Interactive mode: let user choose branch or tag
282
+ if (cmdOptions.interactive && !options.json) {
283
+ selectedRef = await selectRef(config.coreCachePath, config.core.url, selectedRef, "core", logger);
284
+ }
285
+ // Proceed with initialization - clone to cache
286
+ await cloneToCache(config, logger);
287
+ await fetchLatest(config.cachePath, logger);
288
+ const coreCommit = await checkoutRef(config.cachePath, selectedRef, logger);
289
+ config.core.hash = coreCommit;
290
+ config.core.ref = selectedRef;
291
+ await persistHashesToWorkspaceConfig(config, { coreHash: coreCommit, coreRef: selectedRef }, logger);
292
+ // Check local custom exists
293
+ if (config.customPath) {
294
+ if (existsSync(config.customPath)) {
295
+ logger.success(`Local custom directory found: ${config.customDir}`);
296
+ }
297
+ else {
298
+ logger.warn(`Local custom directory not found: ${config.customDir}`);
299
+ if (!options.json) {
300
+ const shouldCreate = await confirm({
301
+ message: `Would you like to create the custom directory "${config.customDir}"?`,
302
+ default: true,
303
+ });
304
+ if (shouldCreate) {
305
+ const { mkdirSync } = await import("fs");
306
+ mkdirSync(config.customPath, { recursive: true });
307
+ logger.success(`Created custom directory: ${config.customDir}`);
308
+ }
309
+ else {
310
+ logger.info(`Create the directory manually and add your custom files.`);
311
+ }
312
+ }
313
+ else {
314
+ logger.info(`Create the directory and add your custom files.`);
315
+ }
316
+ }
317
+ }
318
+ if (options.json) {
319
+ const gitInfo = await getGitInfo(getCorePath(config));
320
+ logger.outputJson({
321
+ command: "init",
322
+ success: true,
323
+ projectType: config.projectType,
324
+ ref: selectedRef,
325
+ commit: gitInfo?.commit,
326
+ });
327
+ }
328
+ }
329
+ /**
330
+ * Initialize for base-core project type (remote base + local core)
331
+ */
332
+ async function initBaseCore(config, logger, cmdOptions, options) {
333
+ if (!config.base) {
334
+ throw new Error("No base repository configured");
335
+ }
336
+ let selectedBaseRef = cmdOptions.baseRef || cmdOptions.ref || config.base.ref;
337
+ // If --base-latest flag is set, use origin/<ref>
338
+ if (cmdOptions.baseLatest) {
339
+ selectedBaseRef = `origin/${config.base.ref}`;
340
+ }
341
+ // Interactive mode: let user choose branch or tag for base
342
+ if (cmdOptions.interactive && !options.json) {
343
+ selectedBaseRef = await selectRef(config.baseCachePath, config.base.url, selectedBaseRef, "base", logger);
344
+ }
345
+ // Clone and checkout base
346
+ await cloneBaseToCache(config, logger);
347
+ await fetchLatest(config.baseCachePath, logger);
348
+ const baseCommit = await checkoutRef(config.baseCachePath, selectedBaseRef, logger);
349
+ config.base.hash = baseCommit;
350
+ config.base.ref = selectedBaseRef;
351
+ await persistHashesToWorkspaceConfig(config, { baseHash: baseCommit, baseRef: selectedBaseRef }, logger);
352
+ // Check local core exists
353
+ if (config.coreLocalPath) {
354
+ if (existsSync(config.coreLocalPath)) {
355
+ logger.success(`Local core directory found: ${config.coreDir}`);
356
+ }
357
+ else {
358
+ logger.warn(`Local core directory not found: ${config.coreDir}`);
359
+ if (!options.json) {
360
+ const shouldCreate = await confirm({
361
+ message: `Would you like to create the core directory "${config.coreDir}"?`,
362
+ default: true,
363
+ });
364
+ if (shouldCreate) {
365
+ const { mkdirSync } = await import("fs");
366
+ mkdirSync(config.coreLocalPath, { recursive: true });
367
+ logger.success(`Created core directory: ${config.coreDir}`);
368
+ }
369
+ else {
370
+ logger.info(`Create the directory manually and add your core files.`);
371
+ }
372
+ }
373
+ else {
374
+ logger.info(`Create the directory and add your core files.`);
375
+ }
376
+ }
377
+ }
378
+ if (options.json) {
379
+ const gitInfo = await getGitInfo(config.baseCachePath);
380
+ logger.outputJson({
381
+ command: "init",
382
+ success: true,
383
+ projectType: config.projectType,
384
+ baseRef: selectedBaseRef,
385
+ baseCommit: gitInfo?.commit,
386
+ });
387
+ }
388
+ }
389
+ /**
390
+ * Initialize for base-core-custom project type (remote base + remote core + local custom)
391
+ */
392
+ async function initBaseCoreCustom(config, logger, cmdOptions, options) {
393
+ if (!config.base) {
394
+ throw new Error("No base repository configured");
395
+ }
396
+ if (!config.core || !("url" in config.core)) {
397
+ throw new Error("No remote core repository configured");
398
+ }
399
+ let selectedBaseRef = cmdOptions.baseRef || config.base.ref;
400
+ let selectedCoreRef = cmdOptions.ref || config.core.ref;
401
+ // If --base-latest flag is set, use origin/<ref>
402
+ if (cmdOptions.baseLatest) {
403
+ selectedBaseRef = `origin/${config.base.ref}`;
404
+ }
405
+ // If --core-latest flag is set, use origin/<ref>
406
+ if (cmdOptions.coreLatest) {
407
+ selectedCoreRef = `origin/${config.core.ref}`;
408
+ }
409
+ // Determine which repos to (re)initialize
410
+ const baseMissing = !(await isGitRepo(config.baseCachePath));
411
+ const coreMissing = !(await isGitRepo(config.coreCachePath));
412
+ const shouldInitBase = baseMissing ||
413
+ cmdOptions.baseRef !== undefined ||
414
+ cmdOptions.baseLatest === true ||
415
+ (!cmdOptions.ref && !cmdOptions.baseRef && !cmdOptions.coreLatest);
416
+ const shouldInitCore = coreMissing ||
417
+ cmdOptions.ref !== undefined ||
418
+ cmdOptions.coreLatest === true ||
419
+ (!cmdOptions.ref && !cmdOptions.baseRef && !cmdOptions.baseLatest);
420
+ // Interactive mode: let user choose refs (only for repos being updated)
421
+ if (cmdOptions.interactive && !options.json) {
422
+ logger.info("Select refs for base and core repositories...");
423
+ if (shouldInitBase) {
424
+ selectedBaseRef = await selectRef(config.baseCachePath, config.base.url, selectedBaseRef, "base", logger);
425
+ }
426
+ if (shouldInitCore) {
427
+ selectedCoreRef = await selectRef(config.coreCachePath, config.core.url, selectedCoreRef, "core", logger);
428
+ }
429
+ }
430
+ let baseCommit;
431
+ let coreCommit;
432
+ if (shouldInitBase) {
433
+ logger.info("Initializing base repository...");
434
+ await cloneBaseToCache(config, logger);
435
+ await fetchLatest(config.baseCachePath, logger);
436
+ baseCommit = await checkoutRef(config.baseCachePath, selectedBaseRef, logger);
437
+ config.base.hash = baseCommit;
438
+ config.base.ref = selectedBaseRef;
439
+ }
440
+ else {
441
+ logger.info("Skipping base (no --base-ref provided and base already initialized)");
442
+ }
443
+ if (shouldInitCore) {
444
+ logger.info("Initializing core repository...");
445
+ await cloneCoreToCache(config, logger);
446
+ await fetchLatest(config.coreCachePath, logger);
447
+ coreCommit = await checkoutRef(config.coreCachePath, selectedCoreRef, logger);
448
+ config.core.hash = coreCommit;
449
+ config.core.ref = selectedCoreRef;
450
+ }
451
+ else {
452
+ logger.info("Skipping core (no --ref provided and core already initialized)");
453
+ }
454
+ // Persist hashes and refs for repos that were updated
455
+ const hashes = {};
456
+ if (baseCommit) {
457
+ hashes.baseHash = baseCommit;
458
+ hashes.baseRef = selectedBaseRef;
459
+ }
460
+ if (coreCommit) {
461
+ hashes.coreHash = coreCommit;
462
+ hashes.coreRef = selectedCoreRef;
463
+ }
464
+ if (Object.keys(hashes).length > 0) {
465
+ await persistHashesToWorkspaceConfig(config, hashes, logger);
466
+ }
467
+ // Check local custom exists
468
+ if (config.customPath) {
469
+ if (existsSync(config.customPath)) {
470
+ logger.success(`Local custom directory found: ${config.customDir}`);
471
+ }
472
+ else {
473
+ logger.warn(`Local custom directory not found: ${config.customDir}`);
474
+ if (!options.json) {
475
+ const shouldCreate = await confirm({
476
+ message: `Would you like to create the custom directory "${config.customDir}"?`,
477
+ default: true,
478
+ });
479
+ if (shouldCreate) {
480
+ const { mkdirSync } = await import("fs");
481
+ mkdirSync(config.customPath, { recursive: true });
482
+ logger.success(`Created custom directory: ${config.customDir}`);
483
+ }
484
+ else {
485
+ logger.info(`Create the directory manually and add your custom files.`);
486
+ }
487
+ }
488
+ else {
489
+ logger.info(`Create the directory and add your custom files.`);
490
+ }
491
+ }
492
+ }
493
+ if (options.json) {
494
+ const baseInfo = shouldInitBase
495
+ ? await getGitInfo(config.baseCachePath)
496
+ : undefined;
497
+ const coreInfo = shouldInitCore
498
+ ? await getGitInfo(config.coreCachePath)
499
+ : undefined;
500
+ logger.outputJson({
501
+ command: "init",
502
+ success: true,
503
+ projectType: config.projectType,
504
+ baseRef: shouldInitBase ? selectedBaseRef : undefined,
505
+ baseCommit: baseInfo?.commit,
506
+ coreRef: shouldInitCore ? selectedCoreRef : undefined,
507
+ coreCommit: coreInfo?.commit,
508
+ });
509
+ }
510
+ }
511
+ /**
512
+ * Interactive ref selection helper
513
+ */
514
+ async function selectRef(cachePath, url, defaultRef, repoName, logger) {
515
+ logger.info(`Fetching available branches and tags for ${repoName}...`);
516
+ let refs;
517
+ if (await isGitRepo(cachePath)) {
518
+ await fetchLatest(cachePath, logger);
519
+ refs = await listRemoteRefs(cachePath, logger);
520
+ }
521
+ else {
522
+ refs = await listRemoteRefsFromUrl(url, logger);
523
+ }
524
+ const choices = [];
525
+ if (refs.branches.length > 0) {
526
+ choices.push({
527
+ name: "── Branches ──",
528
+ value: "__separator_branches__",
529
+ });
530
+ for (const branch of refs.branches) {
531
+ const isDefault = branch === defaultRef;
532
+ choices.push({
533
+ name: isDefault ? ` ${branch} (default)` : ` ${branch}`,
534
+ value: branch,
535
+ });
536
+ }
537
+ }
538
+ if (refs.tags.length > 0) {
539
+ choices.push({ name: "── Tags ──", value: "__separator_tags__" });
540
+ const sortedTags = [...refs.tags].reverse();
541
+ for (const tag of sortedTags) {
542
+ choices.push({
543
+ name: ` ${tag}`,
544
+ value: tag,
545
+ });
546
+ }
547
+ }
548
+ if (choices.length === 0) {
549
+ logger.warn(`No branches or tags found for ${repoName}. Using default ref.`);
550
+ return defaultRef;
551
+ }
552
+ const selectedRef = await select({
553
+ message: `Select branch or tag for ${repoName}:`,
554
+ choices: choices.filter((c) => !c.value.startsWith("__separator")),
555
+ default: defaultRef,
556
+ });
557
+ logger.info(`Selected ${repoName}: ${selectedRef}`);
558
+ return selectedRef;
559
+ }
560
+ // ============================================================================
561
+ // build command (alias: sync)
562
+ // ============================================================================
563
+ program
564
+ .command("build")
565
+ .alias("sync")
566
+ .description("Build workspace by assembling repositories and overlaying custom code based on project type")
567
+ .option("--no-install", "Skip running install command")
568
+ .option("--dry-run", "Log planned actions without executing")
569
+ .action(async (cmdOptions) => {
570
+ const options = program.opts();
571
+ const { logger, config } = await setup(options);
572
+ try {
573
+ const result = await buildWorkspace(config, logger, {
574
+ noInstall: !cmdOptions.install,
575
+ dryRun: cmdOptions.dryRun,
576
+ });
577
+ if (options.json) {
578
+ logger.outputJson({
579
+ command: "build",
580
+ ...result,
581
+ });
582
+ }
583
+ if (!result.success) {
584
+ process.exit(1);
585
+ }
586
+ }
587
+ catch (err) {
588
+ logger.error(err instanceof Error ? err.message : String(err));
589
+ if (options.json) {
590
+ logger.outputJson({
591
+ command: "build",
592
+ success: false,
593
+ error: String(err),
594
+ });
595
+ }
596
+ process.exit(1);
597
+ }
598
+ });
599
+ // ============================================================================
600
+ // status command
601
+ // ============================================================================
602
+ program
603
+ .command("status")
604
+ .description("Print current status of core, lockfile, and custom directory")
605
+ .action(async () => {
606
+ const options = program.opts();
607
+ const { logger, config } = await setup(options);
608
+ try {
609
+ const status = await getStatus(config, logger);
610
+ printStatus(config, status, logger, !!options.json);
611
+ }
612
+ catch (err) {
613
+ logger.error(err instanceof Error ? err.message : String(err));
614
+ if (options.json) {
615
+ logger.outputJson({
616
+ command: "status",
617
+ success: false,
618
+ error: String(err),
619
+ });
620
+ }
621
+ process.exit(1);
622
+ }
623
+ });
624
+ // Parse and run
625
+ program.parse();
626
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,UAAU,EAGV,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,WAAW,EAEX,UAAU,EACV,cAAc,EACd,qBAAqB,EACrB,SAAS,GAEV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAgB,CAAC;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAAC,MAAc;IACjD,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAEpE,uBAAuB;QACvB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAc;YAC5C,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,2DAA2D;oBACjE,KAAK,EAAE,aAA4B;iBACpC;gBACD;oBACE,IAAI,EAAE,yDAAyD;oBAC/D,KAAK,EAAE,WAA0B;iBAClC;gBACD;oBACE,IAAI,EAAE,kFAAkF;oBACxF,KAAK,EAAE,kBAAiC;iBACzC;aACF;YACD,OAAO,EAAE,kBAAiC;SAC3C,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,MAAM,GAAQ;YAClB,WAAW,EAAE,WAAW;SACzB,CAAC;QAEF,sCAAsC;QACtC,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,6BAA6B;gBAC7B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;oBAC1B,OAAO,EAAE,gCAAgC;oBACzC,OAAO,EAAE,gDAAgD;oBACzD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;4BAAE,OAAO,iBAAiB,CAAC;wBAC5C,OAAO,IAAI,CAAC;oBACd,CAAC;iBACF,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,GAAG;oBACZ,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM;oBAC7D,GAAG,EAAE,OAAO;oBACZ,GAAG,EAAE,MAAM;iBACZ,CAAC;gBAEF,MAAM,CAAC,MAAM,GAAG;oBACd,IAAI,EAAE,QAAQ;iBACf,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,2BAA2B;gBAC3B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;oBAC1B,OAAO,EAAE,gCAAgC;oBACzC,OAAO,EAAE,gDAAgD;oBACzD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;4BAAE,OAAO,iBAAiB,CAAC;wBAC5C,OAAO,IAAI,CAAC;oBACd,CAAC;iBACF,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,GAAG;oBACZ,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM;oBAC7D,GAAG,EAAE,OAAO;oBACZ,GAAG,EAAE,MAAM;iBACZ,CAAC;gBAEF,MAAM,CAAC,IAAI,GAAG;oBACZ,IAAI,EAAE,MAAM;iBACb,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,2CAA2C;gBAC3C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;oBAC1B,OAAO,EAAE,gCAAgC;oBACzC,OAAO,EAAE,gDAAgD;oBACzD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;4BAAE,OAAO,iBAAiB,CAAC;wBAC5C,OAAO,IAAI,CAAC;oBACd,CAAC;iBACF,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,GAAG;oBACZ,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM;oBAC7D,GAAG,EAAE,OAAO;oBACZ,GAAG,EAAE,MAAM;iBACZ,CAAC;gBAEF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;oBAC1B,OAAO,EAAE,gCAAgC;oBACzC,OAAO,EAAE,gDAAgD;oBACzD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;4BAAE,OAAO,iBAAiB,CAAC;wBAC5C,OAAO,IAAI,CAAC;oBACd,CAAC;iBACF,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,GAAG;oBACZ,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM;oBAC7D,GAAG,EAAE,OAAO;oBACZ,GAAG,EAAE,MAAM;iBACZ,CAAC;gBAEF,MAAM,CAAC,MAAM,GAAG;oBACd,IAAI,EAAE,QAAQ;iBACf,CAAC;gBACF,MAAM;YACR,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,CAAC,OAAO,GAAG;YACf,OAAO,EAAE,aAAa;SACvB,CAAC;QAEF,mDAAmD;QACnD,iEAAiE;QACjE,MAAM,CAAC,QAAQ,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAEzE,oBAAoB;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAChE,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;QAExC,oBAAoB;QACpB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QAExD,kDAAkD;QAClD,MAAM,gBAAgB,GAAG;;;CAG5B,CAAC;QAEE,aAAa,CAAC,aAAa,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,WAAW,aAAa,EAAE,CAAC,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,iBAAiB,yBAAyB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAE1E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,KAAK,CAAC,OAEpB;IACC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,+CAA+C;QAC/C,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,MAAM,YAAY,GAChB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;YACxD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACnC,2BAA2B;YAC3B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACrC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;gBACnC,OAAO,EAAE,kDAAkD;gBAC3D,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBACtD,IAAI,SAAS,EAAE,CAAC;oBACd,oBAAoB;oBACpB,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;wBAClC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;oBAC5B,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,MAAM,UAAU,GACd,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAClE,MAAM,CAAC,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;wBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;oBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,UAAU,CAAC;gBAChB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,uBAAuB,CAAC;KAC7B,WAAW,CACV,4EAA4E,CAC7E;KACA,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;KAC/B,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC;AAEpD,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAC/E,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;KACjE,MAAM,CACL,aAAa,EACb,2DAA2D,CAC5D;KACA,MAAM,CAAC,kBAAkB,EAAE,sCAAsC,CAAC;KAClE,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAC1E,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAC1E,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;KACzD,MAAM,CAAC,cAAc,EAAE,+CAA+C,CAAC;KACvE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CACT,iBAAiB,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CACjE,CAAC;QAEF,8CAA8C;QAC9C,QAAQ,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3B,KAAK,aAAa;gBAChB,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM;YAER,KAAK,WAAW;gBACd,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBACxD,MAAM;YAER,KAAK,kBAAkB;gBACrB,MAAM,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9D,MAAM;QACV,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAE1C,yCAAyC;QACzC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE;gBAClD,SAAS,EAAE,CAAC,UAAU,CAAC,OAAO;aAC/B,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,UAAU,CAAC;gBAChB,OAAO,EAAE,MAAM;gBACf,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,MAAsB,EACtB,MAAc,EACd,UAAyE,EACzE,OAA2B;IAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW,GAAG,UAAU,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAEpD,iDAAiD;IACjD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,WAAW,GAAG,UAAU,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;IAED,kDAAkD;IAClD,IAAI,UAAU,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5C,WAAW,GAAG,MAAM,SAAS,CAC3B,MAAM,CAAC,aAAc,EACrB,MAAM,CAAC,IAAI,CAAC,GAAI,EAChB,WAAW,EACX,MAAM,EACN,MAAM,CACP,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAE5E,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;IAC9B,MAAM,8BAA8B,CAClC,MAAM,EACN,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,EAC9C,MAAM,CACP,CAAC;IAEF,4BAA4B;IAC5B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,iCAAiC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAErE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;oBACjC,OAAO,EAAE,kDAAkD,MAAM,CAAC,SAAS,IAAI;oBAC/E,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBAEH,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;oBACzC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,MAAM,CAAC,OAAO,CAAC,6BAA6B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CACT,0DAA0D,CAC3D,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC;YAChB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,MAAsB,EACtB,MAAc,EACd,UAKC,EACD,OAA2B;IAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,eAAe,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAE9E,iDAAiD;IACjD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,eAAe,GAAG,UAAU,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,2DAA2D;IAC3D,IAAI,UAAU,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5C,eAAe,GAAG,MAAM,SAAS,CAC/B,MAAM,CAAC,aAAc,EACrB,MAAM,CAAC,IAAI,CAAC,GAAG,EACf,eAAe,EACf,MAAM,EACN,MAAM,CACP,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,WAAW,CAAC,MAAM,CAAC,aAAc,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,WAAW,CAClC,MAAM,CAAC,aAAc,EACrB,eAAe,EACf,MAAM,CACP,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;IAClC,MAAM,8BAA8B,CAClC,MAAM,EACN,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,EAClD,MAAM,CACP,CAAC;IAEF,0BAA0B;IAC1B,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,+BAA+B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAEjE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;oBACjC,OAAO,EAAE,gDAAgD,MAAM,CAAC,OAAO,IAAI;oBAC3E,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBAEH,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;oBACzC,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrD,MAAM,CAAC,OAAO,CAAC,2BAA2B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,aAAc,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC;YAChB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,eAAe;YACxB,UAAU,EAAE,OAAO,EAAE,MAAM;SAC5B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,MAAsB,EACtB,MAAc,EACd,UAMC,EACD,OAA2B;IAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,eAAe,GAAG,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC5D,IAAI,eAAe,GAAG,UAAU,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAExD,iDAAiD;IACjD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,eAAe,GAAG,UAAU,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,iDAAiD;IACjD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,eAAe,GAAG,UAAU,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,0CAA0C;IAC1C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,aAAc,CAAC,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,aAAc,CAAC,CAAC,CAAC;IAC9D,MAAM,cAAc,GAClB,WAAW;QACX,UAAU,CAAC,OAAO,KAAK,SAAS;QAChC,UAAU,CAAC,UAAU,KAAK,IAAI;QAC9B,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrE,MAAM,cAAc,GAClB,WAAW;QACX,UAAU,CAAC,GAAG,KAAK,SAAS;QAC5B,UAAU,CAAC,UAAU,KAAK,IAAI;QAC9B,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAErE,wEAAwE;IACxE,IAAI,UAAU,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7D,IAAI,cAAc,EAAE,CAAC;YACnB,eAAe,GAAG,MAAM,SAAS,CAC/B,MAAM,CAAC,aAAc,EACrB,MAAM,CAAC,IAAI,CAAC,GAAG,EACf,eAAe,EACf,MAAM,EACN,MAAM,CACP,CAAC;QACJ,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,eAAe,GAAG,MAAM,SAAS,CAC/B,MAAM,CAAC,aAAc,EACrB,MAAM,CAAC,IAAI,CAAC,GAAI,EAChB,eAAe,EACf,MAAM,EACN,MAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,UAA8B,CAAC;IACnC,IAAI,UAA8B,CAAC;IAEnC,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,WAAW,CAAC,MAAM,CAAC,aAAc,EAAE,MAAM,CAAC,CAAC;QACjD,UAAU,GAAG,MAAM,WAAW,CAC5B,MAAM,CAAC,aAAc,EACrB,eAAe,EACf,MAAM,CACP,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CACT,qEAAqE,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,WAAW,CAAC,MAAM,CAAC,aAAc,EAAE,MAAM,CAAC,CAAC;QACjD,UAAU,GAAG,MAAM,WAAW,CAC5B,MAAM,CAAC,aAAc,EACrB,eAAe,EACf,MAAM,CACP,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CACT,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC7B,MAAM,CAAC,OAAO,GAAG,eAAe,CAAC;IACnC,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;QAC7B,MAAM,CAAC,OAAO,GAAG,eAAe,CAAC;IACnC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,iCAAiC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAErE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;oBACjC,OAAO,EAAE,kDAAkD,MAAM,CAAC,SAAS,IAAI;oBAC/E,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBAEH,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;oBACzC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,MAAM,CAAC,OAAO,CAAC,6BAA6B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CACT,0DAA0D,CAC3D,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,cAAc;YAC7B,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,aAAc,CAAC;YACzC,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,QAAQ,GAAG,cAAc;YAC7B,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,aAAc,CAAC;YACzC,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,CAAC,UAAU,CAAC;YAChB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YACrD,UAAU,EAAE,QAAQ,EAAE,MAAM;YAC5B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YACrD,UAAU,EAAE,QAAQ,EAAE,MAAM;SAC7B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CACtB,SAAiB,EACjB,GAAW,EACX,UAAkB,EAClB,QAAgB,EAChB,MAAc;IAEd,MAAM,CAAC,IAAI,CAAC,4CAA4C,QAAQ,KAAK,CAAC,CAAC;IAEvE,IAAI,IAAI,CAAC;IACT,IAAI,MAAM,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAsC,EAAE,CAAC;IAEtD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,wBAAwB;SAChC,CAAC,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,KAAK,UAAU,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;gBACzD,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,KAAK,GAAG,EAAE;gBAChB,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CACT,iCAAiC,QAAQ,sBAAsB,CAChE,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC;QAC/B,OAAO,EAAE,4BAA4B,QAAQ,GAAG;QAChD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAClE,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,KAAK,WAAW,EAAE,CAAC,CAAC;IACpD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAC/E,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,KAAK,CAAC,MAAM,CAAC;KACb,WAAW,CACV,6FAA6F,CAC9F;KACA,MAAM,CAAC,cAAc,EAAE,8BAA8B,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE;YAClD,SAAS,EAAE,CAAC,UAAU,CAAC,OAAO;YAC9B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,UAAU,CAAC;gBAChB,OAAO,EAAE,OAAO;gBAChB,GAAG,MAAM;aACV,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,UAAU,CAAC;gBAChB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAC/E,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,UAAU,CAAC;gBAChB,OAAO,EAAE,QAAQ;gBACjB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,gBAAgB;AAChB,OAAO,CAAC,KAAK,EAAE,CAAC"}