@astablebridge/cli 0.1.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.
@@ -0,0 +1,46 @@
1
+ import type { OutputFormat } from "../output/format.js";
2
+ export declare function runAuth(key: string | undefined, format: OutputFormat): Promise<void>;
3
+ export declare function runStatus(format: OutputFormat): Promise<void>;
4
+ export declare const statusSchema: {
5
+ type: string;
6
+ properties: {
7
+ configured: {
8
+ type: string;
9
+ };
10
+ keyHint: {
11
+ type: string;
12
+ };
13
+ balance: {
14
+ type: string;
15
+ };
16
+ source: {
17
+ type: string;
18
+ enum: string[];
19
+ };
20
+ error: {
21
+ type: string;
22
+ };
23
+ autonomyMode: {
24
+ type: string;
25
+ enum: string[];
26
+ };
27
+ creditBudgetFloor: {
28
+ type: string;
29
+ };
30
+ defaultModel: {
31
+ type: string;
32
+ enum: string[];
33
+ };
34
+ defaultFormat: {
35
+ type: string;
36
+ enum: string[];
37
+ };
38
+ defaultAspectRatio: {
39
+ type: string;
40
+ };
41
+ cdnEnabled: {
42
+ type: string;
43
+ };
44
+ };
45
+ };
46
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB1F;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBnE;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAexB,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { setApiKey, validateKey, getStatus } from "@astablebridge/core";
2
+ import { printOutput, printError } from "../output/format.js";
3
+ export async function runAuth(key, format) {
4
+ const apiKey = key ?? process.env.STABILITY_API_KEY;
5
+ if (!apiKey) {
6
+ printError("API key required. Use --key or set STABILITY_API_KEY env var.", format);
7
+ }
8
+ const validation = await validateKey(apiKey);
9
+ if (!validation.valid) {
10
+ printError(validation.error ?? "Invalid API key", format);
11
+ }
12
+ await setApiKey(apiKey);
13
+ printOutput({
14
+ success: true,
15
+ configured: true,
16
+ balance: validation.balance,
17
+ message: "API key saved (headless auth — for CI/scripts only)",
18
+ }, format);
19
+ }
20
+ export async function runStatus(format) {
21
+ const status = await getStatus();
22
+ if (format === "text") {
23
+ if (!status.configured) {
24
+ console.log("Not configured. Run: stable-bridge onboard");
25
+ process.exit(1);
26
+ }
27
+ console.log(`Configured: yes (${status.source ?? "unknown"})`);
28
+ console.log(`Key hint: ${status.keyHint}`);
29
+ if (status.balance !== undefined)
30
+ console.log(`Balance: ${status.balance} credits`);
31
+ if (status.autonomyMode)
32
+ console.log(`Autonomy mode: ${status.autonomyMode}`);
33
+ if (status.creditBudgetFloor !== undefined)
34
+ console.log(`Credit budget floor: ${status.creditBudgetFloor} credits`);
35
+ if (status.defaultModel)
36
+ console.log(`Default model: ${status.defaultModel}`);
37
+ if (status.defaultFormat)
38
+ console.log(`Default format: ${status.defaultFormat}`);
39
+ if (status.defaultAspectRatio)
40
+ console.log(`Default aspect ratio: ${status.defaultAspectRatio}`);
41
+ if (status.cdnEnabled !== undefined)
42
+ console.log(`CDN enabled: ${status.cdnEnabled}`);
43
+ if (status.error)
44
+ console.log(`Warning: ${status.error}`);
45
+ return;
46
+ }
47
+ printOutput(status, format);
48
+ if (!status.configured) {
49
+ process.exit(1);
50
+ }
51
+ }
52
+ export const statusSchema = {
53
+ type: "object",
54
+ properties: {
55
+ configured: { type: "boolean" },
56
+ keyHint: { type: "string" },
57
+ balance: { type: "number" },
58
+ source: { type: "string", enum: ["env", "keychain", "file"] },
59
+ error: { type: "string" },
60
+ autonomyMode: { type: "string", enum: ["full-auto", "bounded", "plan-then-execute"] },
61
+ creditBudgetFloor: { type: "number" },
62
+ defaultModel: { type: "string", enum: ["core", "ultra"] },
63
+ defaultFormat: { type: "string", enum: ["webp", "png", "jpeg"] },
64
+ defaultAspectRatio: { type: "string" },
65
+ cdnEnabled: { type: "boolean" },
66
+ },
67
+ };
68
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { OutputFormat } from "../output/format.js";
2
+ export interface GenerateFlags {
3
+ prompt: string;
4
+ name?: string;
5
+ model?: "core" | "ultra";
6
+ format?: "webp" | "png" | "jpeg";
7
+ aspectRatio?: string;
8
+ }
9
+ export declare function runGenerate(cwd: string, flags: GenerateFlags, outputFormat: OutputFormat): Promise<void>;
10
+ export declare const generateSchema: {
11
+ type: string;
12
+ properties: {
13
+ prompt: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ name: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ model: {
22
+ type: string;
23
+ enum: string[];
24
+ };
25
+ format: {
26
+ type: string;
27
+ enum: string[];
28
+ };
29
+ aspectRatio: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ };
34
+ required: string[];
35
+ };
36
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;CAU1B,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { getApiKey, placeInProject, redactSecrets, BudgetExceededError } from "@astablebridge/core";
2
+ import { printOutput, printError } from "../output/format.js";
3
+ export async function runGenerate(cwd, flags, outputFormat) {
4
+ const { key } = await getApiKey();
5
+ if (!key) {
6
+ printError("Not configured. Run: stable-bridge onboard", outputFormat);
7
+ }
8
+ try {
9
+ const result = await placeInProject(cwd, key, {
10
+ prompt: flags.prompt,
11
+ name: flags.name,
12
+ model: flags.model,
13
+ outputFormat: flags.format,
14
+ aspectRatio: flags.aspectRatio,
15
+ });
16
+ printOutput({ success: true, ...result }, outputFormat);
17
+ }
18
+ catch (err) {
19
+ if (err instanceof BudgetExceededError) {
20
+ printOutput({
21
+ success: false,
22
+ budgetExceeded: true,
23
+ balance: err.balance,
24
+ estimatedCost: err.estimatedCost,
25
+ creditBudgetFloor: err.creditBudgetFloor,
26
+ model: err.model,
27
+ message: err.message,
28
+ }, outputFormat);
29
+ process.exit(1);
30
+ }
31
+ const message = err instanceof Error ? err.message : String(err);
32
+ printError(redactSecrets(message, key), outputFormat);
33
+ }
34
+ }
35
+ export const generateSchema = {
36
+ type: "object",
37
+ properties: {
38
+ prompt: { type: "string", description: "Image generation prompt" },
39
+ name: { type: "string", description: "Output filename base" },
40
+ model: { type: "string", enum: ["core", "ultra"] },
41
+ format: { type: "string", enum: ["webp", "png", "jpeg"] },
42
+ aspectRatio: { type: "string", description: "e.g. 1:1, 16:9, 9:16" },
43
+ },
44
+ required: ["prompt"],
45
+ };
46
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEpG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAU9D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,KAAoB,EACpB,YAA0B;IAE1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,UAAU,CAAC,4CAA4C,EAAE,YAAY,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;YAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY,EAAE,KAAK,CAAC,MAAM;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;QAEH,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,WAAW,CACT;gBACE,OAAO,EAAE,KAAK;gBACd,cAAc,EAAE,IAAI;gBACpB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;gBACxC,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,EACD,YAAY,CACb,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAClE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;QAC7D,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;QAClD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;QACzD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;KACrE;IACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;CACrB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { OutputFormat } from "../output/format.js";
2
+ export declare function runInit(cwd: string, format: OutputFormat): Promise<void>;
3
+ export declare const initSchema: {
4
+ type: string;
5
+ properties: {
6
+ configPath: {
7
+ type: string;
8
+ };
9
+ assetsDir: {
10
+ type: string;
11
+ };
12
+ created: {
13
+ type: string;
14
+ };
15
+ };
16
+ };
17
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9E;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;CAOtB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { initProject } from "@astablebridge/core";
2
+ import { printOutput } from "../output/format.js";
3
+ export async function runInit(cwd, format) {
4
+ const result = await initProject(cwd);
5
+ printOutput({
6
+ success: true,
7
+ configPath: result.configPath,
8
+ assetsDir: result.assetsDir,
9
+ created: result.created,
10
+ message: result.created
11
+ ? "Created stable-bridge.config.json and assets directory"
12
+ : "Assets directory ensured (config already exists)",
13
+ }, format);
14
+ }
15
+ export const initSchema = {
16
+ type: "object",
17
+ properties: {
18
+ configPath: { type: "string" },
19
+ assetsDir: { type: "string" },
20
+ created: { type: "boolean" },
21
+ },
22
+ };
23
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,MAAoB;IAC7D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAEtC,WAAW,CACT;QACE,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACrB,CAAC,CAAC,wDAAwD;YAC1D,CAAC,CAAC,kDAAkD;KACvD,EACD,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KAC7B;CACF,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { OutputFormat } from "../output/format.js";
2
+ export interface InsertFlags {
3
+ file: string;
4
+ prompt: string;
5
+ name?: string;
6
+ model?: "core" | "ultra";
7
+ format?: "webp" | "png" | "jpeg";
8
+ aspectRatio?: string;
9
+ framework?: "nextjs" | "react" | "html" | "markdown" | "css";
10
+ alt?: string;
11
+ apply?: boolean;
12
+ placeholder?: string;
13
+ }
14
+ export declare function runInsert(cwd: string, flags: InsertFlags, outputFormat: OutputFormat): Promise<void>;
15
+ export declare const insertSchema: {
16
+ type: string;
17
+ properties: {
18
+ file: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ prompt: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ name: {
27
+ type: string;
28
+ };
29
+ model: {
30
+ type: string;
31
+ enum: string[];
32
+ };
33
+ format: {
34
+ type: string;
35
+ enum: string[];
36
+ };
37
+ framework: {
38
+ type: string;
39
+ enum: string[];
40
+ };
41
+ apply: {
42
+ type: string;
43
+ description: string;
44
+ };
45
+ placeholder: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ };
50
+ required: string[];
51
+ };
52
+ //# sourceMappingURL=insert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../../src/commands/insert.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAaxB,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { getApiKey, insertImage, redactSecrets, BudgetExceededError } from "@astablebridge/core";
2
+ import { printOutput, printError } from "../output/format.js";
3
+ export async function runInsert(cwd, flags, outputFormat) {
4
+ const { key } = await getApiKey();
5
+ if (!key) {
6
+ printError("Not configured. Run: stable-bridge onboard", outputFormat);
7
+ }
8
+ try {
9
+ const result = await insertImage(cwd, key, {
10
+ file: flags.file,
11
+ prompt: flags.prompt,
12
+ name: flags.name,
13
+ model: flags.model,
14
+ outputFormat: flags.format,
15
+ aspectRatio: flags.aspectRatio,
16
+ framework: flags.framework,
17
+ alt: flags.alt,
18
+ apply: flags.apply,
19
+ placeholder: flags.placeholder,
20
+ });
21
+ printOutput({ success: true, ...result }, outputFormat);
22
+ }
23
+ catch (err) {
24
+ if (err instanceof BudgetExceededError) {
25
+ printOutput({
26
+ success: false,
27
+ budgetExceeded: true,
28
+ balance: err.balance,
29
+ estimatedCost: err.estimatedCost,
30
+ creditBudgetFloor: err.creditBudgetFloor,
31
+ model: err.model,
32
+ message: err.message,
33
+ }, outputFormat);
34
+ process.exit(1);
35
+ }
36
+ const message = err instanceof Error ? err.message : String(err);
37
+ printError(redactSecrets(message, key), outputFormat);
38
+ }
39
+ }
40
+ export const insertSchema = {
41
+ type: "object",
42
+ properties: {
43
+ file: { type: "string", description: "Target file to insert into" },
44
+ prompt: { type: "string", description: "Image generation prompt" },
45
+ name: { type: "string" },
46
+ model: { type: "string", enum: ["core", "ultra"] },
47
+ format: { type: "string", enum: ["webp", "png", "jpeg"] },
48
+ framework: { type: "string", enum: ["nextjs", "react", "html", "markdown", "css"] },
49
+ apply: { type: "boolean", description: "Apply snippet to file" },
50
+ placeholder: { type: "string", description: "Placeholder string to replace" },
51
+ },
52
+ required: ["file", "prompt"],
53
+ };
54
+ //# sourceMappingURL=insert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.js","sourceRoot":"","sources":["../../src/commands/insert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { OutputFormat } from "../output/format.js";
2
+ export declare function runOnboard(format: OutputFormat): Promise<void>;
3
+ //# sourceMappingURL=onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAoBxD,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDpE"}
@@ -0,0 +1,61 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { startOnboardServer } from "@astablebridge/core";
4
+ import { printOutput, printError } from "../output/format.js";
5
+ const execAsync = promisify(exec);
6
+ async function openBrowser(url) {
7
+ const platform = process.platform;
8
+ const cmd = platform === "darwin"
9
+ ? `open "${url}"`
10
+ : platform === "win32"
11
+ ? `start "" "${url}"`
12
+ : `xdg-open "${url}"`;
13
+ try {
14
+ await execAsync(cmd);
15
+ }
16
+ catch {
17
+ // browser open is best-effort
18
+ }
19
+ }
20
+ export async function runOnboard(format) {
21
+ if (process.stdout.isTTY && format === "text") {
22
+ console.log("Starting secure onboard server...");
23
+ }
24
+ const server = await startOnboardServer({
25
+ onSuccess: (keyHint, balance, preferences) => {
26
+ if (format === "text") {
27
+ console.log(`\nKey saved (${keyHint}). Balance: ${balance} credits.`);
28
+ console.log(`Preferences saved: model=${preferences.defaultModel}, format=${preferences.defaultFormat}, ` +
29
+ `aspectRatio=${preferences.defaultAspectRatio}, cdn=${preferences.cdnEnabled}, ` +
30
+ `budgetFloor=${preferences.creditBudgetFloor}, autonomy=${preferences.autonomyMode}.`);
31
+ }
32
+ },
33
+ });
34
+ if (format === "text") {
35
+ console.log(`Open ${server.url} in your browser to enter your API key.`);
36
+ console.log("Your key is saved locally and never sent to any agent or chat.\n");
37
+ }
38
+ await openBrowser(server.url);
39
+ if (format === "json" || format === "toon") {
40
+ printOutput({
41
+ status: "waiting",
42
+ url: server.url,
43
+ message: "Open the URL in your browser to enter your API key",
44
+ }, format);
45
+ }
46
+ const result = await server.waitForCompletion();
47
+ if (result.success) {
48
+ printOutput({
49
+ success: true,
50
+ configured: true,
51
+ keyHint: result.keyHint,
52
+ balance: result.balance,
53
+ preferences: result.preferences,
54
+ message: "API key saved successfully",
55
+ }, format);
56
+ await server.close();
57
+ return;
58
+ }
59
+ printError("Onboard timed out or was cancelled", format);
60
+ }
61
+ //# sourceMappingURL=onboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,GAAG,GACP,QAAQ,KAAK,QAAQ;QACnB,CAAC,CAAC,SAAS,GAAG,GAAG;QACjB,CAAC,CAAC,QAAQ,KAAK,OAAO;YACpB,CAAC,CAAC,aAAa,GAAG,GAAG;YACrB,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAoB;IACnD,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;YAC3C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,eAAe,OAAO,WAAW,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CACT,4BAA4B,WAAW,CAAC,YAAY,YAAY,WAAW,CAAC,aAAa,IAAI;oBAC3F,eAAe,WAAW,CAAC,kBAAkB,SAAS,WAAW,CAAC,UAAU,IAAI;oBAChF,eAAe,WAAW,CAAC,iBAAiB,cAAc,WAAW,CAAC,YAAY,GAAG,CACxF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,GAAG,yCAAyC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3C,WAAW,CACT;YACE,MAAM,EAAE,SAAS;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,oDAAoD;SAC9D,EACD,MAAM,CACP,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAEhD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,WAAW,CACT;YACE,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,4BAA4B;SACtC,EACD,MAAM,CACP,CAAC;QACF,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,UAAU,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { OutputFormat } from "../output/format.js";
2
+ declare const MCP_CONFIG: {
3
+ mcpServers: {
4
+ "stable-bridge": {
5
+ command: string;
6
+ args: string[];
7
+ };
8
+ };
9
+ };
10
+ export declare function runSetupMcp(format: OutputFormat, write?: boolean): Promise<void>;
11
+ export { MCP_CONFIG };
12
+ //# sourceMappingURL=setup-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-mcp.d.ts","sourceRoot":"","sources":["../../src/commands/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,QAAA,MAAM,UAAU;;;;;;;CAOf,CAAC;AAEF,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBpF;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { printOutput } from "../output/format.js";
2
+ const MCP_CONFIG = {
3
+ mcpServers: {
4
+ "stable-bridge": {
5
+ command: "npx",
6
+ args: ["-y", "@astablebridge/cli", "--mcp"],
7
+ },
8
+ },
9
+ };
10
+ export async function runSetupMcp(format, write = false) {
11
+ const snippet = JSON.stringify(MCP_CONFIG, null, 2);
12
+ if (format === "text") {
13
+ console.log("Add this to your MCP config (Cursor / Claude Desktop):\n");
14
+ console.log(snippet);
15
+ console.log("\nRun after onboard completes. Keys stay local — no tool accepts raw API keys.");
16
+ return;
17
+ }
18
+ printOutput({
19
+ success: true,
20
+ config: MCP_CONFIG,
21
+ snippet,
22
+ message: "Add this MCP config after onboard completes",
23
+ }, format);
24
+ }
25
+ export { MCP_CONFIG };
26
+ //# sourceMappingURL=setup-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/commands/setup-mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,UAAU,GAAG;IACjB,UAAU,EAAE;QACV,eAAe,EAAE;YACf,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC;SAC5C;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAK,GAAG,KAAK;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IAED,WAAW,CACT;QACE,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,UAAU;QAClB,OAAO;QACP,OAAO,EAAE,6CAA6C;KACvD,EACD,MAAM,CACP,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { readFileSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { dirname, join } from "node:path";
6
+ import { detectDefaultFormat, printOutput } from "./output/format.js";
7
+ import { runOnboard } from "./commands/onboard.js";
8
+ import { runAuth, runStatus, statusSchema } from "./commands/auth.js";
9
+ import { runInit, initSchema } from "./commands/init.js";
10
+ import { runGenerate, generateSchema } from "./commands/generate.js";
11
+ import { runInsert, insertSchema } from "./commands/insert.js";
12
+ import { runSetupMcp } from "./commands/setup-mcp.js";
13
+ import { startMcpServer } from "./mcp/server.js";
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf8"));
16
+ async function main() {
17
+ const rawArgs = process.argv.slice(2);
18
+ if (rawArgs.includes("--mcp")) {
19
+ await startMcpServer(process.cwd());
20
+ return;
21
+ }
22
+ const program = new Command();
23
+ program
24
+ .name("stable-bridge")
25
+ .description("StableBridge — generate and insert Stability AI images into any project")
26
+ .version(pkg.version)
27
+ .option("--format <format>", "Output format: text, json, or toon")
28
+ .option("--schema", "Print JSON schema for the subcommand");
29
+ program
30
+ .command("onboard")
31
+ .description("Open localhost UI for secure API key entry (key never enters chat)")
32
+ .action(async () => {
33
+ const format = detectDefaultFormat(program.opts().format);
34
+ await runOnboard(format);
35
+ });
36
+ program
37
+ .command("auth")
38
+ .description("Headless key save for CI/scripts only — not for agent chat")
39
+ .option("--key <key>", "Stability API key")
40
+ .action(async (opts) => {
41
+ const format = detectDefaultFormat(program.opts().format);
42
+ await runAuth(opts.key, format);
43
+ });
44
+ program
45
+ .command("status")
46
+ .description("Check configuration and credit balance")
47
+ .action(async () => {
48
+ const opts = program.opts();
49
+ if (opts.schema) {
50
+ printOutput(statusSchema, detectDefaultFormat(opts.format));
51
+ return;
52
+ }
53
+ await runStatus(detectDefaultFormat(opts.format));
54
+ });
55
+ program
56
+ .command("init")
57
+ .description("Create stable-bridge.config.json and assets directory")
58
+ .action(async () => {
59
+ const opts = program.opts();
60
+ if (opts.schema) {
61
+ printOutput(initSchema, detectDefaultFormat(opts.format));
62
+ return;
63
+ }
64
+ await runInit(process.cwd(), detectDefaultFormat(opts.format));
65
+ });
66
+ program
67
+ .command("generate")
68
+ .description("Generate an image and save to project assets")
69
+ .requiredOption("--prompt <prompt>", "Image generation prompt")
70
+ .option("--name <name>", "Output filename base")
71
+ .option("--model <model>", "Model: core or ultra (defaults to project config)")
72
+ .option("--format-image <format>", "Output format: webp, png, or jpeg (defaults to project config)")
73
+ .option("--aspect-ratio <ratio>", "Aspect ratio (defaults to project config)")
74
+ .action(async (cmdOpts) => {
75
+ const opts = program.opts();
76
+ if (opts.schema) {
77
+ printOutput(generateSchema, detectDefaultFormat(opts.format));
78
+ return;
79
+ }
80
+ await runGenerate(process.cwd(), {
81
+ prompt: cmdOpts.prompt,
82
+ name: cmdOpts.name,
83
+ model: cmdOpts.model,
84
+ format: cmdOpts.formatImage,
85
+ aspectRatio: cmdOpts.aspectRatio,
86
+ }, detectDefaultFormat(opts.format));
87
+ });
88
+ program
89
+ .command("insert")
90
+ .description("Generate an image and return insertion snippet")
91
+ .requiredOption("--file <file>", "Target file path")
92
+ .requiredOption("--prompt <prompt>", "Image generation prompt")
93
+ .option("--name <name>", "Output filename base")
94
+ .option("--model <model>", "Model: core or ultra (defaults to project config)")
95
+ .option("--format-image <format>", "Output format: webp, png, or jpeg (defaults to project config)")
96
+ .option("--aspect-ratio <ratio>", "Aspect ratio (defaults to project config)")
97
+ .option("--framework <framework>", "Framework: nextjs, react, html, markdown, css")
98
+ .option("--alt <alt>", "Image alt text")
99
+ .option("--apply", "Apply snippet to file")
100
+ .option("--placeholder <placeholder>", "Placeholder to replace when applying")
101
+ .action(async (cmdOpts) => {
102
+ const opts = program.opts();
103
+ if (opts.schema) {
104
+ printOutput(insertSchema, detectDefaultFormat(opts.format));
105
+ return;
106
+ }
107
+ await runInsert(process.cwd(), {
108
+ file: cmdOpts.file,
109
+ prompt: cmdOpts.prompt,
110
+ name: cmdOpts.name,
111
+ model: cmdOpts.model,
112
+ format: cmdOpts.formatImage,
113
+ aspectRatio: cmdOpts.aspectRatio,
114
+ framework: cmdOpts.framework,
115
+ alt: cmdOpts.alt,
116
+ apply: cmdOpts.apply,
117
+ placeholder: cmdOpts.placeholder,
118
+ }, detectDefaultFormat(opts.format));
119
+ });
120
+ const setup = program.command("setup").description("Setup helpers");
121
+ setup
122
+ .command("mcp")
123
+ .description("Print MCP config snippet for Cursor/Claude")
124
+ .action(async () => {
125
+ await runSetupMcp(detectDefaultFormat(program.opts().format));
126
+ });
127
+ await program.parseAsync(process.argv);
128
+ }
129
+ main().catch((err) => {
130
+ console.error(err instanceof Error ? err.message : String(err));
131
+ process.exit(1);
132
+ });
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startMcpServer(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAeA,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoK/D"}
@@ -0,0 +1,156 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
4
+ import { getStatus, initProject, placeInProject, insertImage, getApiKey, redactSecrets, } from "@astablebridge/core";
5
+ export async function startMcpServer(cwd) {
6
+ const server = new Server({ name: "stable-bridge", version: "0.1.0" }, { capabilities: { tools: {} } });
7
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
8
+ tools: [
9
+ {
10
+ name: "stable_check_status",
11
+ description: "Check if StableBridge is configured and return masked key hint, balance, autonomy mode, credit budget floor, and generation defaults (model/format/aspectRatio/cdn). Never exposes full API key.",
12
+ inputSchema: { type: "object", properties: {}, required: [] },
13
+ },
14
+ {
15
+ name: "stable_init_project",
16
+ description: "Initialize stable-bridge.config.json and assets directory in the project.",
17
+ inputSchema: { type: "object", properties: {}, required: [] },
18
+ },
19
+ {
20
+ name: "stable_generate_image",
21
+ description: "Generate an image via Stability AI and save to project assets. Requires prior onboard setup.",
22
+ inputSchema: {
23
+ type: "object",
24
+ properties: {
25
+ prompt: { type: "string", description: "Image generation prompt" },
26
+ name: { type: "string", description: "Output filename base" },
27
+ model: { type: "string", enum: ["core", "ultra"] },
28
+ outputFormat: { type: "string", enum: ["webp", "png", "jpeg"] },
29
+ aspectRatio: { type: "string", description: "e.g. 1:1, 16:9" },
30
+ },
31
+ required: ["prompt"],
32
+ },
33
+ },
34
+ {
35
+ name: "stable_insert_image",
36
+ description: "Generate an image and return a framework-aware insertion snippet. Optionally apply to a file.",
37
+ inputSchema: {
38
+ type: "object",
39
+ properties: {
40
+ file: { type: "string", description: "Target file path" },
41
+ prompt: { type: "string", description: "Image generation prompt" },
42
+ name: { type: "string" },
43
+ model: { type: "string", enum: ["core", "ultra"] },
44
+ outputFormat: { type: "string", enum: ["webp", "png", "jpeg"] },
45
+ aspectRatio: { type: "string" },
46
+ framework: { type: "string", enum: ["nextjs", "react", "html", "markdown", "css"] },
47
+ alt: { type: "string" },
48
+ apply: { type: "boolean" },
49
+ placeholder: { type: "string" },
50
+ },
51
+ required: ["file", "prompt"],
52
+ },
53
+ },
54
+ ],
55
+ }));
56
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
57
+ const { name, arguments: args } = request.params;
58
+ const a = (args ?? {});
59
+ try {
60
+ switch (name) {
61
+ case "stable_check_status": {
62
+ const status = await getStatus();
63
+ return {
64
+ content: [{ type: "text", text: JSON.stringify(status, null, 2) }],
65
+ };
66
+ }
67
+ case "stable_init_project": {
68
+ const result = await initProject(cwd);
69
+ return {
70
+ content: [
71
+ {
72
+ type: "text",
73
+ text: JSON.stringify({ success: true, ...result }, null, 2),
74
+ },
75
+ ],
76
+ };
77
+ }
78
+ case "stable_generate_image": {
79
+ const { key } = await getApiKey();
80
+ if (!key) {
81
+ return {
82
+ content: [
83
+ {
84
+ type: "text",
85
+ text: JSON.stringify({
86
+ error: "Not configured. User must run: stable-bridge onboard",
87
+ configured: false,
88
+ }),
89
+ },
90
+ ],
91
+ isError: true,
92
+ };
93
+ }
94
+ const result = await placeInProject(cwd, key, {
95
+ prompt: a.prompt,
96
+ name: a.name,
97
+ model: a.model,
98
+ outputFormat: a.outputFormat,
99
+ aspectRatio: a.aspectRatio,
100
+ });
101
+ return {
102
+ content: [{ type: "text", text: JSON.stringify({ success: true, ...result }, null, 2) }],
103
+ };
104
+ }
105
+ case "stable_insert_image": {
106
+ const { key } = await getApiKey();
107
+ if (!key) {
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: JSON.stringify({
113
+ error: "Not configured. User must run: stable-bridge onboard",
114
+ configured: false,
115
+ }),
116
+ },
117
+ ],
118
+ isError: true,
119
+ };
120
+ }
121
+ const result = await insertImage(cwd, key, {
122
+ file: a.file,
123
+ prompt: a.prompt,
124
+ name: a.name,
125
+ model: a.model,
126
+ outputFormat: a.outputFormat,
127
+ aspectRatio: a.aspectRatio,
128
+ framework: a.framework,
129
+ alt: a.alt,
130
+ apply: a.apply,
131
+ placeholder: a.placeholder,
132
+ });
133
+ return {
134
+ content: [{ type: "text", text: JSON.stringify({ success: true, ...result }, null, 2) }],
135
+ };
136
+ }
137
+ default:
138
+ return {
139
+ content: [{ type: "text", text: JSON.stringify({ error: `Unknown tool: ${name}` }) }],
140
+ isError: true,
141
+ };
142
+ }
143
+ }
144
+ catch (err) {
145
+ const message = err instanceof Error ? err.message : String(err);
146
+ const { key } = await getApiKey();
147
+ return {
148
+ content: [{ type: "text", text: JSON.stringify({ error: redactSecrets(message, key) }) }],
149
+ isError: true,
150
+ };
151
+ }
152
+ });
153
+ const transport = new StdioServerTransport();
154
+ await server.connect(transport);
155
+ }
156
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type OutputFormat = "text" | "json" | "toon";
2
+ export declare function detectDefaultFormat(explicit?: string): OutputFormat;
3
+ export declare function formatOutput(data: unknown, format: OutputFormat): string;
4
+ export declare function printOutput(data: unknown, format: OutputFormat): void;
5
+ export declare function printError(message: string, format: OutputFormat, code?: number): never;
6
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/output/format.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAKnE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQxE;AAiDD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAErE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,SAAI,GAAG,KAAK,CASjF"}
@@ -0,0 +1,85 @@
1
+ export function detectDefaultFormat(explicit) {
2
+ if (explicit === "json" || explicit === "toon" || explicit === "text") {
3
+ return explicit;
4
+ }
5
+ return process.stdout.isTTY ? "text" : "json";
6
+ }
7
+ export function formatOutput(data, format) {
8
+ if (format === "json") {
9
+ return JSON.stringify(data, null, 2);
10
+ }
11
+ if (format === "toon") {
12
+ return toToon(data);
13
+ }
14
+ return formatText(data);
15
+ }
16
+ function formatText(data) {
17
+ if (typeof data === "string")
18
+ return data;
19
+ if (data && typeof data === "object") {
20
+ const obj = data;
21
+ if ("message" in obj && typeof obj.message === "string") {
22
+ return obj.message;
23
+ }
24
+ return Object.entries(obj)
25
+ .map(([k, v]) => `${k}: ${v}`)
26
+ .join("\n");
27
+ }
28
+ return String(data);
29
+ }
30
+ function toToon(data, indent = 0) {
31
+ const pad = " ".repeat(indent);
32
+ if (data === null || data === undefined)
33
+ return `${pad}null`;
34
+ if (typeof data === "string")
35
+ return `${pad}${escapeToonString(data)}`;
36
+ if (typeof data === "number" || typeof data === "boolean")
37
+ return `${pad}${data}`;
38
+ if (Array.isArray(data)) {
39
+ if (data.length === 0)
40
+ return `${pad}[]`;
41
+ return data.map((item, i) => `${pad}[${i}] ${toToonValue(item)}`).join("\n");
42
+ }
43
+ if (typeof data === "object") {
44
+ const entries = Object.entries(data);
45
+ if (entries.length === 0)
46
+ return `${pad}{}`;
47
+ return entries.map(([k, v]) => `${pad}${k}: ${toToonValue(v)}`).join("\n");
48
+ }
49
+ return `${pad}${String(data)}`;
50
+ }
51
+ function toToonValue(value) {
52
+ if (value === null || value === undefined)
53
+ return "null";
54
+ if (typeof value === "string")
55
+ return escapeToonString(value);
56
+ if (typeof value === "number" || typeof value === "boolean")
57
+ return String(value);
58
+ if (Array.isArray(value))
59
+ return `[${value.length}]`;
60
+ if (typeof value === "object")
61
+ return `{${Object.keys(value).length}}`;
62
+ return String(value);
63
+ }
64
+ function escapeToonString(s) {
65
+ if (s.includes("\n") || s.includes(":") || s.includes('"')) {
66
+ return JSON.stringify(s);
67
+ }
68
+ return s.includes(" ") ? JSON.stringify(s) : s;
69
+ }
70
+ export function printOutput(data, format) {
71
+ console.log(formatOutput(data, format));
72
+ }
73
+ export function printError(message, format, code = 1) {
74
+ if (format === "json") {
75
+ console.log(JSON.stringify({ error: message, success: false }, null, 2));
76
+ }
77
+ else if (format === "toon") {
78
+ console.log(`error: ${message}\nsuccess: false`);
79
+ }
80
+ else {
81
+ console.error(message);
82
+ }
83
+ process.exit(code);
84
+ }
85
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/output/format.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACtE,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,MAAoB;IAC9D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,IAAI,SAAS,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACxD,OAAO,GAAG,CAAC,OAAO,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;aACvB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;aAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,MAAM,CAAC,IAAa,EAAE,MAAM,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,GAAG,MAAM,CAAC;IAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACvE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;IAClF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,GAAG,IAAI,CAAC;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,GAAG,IAAI,CAAC;QAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;IACvE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS;IACjC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,MAAoB;IAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,MAAoB,EAAE,IAAI,GAAG,CAAC;IACxE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,kBAAkB,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@astablebridge/cli",
3
+ "version": "0.1.0",
4
+ "description": "StableBridge CLI — generate and insert Stability AI images into any project",
5
+ "type": "module",
6
+ "bin": {
7
+ "stable-bridge": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/mastercoder26/StableBridge.git",
17
+ "directory": "packages/cli"
18
+ },
19
+ "homepage": "https://github.com/mastercoder26/StableBridge#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/mastercoder26/StableBridge/issues"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "postbuild": "chmod +x dist/index.js",
29
+ "prepublishOnly": "npm run build",
30
+ "test": "node --import tsx --test src/**/*.test.ts"
31
+ },
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.12.1",
34
+ "@astablebridge/core": "^0.1.0",
35
+ "commander": "^13.1.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.13.10",
39
+ "tsx": "^4.19.3",
40
+ "typescript": "^5.8.2"
41
+ },
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "keywords": [
46
+ "stability-ai",
47
+ "image-generation",
48
+ "mcp",
49
+ "cli",
50
+ "agent"
51
+ ],
52
+ "license": "MIT"
53
+ }