@shadsapp/cli 0.1.4 → 2.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.
- package/README.md +44 -50
- package/dist/api.d.ts +74 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +169 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.js +60 -29
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.d.ts +5 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +32 -38
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/install.d.ts +8 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +74 -14
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +25 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +6 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/migrate-icons.js +1 -1
- package/dist/commands/migrate-icons.js.map +1 -1
- package/dist/commands/themes.d.ts +1 -1
- package/dist/commands/themes.d.ts.map +1 -1
- package/dist/commands/themes.js +20 -16
- package/dist/commands/themes.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +5 -6
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +10 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/credentials.d.ts +10 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +45 -0
- package/dist/credentials.js.map +1 -0
- package/dist/data/icon-map.json +4 -0
- package/package.json +8 -5
package/README.md
CHANGED
|
@@ -1,82 +1,76 @@
|
|
|
1
1
|
# @shadsapp/cli
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
#
|
|
23
|
-
shads
|
|
24
|
-
shads
|
|
25
|
-
shads
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
shads
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
shads
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
32
|
+
Three catalog themes are tagged `(free)` and install without an account or
|
|
33
|
+
activation: Modern · Claret (`system-modern-default-theme`), Swiss Grid ·
|
|
34
|
+
Original (`system-swiss-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
|
-
|
|
41
|
+
## Login and CI
|
|
50
42
|
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
59
|
+
## Project creation and installs
|
|
70
60
|
|
|
71
|
-
|
|
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
|
-
|
|
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) —
|
|
78
|
-
- [`@shadsapp/schema`](https://www.npmjs.com/package/@shadsapp/schema) —
|
|
79
|
-
- [Remote MCP server](https://mcp.shads.app) — `https://mcp.shads.app`
|
|
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. Save it in shads.app first.", status, code);
|
|
49
|
+
}
|
|
50
|
+
if (status === 404) {
|
|
51
|
+
return new ShadsApiError(code === "source_not_found"
|
|
52
|
+
? "Theme not found in the catalog. Save it in shads.app first."
|
|
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
|
package/dist/api.js.map
ADDED
|
@@ -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,42 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { THEME_SCHEMA_ID } from "@shadsapp/schema";
|
|
3
3
|
import { runCreate } from "./commands/create.js";
|
|
4
4
|
import { runInstall } from "./commands/install.js";
|
|
5
|
+
import { runLogin } from "./commands/login.js";
|
|
6
|
+
import { runLogout } from "./commands/logout.js";
|
|
5
7
|
import { runMigrateIcons } from "./commands/migrate-icons.js";
|
|
6
8
|
import { runThemesImport, runThemesList } from "./commands/themes.js";
|
|
7
9
|
import { runValidate } from "./commands/validate.js";
|
|
10
|
+
import { runWhoami } from "./commands/whoami.js";
|
|
8
11
|
function printHelp() {
|
|
9
|
-
console.log(`shads — theme tooling for shadcn/ui projects
|
|
12
|
+
console.log(`shads — design-system theme tooling for shadcn/ui projects
|
|
10
13
|
|
|
11
14
|
Usage:
|
|
12
|
-
shads
|
|
13
|
-
shads
|
|
14
|
-
shads install
|
|
15
|
-
shads
|
|
16
|
-
shads
|
|
17
|
-
shads
|
|
15
|
+
shads install <theme> [--yes] Install a catalog theme
|
|
16
|
+
shads install <registry-url> Add a shadcn registry item
|
|
17
|
+
shads install <file.css> Install a local CSS file
|
|
18
|
+
shads create <name> [-t <theme>] [--template next] [--yes]
|
|
19
|
+
shads create <name> --preset <url> [--yes]
|
|
20
|
+
shads themes [list] List themes grouped by design system
|
|
21
|
+
shads themes import <theme> Install a catalog theme into the current project
|
|
22
|
+
shads login [--key <key>] Save and validate your API key
|
|
23
|
+
shads logout Remove saved credentials
|
|
24
|
+
shads whoami Show your plan and activation usage
|
|
25
|
+
shads validate <file> Validate a Theme v1 JSON document
|
|
18
26
|
shads migrate icons --from <pack> --to <pack> [--yes]
|
|
19
|
-
shads schema Print the active
|
|
27
|
+
shads schema Print the active Theme v1 schema id
|
|
20
28
|
|
|
21
29
|
Examples:
|
|
22
|
-
npx @shadsapp/cli
|
|
23
|
-
npx @shadsapp/cli
|
|
24
|
-
npx @shadsapp/cli create my-app
|
|
25
|
-
npx @shadsapp/cli
|
|
26
|
-
npx @shadsapp/cli
|
|
30
|
+
npx @shadsapp/cli install system-modern-default-theme
|
|
31
|
+
npx @shadsapp/cli install system-modern-terminal-theme
|
|
32
|
+
npx @shadsapp/cli create my-app -t system-modern-terminal-theme
|
|
33
|
+
npx @shadsapp/cli themes
|
|
34
|
+
npx @shadsapp/cli login
|
|
27
35
|
npx @shadsapp/cli validate theme.json
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
Free-tagged themes install without an account. Other themes require an API key;
|
|
38
|
+
run \`shads login\` or set SHADS_API_KEY for CI.
|
|
39
|
+
Create an API key at https://shads.app in Account settings.
|
|
30
40
|
`);
|
|
31
41
|
}
|
|
32
42
|
async function main() {
|
|
@@ -36,7 +46,7 @@ async function main() {
|
|
|
36
46
|
return;
|
|
37
47
|
}
|
|
38
48
|
if (command === "schema") {
|
|
39
|
-
console.log(
|
|
49
|
+
console.log(THEME_SCHEMA_ID);
|
|
40
50
|
return;
|
|
41
51
|
}
|
|
42
52
|
if (command === "validate") {
|
|
@@ -63,21 +73,23 @@ async function main() {
|
|
|
63
73
|
return;
|
|
64
74
|
}
|
|
65
75
|
if (command === "install") {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
76
|
+
const tokens = [subcommand, ...rest].filter((token) => typeof token === "string");
|
|
77
|
+
let theme = "system-modern-default-theme";
|
|
78
|
+
let yes = false;
|
|
79
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
80
|
+
const token = tokens[index];
|
|
69
81
|
if (token === "-t" || token === "--theme") {
|
|
70
|
-
|
|
82
|
+
theme = tokens[index + 1] ?? theme;
|
|
71
83
|
index += 1;
|
|
72
84
|
}
|
|
85
|
+
else if (token === "--yes" || token === "-y") {
|
|
86
|
+
yes = true;
|
|
87
|
+
}
|
|
88
|
+
else if (token && !token.startsWith("-")) {
|
|
89
|
+
theme = token;
|
|
90
|
+
}
|
|
73
91
|
}
|
|
74
|
-
|
|
75
|
-
themeId = rest[0] ?? themeId;
|
|
76
|
-
}
|
|
77
|
-
else if (subcommand && !subcommand.startsWith("-")) {
|
|
78
|
-
themeId = subcommand;
|
|
79
|
-
}
|
|
80
|
-
await runInstall(themeId);
|
|
92
|
+
await runInstall(theme, "Installed", { yes });
|
|
81
93
|
return;
|
|
82
94
|
}
|
|
83
95
|
if (command === "themes") {
|
|
@@ -86,16 +98,35 @@ async function main() {
|
|
|
86
98
|
return;
|
|
87
99
|
}
|
|
88
100
|
if (subcommand === "import") {
|
|
89
|
-
|
|
101
|
+
let themeId;
|
|
102
|
+
let yes = false;
|
|
103
|
+
for (const token of rest) {
|
|
104
|
+
if (token === "--yes" || token === "-y")
|
|
105
|
+
yes = true;
|
|
106
|
+
else if (!token.startsWith("-"))
|
|
107
|
+
themeId = token;
|
|
108
|
+
}
|
|
90
109
|
if (!themeId) {
|
|
91
110
|
console.error("Missing theme id. Usage: shads themes import <theme>");
|
|
92
111
|
process.exitCode = 1;
|
|
93
112
|
return;
|
|
94
113
|
}
|
|
95
|
-
await runThemesImport(themeId);
|
|
114
|
+
await runThemesImport(themeId, yes);
|
|
96
115
|
return;
|
|
97
116
|
}
|
|
98
117
|
}
|
|
118
|
+
if (command === "login") {
|
|
119
|
+
await runLogin([subcommand, ...rest].filter((token) => typeof token === "string"));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (command === "logout") {
|
|
123
|
+
runLogout();
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (command === "whoami") {
|
|
127
|
+
await runWhoami();
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
99
130
|
console.error(`Unknown command: ${command}`);
|
|
100
131
|
printHelp();
|
|
101
132
|
process.exitCode = 1;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,
|
|
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
|
|
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":"
|
|
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,CAYV;AAYD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B7D"}
|