@superdesign/cli 0.2.1 → 0.2.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.
@@ -10,6 +10,7 @@ export interface CreateDraftRequest {
10
10
  prompt: string;
11
11
  deviceMode?: 'mobile' | 'tablet' | 'desktop';
12
12
  contextFiles?: ContextFile[];
13
+ model?: string;
13
14
  }
14
15
  export interface IterateDraftRequest {
15
16
  prompts?: string[];
@@ -17,6 +18,7 @@ export interface IterateDraftRequest {
17
18
  count?: 1 | 2 | 3 | 4;
18
19
  mode: 'replace' | 'branch';
19
20
  contextFiles?: ContextFile[];
21
+ model?: string;
20
22
  }
21
23
  export interface PlanFlowRequest {
22
24
  flowContext?: string;
@@ -29,6 +31,7 @@ export interface ExecuteFlowRequest {
29
31
  flowContext?: string;
30
32
  pages: FlowPage[];
31
33
  contextFiles?: ContextFile[];
34
+ model?: string;
32
35
  }
33
36
  export interface JobCreatedResponse {
34
37
  jobId: string;
@@ -12,7 +12,7 @@ export declare const POLL_TIMEOUT_MS: number;
12
12
  export declare const AUTH_POLL_INTERVAL_MS = 2000;
13
13
  export declare const AUTH_POLL_TIMEOUT_MS: number;
14
14
  /** CLI version - should match package.json */
15
- export declare const CLI_VERSION = "0.2.1";
15
+ export declare const CLI_VERSION = "0.2.2";
16
16
  /** PostHog analytics configuration */
17
17
  export declare const POSTHOG_KEY: string;
18
18
  export declare const POSTHOG_HOST: string;
@@ -30,6 +30,8 @@ export declare const EXIT_CODES: {
30
30
  readonly VALIDATION_ERROR: 5;
31
31
  readonly TIMEOUT: 6;
32
32
  };
33
+ /** Supported model IDs for --model option */
34
+ export declare const SUPPORTED_MODELS: readonly ["gemini-3-flash", "gemini-3-pro", "gemini-3.1-pro", "claude-haiku-4-5", "claude-sonnet-4-5", "claude-opus-4-5", "claude-opus-4-6", "gpt-5.2", "gpt-5.2-thinking", "gpt-5-mini", "kimi-k2.5"];
33
35
  /** Skill files directory relative to project root */
34
36
  export declare const SKILLS_DIR = ".claude/skills/superdesign";
35
37
  /** SKILL.md file name */
package/dist/index.cjs CHANGED
@@ -104,6 +104,19 @@ var __webpack_exports__ = {};
104
104
  VALIDATION_ERROR: 5,
105
105
  TIMEOUT: 6
106
106
  };
107
+ const SUPPORTED_MODELS = [
108
+ 'gemini-3-flash',
109
+ 'gemini-3-pro',
110
+ 'gemini-3.1-pro',
111
+ 'claude-haiku-4-5',
112
+ 'claude-sonnet-4-5',
113
+ 'claude-opus-4-5',
114
+ 'claude-opus-4-6',
115
+ 'gpt-5.2',
116
+ 'gpt-5.2-thinking',
117
+ 'gpt-5-mini',
118
+ 'kimi-k2.5'
119
+ ];
107
120
  const SKILLS_DIR = '.claude/skills/superdesign';
108
121
  const SKILL_FILE_NAME = 'SKILL.md';
109
122
  const external_fs_namespaceObject = require("fs");
@@ -316,7 +329,7 @@ var __webpack_exports__ = {};
316
329
  try {
317
330
  startSpinner('Creating auth session...');
318
331
  const session = await createSession({
319
- cliVersion: "0.2.1",
332
+ cliVersion: "0.2.2",
320
333
  os: `${external_os_namespaceObject.platform()} ${external_os_namespaceObject.release()}`,
321
334
  hostname: external_os_namespaceObject.hostname()
322
335
  });
@@ -724,6 +737,12 @@ superdesign --help
724
737
  process.exit(EXIT_CODES.VALIDATION_ERROR);
725
738
  }
726
739
  }
740
+ function validateModel(model) {
741
+ if (model && !SUPPORTED_MODELS.includes(model)) {
742
+ output_error(`Invalid model "${model}". Supported models: ${SUPPORTED_MODELS.join(', ')}`);
743
+ process.exit(EXIT_CODES.VALIDATION_ERROR);
744
+ }
745
+ }
727
746
  function readFileIfExists(filePath) {
728
747
  if ((0, external_fs_namespaceObject.existsSync)(filePath)) return (0, external_fs_namespaceObject.readFileSync)(filePath, 'utf-8');
729
748
  }
@@ -928,10 +947,11 @@ superdesign --help
928
947
  return results;
929
948
  }
930
949
  function createCreateDesignDraftCommand() {
931
- const command = new external_commander_namespaceObject.Command('create-design-draft').description('Create a design draft from scratch without any reference, Default dont use this, use iterate-design-draft instead').requiredOption('--project-id <id>', 'Project ID').requiredOption('--title <title>', 'Draft title').requiredOption('-p, --prompt <prompt>', 'Design prompt for AI generation').option('--device <mode>', 'Device mode (mobile, tablet, desktop)', 'desktop').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--json', 'Output in JSON format').action(async (options)=>{
950
+ const command = new external_commander_namespaceObject.Command('create-design-draft').description('Create a design draft from scratch without any reference, Default dont use this, use iterate-design-draft instead').requiredOption('--project-id <id>', 'Project ID').requiredOption('--title <title>', 'Draft title').requiredOption('-p, --prompt <prompt>', 'Design prompt for AI generation').option('--device <mode>', 'Device mode (mobile, tablet, desktop)', 'desktop').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--model <modelId>', 'Model ID to use for generation (e.g. claude-sonnet-4-5)').option('--json', 'Output in JSON format').action(async (options)=>{
932
951
  if (options.json) setJsonMode(true);
933
952
  job_runner_requireAuth(manager_isAuthenticated);
934
953
  validateDeviceMode(options.device);
954
+ validateModel(options.model);
935
955
  const contextFiles = options.contextFile ? readContextFiles(options.contextFile) : void 0;
936
956
  await runJob({
937
957
  startLabel: 'Creating design draft...',
@@ -943,7 +963,8 @@ superdesign --help
943
963
  title: options.title,
944
964
  prompt: options.prompt,
945
965
  deviceMode: options.device,
946
- contextFiles
966
+ contextFiles,
967
+ model: options.model
947
968
  }),
948
969
  transformResult: (job)=>({
949
970
  draftId: job.result.draftId,
@@ -1015,20 +1036,23 @@ Usage Examples:
1015
1036
  superdesign iterate-design-draft --draft-id <id> -p "dark theme" -p "minimal" -p "bold" --mode branch --json
1016
1037
 
1017
1038
  # Iterate: Auto explore (only give exploration direction, and let Superdesign fill in details, e.g. explore different styles; Default do NOT use auto explore mode)
1018
- superdesign iterate-design-draft --draft-id <id> -p "..." --mode branch --count 3 --json`).requiredOption('--draft-id <id>', 'Draft ID to iterate on').requiredOption('-p, --prompt <prompt...>', 'Iteration prompt(s). Use multiple -p for specific prompts per variation.').requiredOption('--mode <mode>', 'Iteration mode (replace or branch)').option('--count <count>', 'Number of variations (1-4). Only used when single prompt provided.').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--json', 'Output in JSON format').addOption(new external_commander_namespaceObject.Option('--project-id <id>').hideHelp()).action(async (options)=>{
1039
+ superdesign iterate-design-draft --draft-id <id> -p "..." --mode branch --count 3 --json`).requiredOption('--draft-id <id>', 'Draft ID to iterate on').requiredOption('-p, --prompt <prompt...>', 'Iteration prompt(s). Use multiple -p for specific prompts per variation.').requiredOption('--mode <mode>', 'Iteration mode (replace or branch)').option('--count <count>', 'Number of variations (1-4). Only used when single prompt provided.').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--model <modelId>', 'Model ID to use for generation (e.g. claude-sonnet-4-5)').option('--json', 'Output in JSON format').addOption(new external_commander_namespaceObject.Option('--project-id <id>').hideHelp()).action(async (options)=>{
1019
1040
  if (options.json) setJsonMode(true);
1020
1041
  job_runner_requireAuth(manager_isAuthenticated);
1042
+ validateModel(options.model);
1021
1043
  const { prompts, count, mode } = validateOptions(options);
1022
1044
  const contextFiles = options.contextFile ? readContextFiles(options.contextFile) : void 0;
1023
1045
  const requestData = prompts.length > 1 ? {
1024
1046
  prompts,
1025
1047
  mode,
1026
- contextFiles
1048
+ contextFiles,
1049
+ model: options.model
1027
1050
  } : {
1028
1051
  prompt: prompts[0],
1029
1052
  count: count,
1030
1053
  mode,
1031
- contextFiles
1054
+ contextFiles,
1055
+ model: options.model
1032
1056
  };
1033
1057
  await runJob({
1034
1058
  startLabel: 'Starting iteration...',
@@ -1099,9 +1123,10 @@ Usage Examples:
1099
1123
  return parsed;
1100
1124
  }
1101
1125
  function createExecuteFlowPagesCommand() {
1102
- const command = new external_commander_namespaceObject.Command('execute-flow-pages').description('Generate flow pages using AI').requiredOption('--draft-id <id>', 'Source draft ID').requiredOption('--pages <json>', 'JSON array of pages to generate [{title, prompt}]').option('--context <context>', 'Additional context for flow generation').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--json', 'Output in JSON format').action(async (options)=>{
1126
+ const command = new external_commander_namespaceObject.Command('execute-flow-pages').description('Generate flow pages using AI').requiredOption('--draft-id <id>', 'Source draft ID').requiredOption('--pages <json>', 'JSON array of pages to generate [{title, prompt}]').option('--context <context>', 'Additional context for flow generation').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--model <modelId>', 'Model ID to use for generation (e.g. claude-sonnet-4-5)').option('--json', 'Output in JSON format').action(async (options)=>{
1103
1127
  if (options.json) setJsonMode(true);
1104
1128
  job_runner_requireAuth(manager_isAuthenticated);
1129
+ validateModel(options.model);
1105
1130
  let pages;
1106
1131
  try {
1107
1132
  pages = parsePages(options.pages);
@@ -1131,7 +1156,8 @@ Usage Examples:
1131
1156
  startJob: ()=>executeFlowPages(options.draftId, {
1132
1157
  flowContext: options.context,
1133
1158
  pages,
1134
- contextFiles
1159
+ contextFiles,
1160
+ model: options.model
1135
1161
  }),
1136
1162
  transformResult: (job)=>({
1137
1163
  drafts: job.result.drafts,
@@ -1446,7 +1472,7 @@ Usage Examples:
1446
1472
  durationMs: opts.durationMs,
1447
1473
  errorCode: opts.errorCode,
1448
1474
  options: opts.options,
1449
- cliVersion: "0.2.1",
1475
+ cliVersion: "0.2.2",
1450
1476
  os: `${external_os_default().platform()} ${external_os_default().release()}`
1451
1477
  };
1452
1478
  const posthog = getPostHog();
@@ -1514,7 +1540,7 @@ Usage Examples:
1514
1540
  }
1515
1541
  function createProgram() {
1516
1542
  const program = new external_commander_namespaceObject.Command();
1517
- program.name('superdesign').description('SuperDesign CLI - AI product designer for coding agents').version("0.2.1");
1543
+ program.name('superdesign').description('SuperDesign CLI - AI product designer for coding agents').version("0.2.2");
1518
1544
  program.configureOutput({
1519
1545
  writeErr: (str)=>{
1520
1546
  if (!process.argv.includes('--json')) process.stderr.write(str);
package/dist/index.js CHANGED
@@ -21,6 +21,19 @@ const EXIT_CODES = {
21
21
  VALIDATION_ERROR: 5,
22
22
  TIMEOUT: 6
23
23
  };
24
+ const SUPPORTED_MODELS = [
25
+ 'gemini-3-flash',
26
+ 'gemini-3-pro',
27
+ 'gemini-3.1-pro',
28
+ 'claude-haiku-4-5',
29
+ 'claude-sonnet-4-5',
30
+ 'claude-opus-4-5',
31
+ 'claude-opus-4-6',
32
+ 'gpt-5.2',
33
+ 'gpt-5.2-thinking',
34
+ 'gpt-5-mini',
35
+ 'kimi-k2.5'
36
+ ];
24
37
  const SKILLS_DIR = '.claude/skills/superdesign';
25
38
  const SKILL_FILE_NAME = 'SKILL.md';
26
39
  function getConfigDir() {
@@ -226,7 +239,7 @@ async function runAuthFlow(options = {}) {
226
239
  try {
227
240
  startSpinner('Creating auth session...');
228
241
  const session = await createSession({
229
- cliVersion: "0.2.1",
242
+ cliVersion: "0.2.2",
230
243
  os: `${platform()} ${release()}`,
231
244
  hostname: hostname()
232
245
  });
@@ -634,6 +647,12 @@ function validateDeviceMode(device) {
634
647
  process.exit(EXIT_CODES.VALIDATION_ERROR);
635
648
  }
636
649
  }
650
+ function validateModel(model) {
651
+ if (model && !SUPPORTED_MODELS.includes(model)) {
652
+ output_error(`Invalid model "${model}". Supported models: ${SUPPORTED_MODELS.join(', ')}`);
653
+ process.exit(EXIT_CODES.VALIDATION_ERROR);
654
+ }
655
+ }
637
656
  function readFileIfExists(filePath) {
638
657
  if (existsSync(filePath)) return readFileSync(filePath, 'utf-8');
639
658
  }
@@ -838,10 +857,11 @@ function readContextFiles(filePaths) {
838
857
  return results;
839
858
  }
840
859
  function createCreateDesignDraftCommand() {
841
- const command = new Command('create-design-draft').description('Create a design draft from scratch without any reference, Default dont use this, use iterate-design-draft instead').requiredOption('--project-id <id>', 'Project ID').requiredOption('--title <title>', 'Draft title').requiredOption('-p, --prompt <prompt>', 'Design prompt for AI generation').option('--device <mode>', 'Device mode (mobile, tablet, desktop)', 'desktop').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--json', 'Output in JSON format').action(async (options)=>{
860
+ const command = new Command('create-design-draft').description('Create a design draft from scratch without any reference, Default dont use this, use iterate-design-draft instead').requiredOption('--project-id <id>', 'Project ID').requiredOption('--title <title>', 'Draft title').requiredOption('-p, --prompt <prompt>', 'Design prompt for AI generation').option('--device <mode>', 'Device mode (mobile, tablet, desktop)', 'desktop').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--model <modelId>', 'Model ID to use for generation (e.g. claude-sonnet-4-5)').option('--json', 'Output in JSON format').action(async (options)=>{
842
861
  if (options.json) setJsonMode(true);
843
862
  job_runner_requireAuth(manager_isAuthenticated);
844
863
  validateDeviceMode(options.device);
864
+ validateModel(options.model);
845
865
  const contextFiles = options.contextFile ? readContextFiles(options.contextFile) : void 0;
846
866
  await runJob({
847
867
  startLabel: 'Creating design draft...',
@@ -853,7 +873,8 @@ function createCreateDesignDraftCommand() {
853
873
  title: options.title,
854
874
  prompt: options.prompt,
855
875
  deviceMode: options.device,
856
- contextFiles
876
+ contextFiles,
877
+ model: options.model
857
878
  }),
858
879
  transformResult: (job)=>({
859
880
  draftId: job.result.draftId,
@@ -925,20 +946,23 @@ Usage Examples:
925
946
  superdesign iterate-design-draft --draft-id <id> -p "dark theme" -p "minimal" -p "bold" --mode branch --json
926
947
 
927
948
  # Iterate: Auto explore (only give exploration direction, and let Superdesign fill in details, e.g. explore different styles; Default do NOT use auto explore mode)
928
- superdesign iterate-design-draft --draft-id <id> -p "..." --mode branch --count 3 --json`).requiredOption('--draft-id <id>', 'Draft ID to iterate on').requiredOption('-p, --prompt <prompt...>', 'Iteration prompt(s). Use multiple -p for specific prompts per variation.').requiredOption('--mode <mode>', 'Iteration mode (replace or branch)').option('--count <count>', 'Number of variations (1-4). Only used when single prompt provided.').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--json', 'Output in JSON format').addOption(new Option('--project-id <id>').hideHelp()).action(async (options)=>{
949
+ superdesign iterate-design-draft --draft-id <id> -p "..." --mode branch --count 3 --json`).requiredOption('--draft-id <id>', 'Draft ID to iterate on').requiredOption('-p, --prompt <prompt...>', 'Iteration prompt(s). Use multiple -p for specific prompts per variation.').requiredOption('--mode <mode>', 'Iteration mode (replace or branch)').option('--count <count>', 'Number of variations (1-4). Only used when single prompt provided.').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--model <modelId>', 'Model ID to use for generation (e.g. claude-sonnet-4-5)').option('--json', 'Output in JSON format').addOption(new Option('--project-id <id>').hideHelp()).action(async (options)=>{
929
950
  if (options.json) setJsonMode(true);
930
951
  job_runner_requireAuth(manager_isAuthenticated);
952
+ validateModel(options.model);
931
953
  const { prompts, count, mode } = validateOptions(options);
932
954
  const contextFiles = options.contextFile ? readContextFiles(options.contextFile) : void 0;
933
955
  const requestData = prompts.length > 1 ? {
934
956
  prompts,
935
957
  mode,
936
- contextFiles
958
+ contextFiles,
959
+ model: options.model
937
960
  } : {
938
961
  prompt: prompts[0],
939
962
  count: count,
940
963
  mode,
941
- contextFiles
964
+ contextFiles,
965
+ model: options.model
942
966
  };
943
967
  await runJob({
944
968
  startLabel: 'Starting iteration...',
@@ -1009,9 +1033,10 @@ function parsePages(pagesJson) {
1009
1033
  return parsed;
1010
1034
  }
1011
1035
  function createExecuteFlowPagesCommand() {
1012
- const command = new Command('execute-flow-pages').description('Generate flow pages using AI').requiredOption('--draft-id <id>', 'Source draft ID').requiredOption('--pages <json>', 'JSON array of pages to generate [{title, prompt}]').option('--context <context>', 'Additional context for flow generation').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--json', 'Output in JSON format').action(async (options)=>{
1036
+ const command = new Command('execute-flow-pages').description('Generate flow pages using AI').requiredOption('--draft-id <id>', 'Source draft ID').requiredOption('--pages <json>', 'JSON array of pages to generate [{title, prompt}]').option('--context <context>', 'Additional context for flow generation').option('--context-file <paths...>', 'UI source files to include as context for AI generation').option('--model <modelId>', 'Model ID to use for generation (e.g. claude-sonnet-4-5)').option('--json', 'Output in JSON format').action(async (options)=>{
1013
1037
  if (options.json) setJsonMode(true);
1014
1038
  job_runner_requireAuth(manager_isAuthenticated);
1039
+ validateModel(options.model);
1015
1040
  let pages;
1016
1041
  try {
1017
1042
  pages = parsePages(options.pages);
@@ -1041,7 +1066,8 @@ function createExecuteFlowPagesCommand() {
1041
1066
  startJob: ()=>executeFlowPages(options.draftId, {
1042
1067
  flowContext: options.context,
1043
1068
  pages,
1044
- contextFiles
1069
+ contextFiles,
1070
+ model: options.model
1045
1071
  }),
1046
1072
  transformResult: (job)=>({
1047
1073
  drafts: job.result.drafts,
@@ -1354,7 +1380,7 @@ async function trackCommand(opts) {
1354
1380
  durationMs: opts.durationMs,
1355
1381
  errorCode: opts.errorCode,
1356
1382
  options: opts.options,
1357
- cliVersion: "0.2.1",
1383
+ cliVersion: "0.2.2",
1358
1384
  os: `${os.platform()} ${os.release()}`
1359
1385
  };
1360
1386
  const posthog = getPostHog();
@@ -1422,7 +1448,7 @@ function findFailedCommand(program) {
1422
1448
  }
1423
1449
  function createProgram() {
1424
1450
  const program = new Command();
1425
- program.name('superdesign').description('SuperDesign CLI - AI product designer for coding agents').version("0.2.1");
1451
+ program.name('superdesign').description('SuperDesign CLI - AI product designer for coding agents').version("0.2.2");
1426
1452
  program.configureOutput({
1427
1453
  writeErr: (str)=>{
1428
1454
  if (!process.argv.includes('--json')) process.stderr.write(str);
@@ -51,3 +51,7 @@ export type DeviceMode = (typeof VALID_DEVICES)[number];
51
51
  * Validate device mode option and exit with error if invalid
52
52
  */
53
53
  export declare function validateDeviceMode(device: string | undefined): void;
54
+ /**
55
+ * Validate model option and exit with error if invalid
56
+ */
57
+ export declare function validateModel(model: string | undefined): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superdesign/cli",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "CLI for SuperDesign Platform - agent skills for Claude Code",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",