@shadsapp/cli 0.1.4 → 2.0.1

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 (42) hide show
  1. package/README.md +44 -50
  2. package/dist/api.d.ts +74 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +169 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/cli.js +67 -29
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/create.d.ts +5 -1
  9. package/dist/commands/create.d.ts.map +1 -1
  10. package/dist/commands/create.js +33 -38
  11. package/dist/commands/create.js.map +1 -1
  12. package/dist/commands/install.d.ts +10 -1
  13. package/dist/commands/install.d.ts.map +1 -1
  14. package/dist/commands/install.js +77 -14
  15. package/dist/commands/install.js.map +1 -1
  16. package/dist/commands/login.d.ts +2 -0
  17. package/dist/commands/login.d.ts.map +1 -0
  18. package/dist/commands/login.js +25 -0
  19. package/dist/commands/login.js.map +1 -0
  20. package/dist/commands/logout.d.ts +2 -0
  21. package/dist/commands/logout.d.ts.map +1 -0
  22. package/dist/commands/logout.js +6 -0
  23. package/dist/commands/logout.js.map +1 -0
  24. package/dist/commands/migrate-icons.js +1 -1
  25. package/dist/commands/migrate-icons.js.map +1 -1
  26. package/dist/commands/themes.d.ts +1 -1
  27. package/dist/commands/themes.d.ts.map +1 -1
  28. package/dist/commands/themes.js +20 -16
  29. package/dist/commands/themes.js.map +1 -1
  30. package/dist/commands/validate.d.ts.map +1 -1
  31. package/dist/commands/validate.js +5 -6
  32. package/dist/commands/validate.js.map +1 -1
  33. package/dist/commands/whoami.d.ts +2 -0
  34. package/dist/commands/whoami.d.ts.map +1 -0
  35. package/dist/commands/whoami.js +10 -0
  36. package/dist/commands/whoami.js.map +1 -0
  37. package/dist/credentials.d.ts +10 -0
  38. package/dist/credentials.d.ts.map +1 -0
  39. package/dist/credentials.js +45 -0
  40. package/dist/credentials.js.map +1 -0
  41. package/dist/data/icon-map.json +4 -0
  42. package/package.json +8 -5
package/README.md CHANGED
@@ -1,82 +1,76 @@
1
1
  # @shadsapp/cli
2
2
 
3
- CLI for creating shadcn/ui apps from [shads.app](https://shads.app) themes, and for installing those themes into existing projects.
3
+ Install shads.app themes into shadcn projects with `shads`.
4
4
 
5
5
  ## Install
6
6
 
7
7
  ```bash
8
8
  npm install -g @shadsapp/cli
9
- ```
10
-
11
- Or run without installing:
12
-
13
- ```bash
9
+ # or
14
10
  npx @shadsapp/cli --help
15
11
  ```
16
12
 
17
- The binary name is **`shads`**.
18
-
19
13
  ## Commands
20
14
 
21
15
  ```bash
22
- # Create a new app (runs the official shadcn CLI)
23
- shads create my-app -t workspace
24
- shads create my-app --template vite -t terminal
25
- shads create my-app --preset https://shads.app/r/workspace-theme.json
26
-
27
- # Install theme files into the current project
28
- shads install -t workspace
29
-
30
- # List public starter themes
31
- shads themes list
32
-
33
- # Import a theme (theme.json + theme.css)
34
- shads themes import workspace
35
-
36
- # Validate a theme document
16
+ shads themes # list catalog themes, grouped by system
17
+ shads install system-modern-default-theme
18
+ shads install system-modern-terminal-theme --yes
19
+ shads install https://registry.example/item.json
20
+ shads install ./theme.css
21
+ shads create my-app -t system-modern-terminal-theme
22
+ shads create my-app --preset https://registry.example/item.json
23
+ shads themes import system-modern-terminal-theme
24
+ shads login [--key <key>]
25
+ shads whoami
26
+ shads logout
37
27
  shads validate theme.json
38
-
39
- # Print active schema id
40
28
  shads schema
29
+ shads migrate icons --from lucide --to tabler
41
30
  ```
42
31
 
43
- `create` is a thin wrapper around `npx shadcn@latest create --preset <url>`. It does not replace the shadcn CLI.
44
-
45
- ## What gets written
46
-
47
- `create` scaffolds a shadcn app, then applies the theme (tokens, fonts, and adapters).
32
+ Three catalog themes are tagged `(free)` and install without an account or
33
+ activation: Modern · Claret (`system-modern-default-theme`), Kids' Sketchbook ·
34
+ Original (`system-kids-sketchbook-original-theme`), and Neobrutalism · Original
35
+ (`system-neobrutalism-original-theme`). Other catalog installs are saved to
36
+ your shads.app library. A Free account has three lifetime activations; the
37
+ first registry fetch activates a theme, which can then be installed any number
38
+ of times. The CLI asks for confirmation before using your final activation;
39
+ `--yes` / `-y` skips that prompt. Activated themes are not re-counted.
48
40
 
49
- `install` writes:
41
+ ## Login and CI
50
42
 
51
- - `theme.json`
52
- - `src/styles/theme.css`
53
-
54
- Import the CSS in your app entry (e.g. `main.tsx` or `layout.tsx`).
55
-
56
- ## Examples
43
+ Create a free account at https://shads.app, copy the API key from Account
44
+ settings, then run:
57
45
 
58
46
  ```bash
59
- npx @shadsapp/cli create my-app -t workspace
60
- npx @shadsapp/cli install -t workspace
61
- npx @shadsapp/cli themes import terminal
62
- npx @shadsapp/cli validate ./theme.json
47
+ shads login
48
+ # or pass it directly
49
+ shads login --key shads_live_...
50
+ shads whoami
51
+ shads logout
63
52
  ```
64
53
 
65
- ## For AI agents
66
-
67
- Connect directly to the remote HTTP MCP server at `https://mcp.shads.app` (zero local install required). Full docs: https://shads.app/docs/mcp
54
+ Credentials are stored in `${XDG_CONFIG_HOME:-~/.config}/shads/credentials.json`
55
+ with directory mode `0700` and file mode `0600`. For CI, set `SHADS_API_KEY`;
56
+ it takes precedence over saved credentials. Set `SHADS_ORIGIN` to use a
57
+ self-hosted or local API origin.
68
58
 
69
- If you only have a shell, `shads themes list`, `shads themes import <id>`, and `shads create` are the install path. Full docs: https://shads.app/docs/cli
59
+ ## Project creation and installs
70
60
 
71
- ## Customize themes
61
+ `shads create` delegates to `npx shadcn@latest create --preset …`. A catalog
62
+ preset uses the public registry URL for Free themes and the authenticated
63
+ library registry URL for other themes. Explicit third-party registry URLs are
64
+ passed through unchanged. `shads install <registry-url>` likewise delegates to
65
+ `npx shadcn@latest add <url>`. Local `.css` paths copy only that stylesheet.
72
66
 
73
- Edit visually at [shads.app](https://shads.app), then export a create or add command from the builder.
67
+ Run `shads themes` to browse the complete 122-theme metadata catalog.
74
68
 
75
69
  ## Related packages
76
70
 
77
- - [`@shadsapp/themes`](https://www.npmjs.com/package/@shadsapp/themes) — theme bundles
78
- - [`@shadsapp/schema`](https://www.npmjs.com/package/@shadsapp/schema) — `theme.json` spec
79
- - [Remote MCP server](https://mcp.shads.app) — `https://mcp.shads.app` for AI agents
71
+ - [`@shadsapp/themes`](https://www.npmjs.com/package/@shadsapp/themes) — metadata-only catalog
72
+ - [`@shadsapp/schema`](https://www.npmjs.com/package/@shadsapp/schema) — ThemeV1 schema and validation
73
+ - [Remote MCP server](https://mcp.shads.app) — `https://mcp.shads.app`
80
74
 
81
75
  ## License
82
76
 
package/dist/api.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ import { type PublicThemeMeta } from "@shadsapp/themes";
2
+ export declare const MISSING_KEY_INSTRUCTIONS = "Create a free account at https://shads.app, copy your API key from Account settings, then run `shads login`.";
3
+ export type ActivationState = {
4
+ status: "activated";
5
+ } | {
6
+ status: "available";
7
+ used: number;
8
+ limit: number | null;
9
+ isLast: boolean;
10
+ } | {
11
+ status: "blocked";
12
+ used: number;
13
+ limit: number;
14
+ activated: Array<{
15
+ id: string;
16
+ name: string;
17
+ }>;
18
+ };
19
+ export interface InstallInfo {
20
+ state: ActivationState;
21
+ itemName: string;
22
+ commands: {
23
+ registryUrl: string;
24
+ };
25
+ }
26
+ export interface ApiStatus {
27
+ plan?: string;
28
+ entitlements?: {
29
+ plan?: string;
30
+ limits?: {
31
+ activations?: number | null;
32
+ };
33
+ usage?: {
34
+ activations?: number;
35
+ };
36
+ };
37
+ }
38
+ export interface CatalogInstallResolution {
39
+ meta: PublicThemeMeta;
40
+ registryUrl: string;
41
+ state?: ActivationState;
42
+ }
43
+ export declare class ShadsApiError extends Error {
44
+ readonly status?: number | undefined;
45
+ readonly code?: string | undefined;
46
+ constructor(message: string, status?: number | undefined, code?: string | undefined);
47
+ }
48
+ export declare function getOrigin(): string;
49
+ export declare function getApiKey(): string | null;
50
+ export declare function activationLimitMessage(state: Extract<ActivationState, {
51
+ status: "blocked";
52
+ }>): string;
53
+ export declare function apiRequest<T>(path: string, options?: {
54
+ key?: string;
55
+ origin?: string;
56
+ method?: string;
57
+ body?: unknown;
58
+ }): Promise<T>;
59
+ export declare function validateApiKey(key: string, origin?: string): Promise<ApiStatus>;
60
+ export declare function promptForApiKey(): Promise<string>;
61
+ export declare function confirmLastActivation(state: Extract<ActivationState, {
62
+ status: "available";
63
+ }>, yes?: boolean): Promise<boolean>;
64
+ export declare function resolveCatalogInstall(themeId: string, options?: {
65
+ yes?: boolean;
66
+ confirm?: typeof confirmLastActivation;
67
+ }): Promise<CatalogInstallResolution>;
68
+ export declare function resolveRegistryPreset(presetUrl: string, options?: {
69
+ yes?: boolean;
70
+ confirm?: typeof confirmLastActivation;
71
+ }): Promise<CatalogInstallResolution | {
72
+ registryUrl: string;
73
+ }>;
74
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/api.js ADDED
@@ -0,0 +1,169 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin, stdout } from "node:process";
3
+ import { getThemeMeta } from "@shadsapp/themes";
4
+ import { readCredentials } from "./credentials.js";
5
+ const DEFAULT_ORIGIN = "https://shads.app";
6
+ export const MISSING_KEY_INSTRUCTIONS = "Create a free account at https://shads.app, copy your API key from Account settings, then run `shads login`.";
7
+ export class ShadsApiError extends Error {
8
+ status;
9
+ code;
10
+ constructor(message, status, code) {
11
+ super(message);
12
+ this.status = status;
13
+ this.code = code;
14
+ this.name = "ShadsApiError";
15
+ }
16
+ }
17
+ export function getOrigin() {
18
+ const storedOrigin = readCredentials()?.origin;
19
+ return (process.env.SHADS_ORIGIN || storedOrigin || DEFAULT_ORIGIN).replace(/\/$/, "");
20
+ }
21
+ export function getApiKey() {
22
+ const envKey = process.env.SHADS_API_KEY?.trim();
23
+ return envKey || readCredentials()?.key || null;
24
+ }
25
+ export function activationLimitMessage(state) {
26
+ const lines = [`Activation limit reached (${state.used} of ${state.limit} activated).`];
27
+ if (state.activated.length > 0) {
28
+ lines.push("Activated themes:", ...state.activated.map((theme) => ` - ${theme.name}`));
29
+ }
30
+ lines.push("Upgrade: https://shads.app/pricing");
31
+ return lines.join("\n");
32
+ }
33
+ function errorMessage(status, body) {
34
+ const code = typeof body.code === "string" ? body.code : undefined;
35
+ const detail = typeof body.message === "string"
36
+ ? body.message
37
+ : typeof body.error === "string"
38
+ ? body.error
39
+ : "";
40
+ if (status === 401) {
41
+ return new ShadsApiError(`API key is missing or invalid. ${MISSING_KEY_INSTRUCTIONS}`, status, code);
42
+ }
43
+ if (status === 402) {
44
+ const message = detail || "Activation limit reached.";
45
+ return new ShadsApiError(message.includes("https://shads.app/pricing") ? message : `${message}\nUpgrade: https://shads.app/pricing`, status, code);
46
+ }
47
+ if (status === 403) {
48
+ return new ShadsApiError("This theme is not available from this link. Open Get theme on shads.app to create a fresh install link.", status, code);
49
+ }
50
+ if (status === 404) {
51
+ return new ShadsApiError(code === "source_not_found"
52
+ ? "Theme not found in the catalog or shares. Open Get theme on shads.app to create an install link."
53
+ : detail || "Theme not found.", status, code);
54
+ }
55
+ return new ShadsApiError(detail || `shads.app request failed (${status}).`, status, code);
56
+ }
57
+ export async function apiRequest(path, options = {}) {
58
+ const key = options.key ?? getApiKey();
59
+ if (!key)
60
+ throw new ShadsApiError(`API key required. ${MISSING_KEY_INSTRUCTIONS}`);
61
+ const origin = (options.origin ?? getOrigin()).replace(/\/$/, "");
62
+ let response;
63
+ try {
64
+ response = await fetch(`${origin}${path}`, {
65
+ method: options.method ?? "GET",
66
+ headers: {
67
+ Authorization: `Bearer ${key}`,
68
+ ...(options.body === undefined ? {} : { "Content-Type": "application/json" }),
69
+ },
70
+ ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),
71
+ });
72
+ }
73
+ catch (error) {
74
+ throw new ShadsApiError(`Could not connect to shads.app: ${error instanceof Error ? error.message : String(error)}`);
75
+ }
76
+ const body = await response.json().catch(() => ({}));
77
+ if (!response.ok) {
78
+ const record = body && typeof body === "object" ? body : {};
79
+ throw errorMessage(response.status, record);
80
+ }
81
+ return body;
82
+ }
83
+ export async function validateApiKey(key, origin = getOrigin()) {
84
+ return apiRequest("/api/mcp/status", { key, origin });
85
+ }
86
+ export async function promptForApiKey() {
87
+ if (!stdin.isTTY) {
88
+ const chunks = [];
89
+ for await (const chunk of stdin)
90
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
91
+ return Buffer.concat(chunks).toString("utf8").trim();
92
+ }
93
+ const readline = createInterface({ input: stdin, output: stdout, terminal: true });
94
+ readline._writeToOutput = () => { };
95
+ stdout.write("API key: ");
96
+ try {
97
+ return (await readline.question("")).trim();
98
+ }
99
+ finally {
100
+ readline.close();
101
+ }
102
+ }
103
+ export async function confirmLastActivation(state, yes = false) {
104
+ const message = `This install uses your final free activation (${state.used + 1} of ${state.limit ?? "unlimited"}). Activated themes install any number of times.`;
105
+ if (yes) {
106
+ console.log(message);
107
+ return true;
108
+ }
109
+ if (!stdin.isTTY)
110
+ throw new Error(message);
111
+ const readline = createInterface({ input: stdin, output: stdout });
112
+ try {
113
+ console.log(message);
114
+ const answer = await readline.question("Continue? [y/N] ");
115
+ return answer.trim().toLowerCase() === "y" || answer.trim().toLowerCase() === "yes";
116
+ }
117
+ finally {
118
+ readline.close();
119
+ }
120
+ }
121
+ export async function resolveCatalogInstall(themeId, options = {}) {
122
+ const meta = getThemeMeta(themeId);
123
+ const origin = getOrigin();
124
+ if (meta.free) {
125
+ return { meta, registryUrl: `${origin}/r/${meta.itemName}.json` };
126
+ }
127
+ const created = await apiRequest("/api/library", {
128
+ method: "POST",
129
+ body: { source: { kind: "catalog", id: meta.itemName } },
130
+ });
131
+ const install = await apiRequest(`/api/themes/${encodeURIComponent(created.theme.id)}/install`);
132
+ const state = install.state;
133
+ if (state.status === "blocked")
134
+ throw new ShadsApiError(activationLimitMessage(state), 402, "activation_limit");
135
+ if (state.status === "available" && state.isLast) {
136
+ const confirm = options.confirm ?? confirmLastActivation;
137
+ if (!(await confirm(state, options.yes))) {
138
+ throw new ShadsApiError("Installation cancelled.");
139
+ }
140
+ }
141
+ return { meta, registryUrl: install.commands.registryUrl, state };
142
+ }
143
+ export async function resolveRegistryPreset(presetUrl, options = {}) {
144
+ let url;
145
+ try {
146
+ url = new URL(presetUrl);
147
+ }
148
+ catch {
149
+ return { registryUrl: presetUrl };
150
+ }
151
+ const match = url.pathname.match(/^\/r\/([^/]+)\.json$/);
152
+ if (!match)
153
+ return { registryUrl: presetUrl };
154
+ let itemName;
155
+ try {
156
+ itemName = decodeURIComponent(match[1]);
157
+ }
158
+ catch {
159
+ return { registryUrl: presetUrl };
160
+ }
161
+ try {
162
+ getThemeMeta(itemName);
163
+ }
164
+ catch {
165
+ return { registryUrl: presetUrl };
166
+ }
167
+ return resolveCatalogInstall(itemName, options);
168
+ }
169
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1,32 +1,45 @@
1
1
  #!/usr/bin/env node
2
- import { THEME_SCHEMA } from "@shadsapp/schema";
2
+ import { createRequire } from "node:module";
3
+ import { THEME_SCHEMA_ID } from "@shadsapp/schema";
4
+ const cliVersion = createRequire(import.meta.url)("../package.json").version;
3
5
  import { runCreate } from "./commands/create.js";
4
6
  import { runInstall } from "./commands/install.js";
7
+ import { runLogin } from "./commands/login.js";
8
+ import { runLogout } from "./commands/logout.js";
5
9
  import { runMigrateIcons } from "./commands/migrate-icons.js";
6
10
  import { runThemesImport, runThemesList } from "./commands/themes.js";
7
11
  import { runValidate } from "./commands/validate.js";
12
+ import { runWhoami } from "./commands/whoami.js";
8
13
  function printHelp() {
9
- console.log(`shads — theme tooling for shadcn/ui projects
14
+ console.log(`shads — design-system theme tooling for shadcn/ui projects
10
15
 
11
16
  Usage:
12
- shads create <name> [-t <theme>] [--template next]
13
- shads create <name> --preset <url>
14
- shads install -t <theme> Install theme files into the current project
15
- shads themes list List public starter themes
16
- shads themes import <theme> Import a public theme into the current project
17
- shads validate <file> Validate a theme.json document
17
+ shads install <theme> [--yes] Install a catalog theme
18
+ shads install <registry-url> Add a shadcn registry item
19
+ shads install <file.css> Install a local CSS file
20
+ shads create <name> [-t <theme>] [--template next] [--yes]
21
+ shads create <name> --preset <url> [--yes]
22
+ shads themes [list] List themes grouped by design system
23
+ shads themes import <theme> Install a catalog theme into the current project
24
+ shads login [--key <key>] Save and validate your API key
25
+ shads logout Remove saved credentials
26
+ shads whoami Show your plan and activation usage
27
+ shads validate <file> Validate a Theme v1 JSON document
18
28
  shads migrate icons --from <pack> --to <pack> [--yes]
19
- shads schema Print the active theme document schema id
29
+ shads schema Print the active Theme v1 schema id
20
30
 
21
31
  Examples:
22
- npx @shadsapp/cli create my-app -t workspace
23
- npx @shadsapp/cli create my-app --template vite -t terminal
24
- npx @shadsapp/cli create my-app --preset https://shads.app/r/workspace-theme.json
25
- npx @shadsapp/cli install -t workspace
26
- npx @shadsapp/cli themes import workspace
32
+ npx @shadsapp/cli install system-modern-default-theme
33
+ npx @shadsapp/cli install system-modern-terminal-theme
34
+ npx @shadsapp/cli create my-app -t system-modern-terminal-theme
35
+ npx @shadsapp/cli themes
36
+ npx @shadsapp/cli login
27
37
  npx @shadsapp/cli validate theme.json
28
38
 
29
- create runs the official shadcn CLI (npx shadcn@latest create --preset …).
39
+ Free-tagged themes install without an account. Other themes require an API key;
40
+ run \`shads login\` or set SHADS_API_KEY for CI. MCP Get theme install links are
41
+ private 24-hour snapshots and do not save themes to your library.
42
+ Create an API key at https://shads.app in Account settings.
30
43
  `);
31
44
  }
32
45
  async function main() {
@@ -35,8 +48,12 @@ async function main() {
35
48
  printHelp();
36
49
  return;
37
50
  }
51
+ if (command === "--version" || command === "-V" || command === "-v") {
52
+ console.log(cliVersion);
53
+ return;
54
+ }
38
55
  if (command === "schema") {
39
- console.log(THEME_SCHEMA);
56
+ console.log(THEME_SCHEMA_ID);
40
57
  return;
41
58
  }
42
59
  if (command === "validate") {
@@ -63,21 +80,23 @@ async function main() {
63
80
  return;
64
81
  }
65
82
  if (command === "install") {
66
- let themeId = "workspace";
67
- for (let index = 0; index < rest.length; index += 1) {
68
- const token = rest[index];
83
+ const tokens = [subcommand, ...rest].filter((token) => typeof token === "string");
84
+ let theme = "system-modern-default-theme";
85
+ let yes = false;
86
+ for (let index = 0; index < tokens.length; index += 1) {
87
+ const token = tokens[index];
69
88
  if (token === "-t" || token === "--theme") {
70
- themeId = rest[index + 1] ?? themeId;
89
+ theme = tokens[index + 1] ?? theme;
71
90
  index += 1;
72
91
  }
92
+ else if (token === "--yes" || token === "-y") {
93
+ yes = true;
94
+ }
95
+ else if (token && !token.startsWith("-")) {
96
+ theme = token;
97
+ }
73
98
  }
74
- if (subcommand === "-t" || subcommand === "--theme") {
75
- themeId = rest[0] ?? themeId;
76
- }
77
- else if (subcommand && !subcommand.startsWith("-")) {
78
- themeId = subcommand;
79
- }
80
- await runInstall(themeId);
99
+ await runInstall(theme, "Installed", { yes });
81
100
  return;
82
101
  }
83
102
  if (command === "themes") {
@@ -86,16 +105,35 @@ async function main() {
86
105
  return;
87
106
  }
88
107
  if (subcommand === "import") {
89
- const themeId = rest[0];
108
+ let themeId;
109
+ let yes = false;
110
+ for (const token of rest) {
111
+ if (token === "--yes" || token === "-y")
112
+ yes = true;
113
+ else if (!token.startsWith("-"))
114
+ themeId = token;
115
+ }
90
116
  if (!themeId) {
91
117
  console.error("Missing theme id. Usage: shads themes import <theme>");
92
118
  process.exitCode = 1;
93
119
  return;
94
120
  }
95
- await runThemesImport(themeId);
121
+ await runThemesImport(themeId, yes);
96
122
  return;
97
123
  }
98
124
  }
125
+ if (command === "login") {
126
+ await runLogin([subcommand, ...rest].filter((token) => typeof token === "string"));
127
+ return;
128
+ }
129
+ if (command === "logout") {
130
+ runLogout();
131
+ return;
132
+ }
133
+ if (command === "whoami") {
134
+ await runWhoami();
135
+ return;
136
+ }
99
137
  console.error(`Unknown command: ${command}`);
100
138
  printHelp();
101
139
  process.exitCode = 1;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,19 @@
1
+ import { type CatalogInstallResolution } from "../api.js";
1
2
  export type ParsedCreateArgs = {
2
3
  name: string;
3
4
  themeId: string;
4
5
  presetUrl: string | null;
5
6
  template: string;
6
7
  passthrough: string[];
8
+ yes: boolean;
7
9
  };
8
10
  type ParseCreateResult = ParsedCreateArgs | {
9
11
  error: string;
10
12
  };
11
13
  export declare function parseCreateArgs(argv: string[]): ParseCreateResult;
12
- export declare function resolveCreatePresetUrl(args: ParsedCreateArgs, origin?: string): string;
14
+ export declare function resolveCreatePreset(args: ParsedCreateArgs): Promise<CatalogInstallResolution | {
15
+ registryUrl: string;
16
+ }>;
13
17
  export declare function buildShadcnCreateArgv(args: ParsedCreateArgs, presetUrl: string): string[];
14
18
  export declare function runCreate(argv: string[]): Promise<void>;
15
19
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAED,KAAK,iBAAiB,GAAG,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAkB7D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAiGjE;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,EACtB,MAAM,SAA+D,GACpE,MAAM,CAKR;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAYV;AAMD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B7D"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,WAAW,CAAA;AAalB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,GAAG,EAAE,OAAO,CAAA;CACb,CAAA;AAED,KAAK,iBAAiB,GAAG,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAc7D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAqGjE;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,wBAAwB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAK7D;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAaV;AAYD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B7D"}