@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.
- package/dist/commands/auth.d.ts +46 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +68 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/generate.d.ts +36 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +46 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +17 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +23 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/insert.d.ts +52 -0
- package/dist/commands/insert.d.ts.map +1 -0
- package/dist/commands/insert.js +54 -0
- package/dist/commands/insert.js.map +1 -0
- package/dist/commands/onboard.d.ts +3 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +61 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/setup-mcp.d.ts +12 -0
- package/dist/commands/setup-mcp.d.ts.map +1 -0
- package/dist/commands/setup-mcp.js +26 -0
- package/dist/commands/setup-mcp.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +156 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/output/format.d.ts +6 -0
- package/dist/output/format.d.ts.map +1 -0
- package/dist/output/format.js +85 -0
- package/dist/output/format.js.map +1 -0
- package/package.json +53 -0
|
@@ -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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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":"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"}
|
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
|
+
}
|