@bagelink/workspace 1.12.19 → 1.12.25

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/bin/bgl.ts CHANGED
@@ -85,23 +85,27 @@ Lint Commands:
85
85
  // Auto-detect workspace or allow override
86
86
  const forceWorkspace = args.includes('--workspace') || args.includes('-w')
87
87
  const forceProject = args.includes('--project') || args.includes('-p')
88
+ const splitMode = args.includes('--split') || args.includes('-s')
88
89
 
89
90
  let workspaceMode = isWorkspace(process.cwd())
90
91
  if (forceWorkspace) workspaceMode = true
91
92
  if (forceProject) workspaceMode = false
92
93
 
94
+ const sdkOptions = { split: splitMode || undefined }
95
+
93
96
  if (workspaceMode) {
94
97
  console.log('✓ Detected workspace mode - will generate for multiple projects')
95
- await generateSDKForWorkspace()
98
+ await generateSDKForWorkspace(process.cwd(), sdkOptions)
96
99
  }
97
100
  else {
98
- await generateSDK(process.cwd())
101
+ await generateSDK(process.cwd(), sdkOptions)
99
102
  }
100
103
  }
101
104
  else {
102
105
  console.log(`
103
106
  SDK Commands:
104
107
  bgl sdk generate Generate SDK (auto-detects workspace)
108
+ bgl sdk generate --split Generate per-module API files
105
109
  bgl sdk generate --workspace Force workspace mode
106
110
  bgl sdk generate --project Force single project mode
107
111
  `)
@@ -145,10 +149,12 @@ Usage:
145
149
  Example: bgl build --mode production
146
150
  bgl lint init Set up linting (auto-detects workspace)
147
151
  bgl sdk generate Generate SDK (auto-detects workspace)
152
+ bgl sdk generate --split Generate per-module API files
148
153
 
149
154
  Options:
150
155
  --workspace, -w Force workspace mode
151
156
  --project, -p Force single project mode
157
+ --split, -s Split SDK into per-module files
152
158
  --mode <env> Set environment (matches bgl.config.ts keys)
153
159
  --help, -h Show this help message
154
160
 
package/dist/bin/bgl.cjs CHANGED
@@ -636,7 +636,7 @@ function updatePackageJsonLint(root, configs) {
636
636
  }
637
637
  }
638
638
 
639
- async function generateSDK(root = process__default.cwd()) {
639
+ async function generateSDK(root = process__default.cwd(), options = {}) {
640
640
  console.log("\n\u{1F527} Generating SDK from OpenAPI...\n");
641
641
  let config = null;
642
642
  let openApiUrl;
@@ -668,9 +668,9 @@ async function generateSDK(root = process__default.cwd()) {
668
668
  initial: "./src/api"
669
669
  },
670
670
  {
671
- type: "confirm",
671
+ type: options.split !== void 0 ? null : "confirm",
672
672
  name: "splitFiles",
673
- message: "Split into organized files?",
673
+ message: "Split into per-module files?",
674
674
  initial: true
675
675
  }
676
676
  ]);
@@ -679,16 +679,15 @@ async function generateSDK(root = process__default.cwd()) {
679
679
  process__default.exit(1);
680
680
  }
681
681
  const finalUrl = openApiUrl ?? response.openApiUrl;
682
- const { outputDir, splitFiles } = response;
682
+ const { outputDir } = response;
683
+ const splitFiles = options.split ?? response.splitFiles ?? false;
683
684
  console.log(`
684
685
  \u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
685
- console.log(`\u{1F4C1} Output directory: ${outputDir}
686
+ console.log(`\u{1F4C1} Output directory: ${outputDir}`);
687
+ console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
686
688
  `);
687
689
  try {
688
690
  const { openAPI } = await import('@bagelink/sdk');
689
- const { readFileSync } = await import('node:fs');
690
- const { dirname, join } = await import('node:path');
691
- const { fileURLToPath } = await import('node:url');
692
691
  const { types, code } = await openAPI(finalUrl, "/api");
693
692
  const outputPath = node_path.resolve(root, outputDir);
694
693
  if (!node_fs.existsSync(outputPath)) {
@@ -696,21 +695,40 @@ async function generateSDK(root = process__default.cwd()) {
696
695
  }
697
696
  const typesPath = node_path.resolve(outputPath, "types.d.ts");
698
697
  node_fs.writeFileSync(typesPath, types);
699
- console.log("\u2705 Generated types.d.ts");
700
698
  const apiPath = node_path.resolve(outputPath, "api.ts");
701
699
  node_fs.writeFileSync(apiPath, code);
702
- console.log("\u2705 Generated api.ts");
703
- console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
704
700
  if (splitFiles) {
705
- console.log("\n\u{1F500} Splitting into organized files...");
706
- console.log("\u2139\uFE0F File splitting requires @bagelink/sdk bin scripts");
707
- console.log(" Keeping monolithic structure for now");
701
+ console.log("\u{1F500} Splitting into per-module files...");
702
+ try {
703
+ const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
704
+ await splitClientCode({
705
+ bagelinkDir: outputPath,
706
+ useDirectories: true
707
+ });
708
+ node_fs.rmSync(apiPath, { force: true });
709
+ node_fs.rmSync(typesPath, { force: true });
710
+ console.log("\u2705 SDK split into per-module files!");
711
+ } catch (splitError) {
712
+ console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
713
+ console.log("\u2705 Generated monolithic api.ts + types.d.ts");
714
+ }
715
+ } else {
716
+ console.log("\u2705 Generated types.d.ts");
717
+ console.log("\u2705 Generated api.ts");
708
718
  }
719
+ console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
709
720
  console.log("\n\u2705 SDK generated successfully!");
710
- console.log(`
721
+ if (splitFiles) {
722
+ console.log(`
723
+ Import per-module in your code:`);
724
+ console.log(` import { person } from '${outputDir.replace("./src/", "./")}/api'`);
725
+ console.log(` import type { PersonOut } from '${outputDir.replace("./src/", "./")}/types'`);
726
+ } else {
727
+ console.log(`
711
728
  Import directly in your code:`);
712
- console.log(` import { agents } from '${outputDir.replace("./src/", "./")}/api'`);
713
- console.log(` import type { SendMessageRequest } from '${outputDir.replace("./src/", "./")}/types.d'`);
729
+ console.log(` import { agents } from '${outputDir.replace("./src/", "./")}/api'`);
730
+ console.log(` import type { SendMessageRequest } from '${outputDir.replace("./src/", "./")}/types.d'`);
731
+ }
714
732
  console.log("");
715
733
  } catch (error) {
716
734
  console.error("\n\u274C Failed to generate SDK:");
@@ -726,7 +744,7 @@ Import directly in your code:`);
726
744
  process__default.exit(1);
727
745
  }
728
746
  }
729
- async function generateSDKForWorkspace(root = process__default.cwd()) {
747
+ async function generateSDKForWorkspace(root = process__default.cwd(), options = {}) {
730
748
  console.log("\n\u{1F3E2} Generating SDK for workspace...\n");
731
749
  let config = null;
732
750
  let openApiUrl;
@@ -756,9 +774,11 @@ async function generateSDKForWorkspace(root = process__default.cwd()) {
756
774
  }
757
775
  const finalUrl = openApiUrl ?? response.openApiUrl;
758
776
  const outputDir = "./shared";
777
+ const splitFiles = options.split ?? false;
759
778
  console.log(`
760
779
  \u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
761
- console.log(`\u{1F4C1} Output directory: ${outputDir}
780
+ console.log(`\u{1F4C1} Output directory: ${outputDir}`);
781
+ console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
762
782
  `);
763
783
  try {
764
784
  const { openAPI } = await import('@bagelink/sdk');
@@ -769,15 +789,38 @@ async function generateSDKForWorkspace(root = process__default.cwd()) {
769
789
  }
770
790
  const typesPath = node_path.resolve(outputPath, "types.d.ts");
771
791
  node_fs.writeFileSync(typesPath, types);
772
- console.log("\u2705 Generated types.d.ts");
773
792
  const apiPath = node_path.resolve(outputPath, "api.ts");
774
793
  node_fs.writeFileSync(apiPath, code);
775
- console.log("\u2705 Generated api.ts");
794
+ if (splitFiles) {
795
+ console.log("\u{1F500} Splitting into per-module files...");
796
+ try {
797
+ const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
798
+ await splitClientCode({
799
+ bagelinkDir: outputPath,
800
+ useDirectories: true
801
+ });
802
+ node_fs.rmSync(apiPath, { force: true });
803
+ node_fs.rmSync(typesPath, { force: true });
804
+ console.log("\u2705 SDK split into per-module files!");
805
+ } catch (splitError) {
806
+ console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
807
+ }
808
+ } else {
809
+ console.log("\u2705 Generated types.d.ts");
810
+ console.log("\u2705 Generated api.ts");
811
+ }
776
812
  console.log("\n\u2705 SDK generated successfully in shared folder!");
777
- console.log(`
813
+ if (splitFiles) {
814
+ console.log(`
815
+ Import per-module from shared:`);
816
+ console.log(` import { person } from '@shared/api'`);
817
+ console.log(` import type { PersonOut } from '@shared/types'`);
818
+ } else {
819
+ console.log(`
778
820
  Import from shared in your projects:`);
779
- console.log(` import { agents } from '../shared/api'`);
780
- console.log(` import type { SendMessageRequest } from '../shared/types'`);
821
+ console.log(` import { agents } from '@shared/api'`);
822
+ console.log(` import type { SendMessageRequest } from '@shared/types'`);
823
+ }
781
824
  console.log("");
782
825
  } catch (error) {
783
826
  console.error("\n\u274C Failed to generate SDK:");
@@ -850,19 +893,22 @@ Lint Commands:
850
893
  if (subcommand === "generate") {
851
894
  const forceWorkspace = args.includes("--workspace") || args.includes("-w");
852
895
  const forceProject = args.includes("--project") || args.includes("-p");
896
+ const splitMode = args.includes("--split") || args.includes("-s");
853
897
  let workspaceMode = isWorkspace(process__default.cwd());
854
898
  if (forceWorkspace) workspaceMode = true;
855
899
  if (forceProject) workspaceMode = false;
900
+ const sdkOptions = { split: splitMode || void 0 };
856
901
  if (workspaceMode) {
857
902
  console.log("\u2713 Detected workspace mode - will generate for multiple projects");
858
- await generateSDKForWorkspace();
903
+ await generateSDKForWorkspace(process__default.cwd(), sdkOptions);
859
904
  } else {
860
- await generateSDK(process__default.cwd());
905
+ await generateSDK(process__default.cwd(), sdkOptions);
861
906
  }
862
907
  } else {
863
908
  console.log(`
864
909
  SDK Commands:
865
910
  bgl sdk generate Generate SDK (auto-detects workspace)
911
+ bgl sdk generate --split Generate per-module API files
866
912
  bgl sdk generate --workspace Force workspace mode
867
913
  bgl sdk generate --project Force single project mode
868
914
  `);
@@ -903,10 +949,12 @@ Usage:
903
949
  Example: bgl build --mode production
904
950
  bgl lint init Set up linting (auto-detects workspace)
905
951
  bgl sdk generate Generate SDK (auto-detects workspace)
952
+ bgl sdk generate --split Generate per-module API files
906
953
 
907
954
  Options:
908
955
  --workspace, -w Force workspace mode
909
956
  --project, -p Force single project mode
957
+ --split, -s Split SDK into per-module files
910
958
  --mode <env> Set environment (matches bgl.config.ts keys)
911
959
  --help, -h Show this help message
912
960
 
package/dist/bin/bgl.mjs CHANGED
@@ -3,7 +3,7 @@ import { resolve } from 'node:path';
3
3
  import process from 'node:process';
4
4
  import { spawn } from 'node:child_process';
5
5
  import { l as listProjects, w as writeNetlifyConfig, i as initWorkspace, a as addProject } from '../shared/workspace.Bhp9XbPk.mjs';
6
- import { existsSync, readFileSync, readdirSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
6
+ import { existsSync, readFileSync, readdirSync, writeFileSync, unlinkSync, mkdirSync, rmSync } from 'node:fs';
7
7
  import prompts from 'prompts';
8
8
 
9
9
  async function runBuild(filter, additionalArgs = []) {
@@ -629,7 +629,7 @@ function updatePackageJsonLint(root, configs) {
629
629
  }
630
630
  }
631
631
 
632
- async function generateSDK(root = process.cwd()) {
632
+ async function generateSDK(root = process.cwd(), options = {}) {
633
633
  console.log("\n\u{1F527} Generating SDK from OpenAPI...\n");
634
634
  let config = null;
635
635
  let openApiUrl;
@@ -661,9 +661,9 @@ async function generateSDK(root = process.cwd()) {
661
661
  initial: "./src/api"
662
662
  },
663
663
  {
664
- type: "confirm",
664
+ type: options.split !== void 0 ? null : "confirm",
665
665
  name: "splitFiles",
666
- message: "Split into organized files?",
666
+ message: "Split into per-module files?",
667
667
  initial: true
668
668
  }
669
669
  ]);
@@ -672,16 +672,15 @@ async function generateSDK(root = process.cwd()) {
672
672
  process.exit(1);
673
673
  }
674
674
  const finalUrl = openApiUrl ?? response.openApiUrl;
675
- const { outputDir, splitFiles } = response;
675
+ const { outputDir } = response;
676
+ const splitFiles = options.split ?? response.splitFiles ?? false;
676
677
  console.log(`
677
678
  \u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
678
- console.log(`\u{1F4C1} Output directory: ${outputDir}
679
+ console.log(`\u{1F4C1} Output directory: ${outputDir}`);
680
+ console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
679
681
  `);
680
682
  try {
681
683
  const { openAPI } = await import('@bagelink/sdk');
682
- const { readFileSync } = await import('node:fs');
683
- const { dirname, join } = await import('node:path');
684
- const { fileURLToPath } = await import('node:url');
685
684
  const { types, code } = await openAPI(finalUrl, "/api");
686
685
  const outputPath = resolve(root, outputDir);
687
686
  if (!existsSync(outputPath)) {
@@ -689,21 +688,40 @@ async function generateSDK(root = process.cwd()) {
689
688
  }
690
689
  const typesPath = resolve(outputPath, "types.d.ts");
691
690
  writeFileSync(typesPath, types);
692
- console.log("\u2705 Generated types.d.ts");
693
691
  const apiPath = resolve(outputPath, "api.ts");
694
692
  writeFileSync(apiPath, code);
695
- console.log("\u2705 Generated api.ts");
696
- console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
697
693
  if (splitFiles) {
698
- console.log("\n\u{1F500} Splitting into organized files...");
699
- console.log("\u2139\uFE0F File splitting requires @bagelink/sdk bin scripts");
700
- console.log(" Keeping monolithic structure for now");
694
+ console.log("\u{1F500} Splitting into per-module files...");
695
+ try {
696
+ const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
697
+ await splitClientCode({
698
+ bagelinkDir: outputPath,
699
+ useDirectories: true
700
+ });
701
+ rmSync(apiPath, { force: true });
702
+ rmSync(typesPath, { force: true });
703
+ console.log("\u2705 SDK split into per-module files!");
704
+ } catch (splitError) {
705
+ console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
706
+ console.log("\u2705 Generated monolithic api.ts + types.d.ts");
707
+ }
708
+ } else {
709
+ console.log("\u2705 Generated types.d.ts");
710
+ console.log("\u2705 Generated api.ts");
701
711
  }
712
+ console.log("\u2139\uFE0F Stream utilities are imported from @bagelink/sdk");
702
713
  console.log("\n\u2705 SDK generated successfully!");
703
- console.log(`
714
+ if (splitFiles) {
715
+ console.log(`
716
+ Import per-module in your code:`);
717
+ console.log(` import { person } from '${outputDir.replace("./src/", "./")}/api'`);
718
+ console.log(` import type { PersonOut } from '${outputDir.replace("./src/", "./")}/types'`);
719
+ } else {
720
+ console.log(`
704
721
  Import directly in your code:`);
705
- console.log(` import { agents } from '${outputDir.replace("./src/", "./")}/api'`);
706
- console.log(` import type { SendMessageRequest } from '${outputDir.replace("./src/", "./")}/types.d'`);
722
+ console.log(` import { agents } from '${outputDir.replace("./src/", "./")}/api'`);
723
+ console.log(` import type { SendMessageRequest } from '${outputDir.replace("./src/", "./")}/types.d'`);
724
+ }
707
725
  console.log("");
708
726
  } catch (error) {
709
727
  console.error("\n\u274C Failed to generate SDK:");
@@ -719,7 +737,7 @@ Import directly in your code:`);
719
737
  process.exit(1);
720
738
  }
721
739
  }
722
- async function generateSDKForWorkspace(root = process.cwd()) {
740
+ async function generateSDKForWorkspace(root = process.cwd(), options = {}) {
723
741
  console.log("\n\u{1F3E2} Generating SDK for workspace...\n");
724
742
  let config = null;
725
743
  let openApiUrl;
@@ -749,9 +767,11 @@ async function generateSDKForWorkspace(root = process.cwd()) {
749
767
  }
750
768
  const finalUrl = openApiUrl ?? response.openApiUrl;
751
769
  const outputDir = "./shared";
770
+ const splitFiles = options.split ?? false;
752
771
  console.log(`
753
772
  \u{1F4E1} Fetching OpenAPI spec from: ${finalUrl}`);
754
- console.log(`\u{1F4C1} Output directory: ${outputDir}
773
+ console.log(`\u{1F4C1} Output directory: ${outputDir}`);
774
+ console.log(`\u{1F500} Split mode: ${splitFiles ? "per-module" : "monolithic"}
755
775
  `);
756
776
  try {
757
777
  const { openAPI } = await import('@bagelink/sdk');
@@ -762,15 +782,38 @@ async function generateSDKForWorkspace(root = process.cwd()) {
762
782
  }
763
783
  const typesPath = resolve(outputPath, "types.d.ts");
764
784
  writeFileSync(typesPath, types);
765
- console.log("\u2705 Generated types.d.ts");
766
785
  const apiPath = resolve(outputPath, "api.ts");
767
786
  writeFileSync(apiPath, code);
768
- console.log("\u2705 Generated api.ts");
787
+ if (splitFiles) {
788
+ console.log("\u{1F500} Splitting into per-module files...");
789
+ try {
790
+ const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen');
791
+ await splitClientCode({
792
+ bagelinkDir: outputPath,
793
+ useDirectories: true
794
+ });
795
+ rmSync(apiPath, { force: true });
796
+ rmSync(typesPath, { force: true });
797
+ console.log("\u2705 SDK split into per-module files!");
798
+ } catch (splitError) {
799
+ console.warn("\u26A0\uFE0F Split failed, keeping monolithic files:", splitError instanceof Error ? splitError.message : splitError);
800
+ }
801
+ } else {
802
+ console.log("\u2705 Generated types.d.ts");
803
+ console.log("\u2705 Generated api.ts");
804
+ }
769
805
  console.log("\n\u2705 SDK generated successfully in shared folder!");
770
- console.log(`
806
+ if (splitFiles) {
807
+ console.log(`
808
+ Import per-module from shared:`);
809
+ console.log(` import { person } from '@shared/api'`);
810
+ console.log(` import type { PersonOut } from '@shared/types'`);
811
+ } else {
812
+ console.log(`
771
813
  Import from shared in your projects:`);
772
- console.log(` import { agents } from '../shared/api'`);
773
- console.log(` import type { SendMessageRequest } from '../shared/types'`);
814
+ console.log(` import { agents } from '@shared/api'`);
815
+ console.log(` import type { SendMessageRequest } from '@shared/types'`);
816
+ }
774
817
  console.log("");
775
818
  } catch (error) {
776
819
  console.error("\n\u274C Failed to generate SDK:");
@@ -843,19 +886,22 @@ Lint Commands:
843
886
  if (subcommand === "generate") {
844
887
  const forceWorkspace = args.includes("--workspace") || args.includes("-w");
845
888
  const forceProject = args.includes("--project") || args.includes("-p");
889
+ const splitMode = args.includes("--split") || args.includes("-s");
846
890
  let workspaceMode = isWorkspace(process.cwd());
847
891
  if (forceWorkspace) workspaceMode = true;
848
892
  if (forceProject) workspaceMode = false;
893
+ const sdkOptions = { split: splitMode || void 0 };
849
894
  if (workspaceMode) {
850
895
  console.log("\u2713 Detected workspace mode - will generate for multiple projects");
851
- await generateSDKForWorkspace();
896
+ await generateSDKForWorkspace(process.cwd(), sdkOptions);
852
897
  } else {
853
- await generateSDK(process.cwd());
898
+ await generateSDK(process.cwd(), sdkOptions);
854
899
  }
855
900
  } else {
856
901
  console.log(`
857
902
  SDK Commands:
858
903
  bgl sdk generate Generate SDK (auto-detects workspace)
904
+ bgl sdk generate --split Generate per-module API files
859
905
  bgl sdk generate --workspace Force workspace mode
860
906
  bgl sdk generate --project Force single project mode
861
907
  `);
@@ -896,10 +942,12 @@ Usage:
896
942
  Example: bgl build --mode production
897
943
  bgl lint init Set up linting (auto-detects workspace)
898
944
  bgl sdk generate Generate SDK (auto-detects workspace)
945
+ bgl sdk generate --split Generate per-module API files
899
946
 
900
947
  Options:
901
948
  --workspace, -w Force workspace mode
902
949
  --project, -p Force single project mode
950
+ --split, -s Split SDK into per-module files
903
951
  --mode <env> Set environment (matches bgl.config.ts keys)
904
952
  --help, -h Show this help message
905
953
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/workspace",
3
3
  "type": "module",
4
- "version": "1.12.19",
4
+ "version": "1.12.25",
5
5
  "description": "Monorepo workspace tooling for Bagel projects with proxy and config management",
6
6
  "author": {
7
7
  "name": "Bagel Studio",
package/src/sdk.ts CHANGED
@@ -1,14 +1,20 @@
1
1
  import type { WorkspaceConfig } from './types'
2
- import { existsSync, mkdirSync, writeFileSync } from 'node:fs'
2
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
3
3
  import { resolve } from 'node:path'
4
4
  import process from 'node:process'
5
5
  import prompts from 'prompts'
6
6
 
7
+ export interface GenerateSDKOptions {
8
+ /** Force split mode (per-module files) */
9
+ split?: boolean
10
+ }
11
+
7
12
  /**
8
13
  * Generate SDK from OpenAPI spec
9
14
  */
10
15
  export async function generateSDK(
11
16
  root: string = process.cwd(),
17
+ options: GenerateSDKOptions = {},
12
18
  ): Promise<void> {
13
19
  console.log('\n🔧 Generating SDK from OpenAPI...\n')
14
20
 
@@ -48,9 +54,9 @@ export async function generateSDK(
48
54
  initial: './src/api',
49
55
  },
50
56
  {
51
- type: 'confirm',
57
+ type: options.split !== undefined ? null : 'confirm',
52
58
  name: 'splitFiles',
53
- message: 'Split into organized files?',
59
+ message: 'Split into per-module files?',
54
60
  initial: true,
55
61
  },
56
62
  ])
@@ -61,17 +67,15 @@ export async function generateSDK(
61
67
  }
62
68
 
63
69
  const finalUrl = openApiUrl ?? response.openApiUrl
64
- const { outputDir, splitFiles } = response
70
+ const { outputDir } = response
71
+ const splitFiles = options.split ?? response.splitFiles ?? false
65
72
 
66
73
  console.log(`\n📡 Fetching OpenAPI spec from: ${finalUrl}`)
67
- console.log(`📁 Output directory: ${outputDir}\n`)
74
+ console.log(`📁 Output directory: ${outputDir}`)
75
+ console.log(`🔀 Split mode: ${splitFiles ? 'per-module' : 'monolithic'}\n`)
68
76
 
69
77
  try {
70
- // Dynamic import of @bagelink/sdk
71
78
  const { openAPI } = await import('@bagelink/sdk')
72
- const { readFileSync } = await import('node:fs')
73
- const { dirname, join } = await import('node:path')
74
- const { fileURLToPath } = await import('node:url')
75
79
 
76
80
  const { types, code } = await openAPI(finalUrl, '/api')
77
81
 
@@ -80,29 +84,49 @@ export async function generateSDK(
80
84
  mkdirSync(outputPath, { recursive: true })
81
85
  }
82
86
 
83
- // Write types
87
+ // Write monolithic files first (always needed as intermediate)
84
88
  const typesPath = resolve(outputPath, 'types.d.ts')
85
89
  writeFileSync(typesPath, types)
86
- console.log('✅ Generated types.d.ts')
87
90
 
88
- // Write API client
89
91
  const apiPath = resolve(outputPath, 'api.ts')
90
92
  writeFileSync(apiPath, code)
91
- console.log('✅ Generated api.ts')
92
- console.log('ℹ️ Stream utilities are imported from @bagelink/sdk')
93
93
 
94
94
  if (splitFiles) {
95
- console.log('\n🔀 Splitting into organized files...')
96
- console.log('ℹ️ File splitting requires @bagelink/sdk bin scripts')
97
- console.log(' Keeping monolithic structure for now')
98
- // Note: File splitting requires unpublished bin scripts
99
- // Users can manually run: bunx bagelink generate
95
+ console.log('🔀 Splitting into per-module files...')
96
+ try {
97
+ const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen')
98
+ await splitClientCode({
99
+ bagelinkDir: outputPath,
100
+ useDirectories: true,
101
+ })
102
+ // Remove monolithic files after successful split
103
+ rmSync(apiPath, { force: true })
104
+ rmSync(typesPath, { force: true })
105
+ console.log('✅ SDK split into per-module files!')
106
+ }
107
+ catch (splitError: unknown) {
108
+ console.warn('⚠️ Split failed, keeping monolithic files:', splitError instanceof Error ? splitError.message : splitError)
109
+ console.log('✅ Generated monolithic api.ts + types.d.ts')
110
+ }
111
+ }
112
+ else {
113
+ console.log('✅ Generated types.d.ts')
114
+ console.log('✅ Generated api.ts')
100
115
  }
101
116
 
117
+ console.log('ℹ️ Stream utilities are imported from @bagelink/sdk')
102
118
  console.log('\n✅ SDK generated successfully!')
103
- console.log(`\nImport directly in your code:`)
104
- console.log(` import { agents } from '${outputDir.replace('./src/', './')}/api'`)
105
- console.log(` import type { SendMessageRequest } from '${outputDir.replace('./src/', './')}/types.d'`)
119
+
120
+ if (splitFiles) {
121
+ console.log(`\nImport per-module in your code:`)
122
+ console.log(` import { person } from '${outputDir.replace('./src/', './')}/api'`)
123
+ console.log(` import type { PersonOut } from '${outputDir.replace('./src/', './')}/types'`)
124
+ }
125
+ else {
126
+ console.log(`\nImport directly in your code:`)
127
+ console.log(` import { agents } from '${outputDir.replace('./src/', './')}/api'`)
128
+ console.log(` import type { SendMessageRequest } from '${outputDir.replace('./src/', './')}/types.d'`)
129
+ }
106
130
  console.log('')
107
131
  }
108
132
  catch (error: unknown) {
@@ -124,7 +148,10 @@ export async function generateSDK(
124
148
  /**
125
149
  * Generate SDK for all projects in workspace
126
150
  */
127
- export async function generateSDKForWorkspace(root: string = process.cwd()): Promise<void> {
151
+ export async function generateSDKForWorkspace(
152
+ root: string = process.cwd(),
153
+ options: GenerateSDKOptions = {},
154
+ ): Promise<void> {
128
155
  console.log('\n🏢 Generating SDK for workspace...\n')
129
156
 
130
157
  // Try to load config
@@ -163,12 +190,13 @@ export async function generateSDKForWorkspace(root: string = process.cwd()): Pro
163
190
 
164
191
  const finalUrl = openApiUrl ?? response.openApiUrl
165
192
  const outputDir = './shared'
193
+ const splitFiles = options.split ?? false
166
194
 
167
195
  console.log(`\n📡 Fetching OpenAPI spec from: ${finalUrl}`)
168
- console.log(`📁 Output directory: ${outputDir}\n`)
196
+ console.log(`📁 Output directory: ${outputDir}`)
197
+ console.log(`🔀 Split mode: ${splitFiles ? 'per-module' : 'monolithic'}\n`)
169
198
 
170
199
  try {
171
- // Dynamic import of @bagelink/sdk
172
200
  const { openAPI } = await import('@bagelink/sdk')
173
201
 
174
202
  const { types, code } = await openAPI(finalUrl, '/api')
@@ -178,20 +206,47 @@ export async function generateSDKForWorkspace(root: string = process.cwd()): Pro
178
206
  mkdirSync(outputPath, { recursive: true })
179
207
  }
180
208
 
181
- // Write types
209
+ // Write monolithic files (always needed as intermediate for split)
182
210
  const typesPath = resolve(outputPath, 'types.d.ts')
183
211
  writeFileSync(typesPath, types)
184
- console.log('✅ Generated types.d.ts')
185
212
 
186
- // Write API client
187
213
  const apiPath = resolve(outputPath, 'api.ts')
188
214
  writeFileSync(apiPath, code)
189
- console.log('✅ Generated api.ts')
215
+
216
+ if (splitFiles) {
217
+ console.log('🔀 Splitting into per-module files...')
218
+ try {
219
+ const { splitClientCode } = await import('@bagelink/sdk/bin/splitClientGen')
220
+ await splitClientCode({
221
+ bagelinkDir: outputPath,
222
+ useDirectories: true,
223
+ })
224
+ // Remove monolithic files after successful split
225
+ rmSync(apiPath, { force: true })
226
+ rmSync(typesPath, { force: true })
227
+ console.log('✅ SDK split into per-module files!')
228
+ }
229
+ catch (splitError: unknown) {
230
+ console.warn('⚠️ Split failed, keeping monolithic files:', splitError instanceof Error ? splitError.message : splitError)
231
+ }
232
+ }
233
+ else {
234
+ console.log('✅ Generated types.d.ts')
235
+ console.log('✅ Generated api.ts')
236
+ }
190
237
 
191
238
  console.log('\n✅ SDK generated successfully in shared folder!')
192
- console.log(`\nImport from shared in your projects:`)
193
- console.log(` import { agents } from '../shared/api'`)
194
- console.log(` import type { SendMessageRequest } from '../shared/types'`)
239
+
240
+ if (splitFiles) {
241
+ console.log(`\nImport per-module from shared:`)
242
+ console.log(` import { person } from '@shared/api'`)
243
+ console.log(` import type { PersonOut } from '@shared/types'`)
244
+ }
245
+ else {
246
+ console.log(`\nImport from shared in your projects:`)
247
+ console.log(` import { agents } from '@shared/api'`)
248
+ console.log(` import type { SendMessageRequest } from '@shared/types'`)
249
+ }
195
250
  console.log('')
196
251
  }
197
252
  catch (error: unknown) {