mcpize 1.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/LICENSE +21 -0
- package/README.md +140 -0
- package/dist/commands/deploy.d.ts +8 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +337 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +257 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +238 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +6 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +147 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +88 -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 +9 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +13 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +173 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/secrets.d.ts +16 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +195 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +187 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +241 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +154 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +364 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +20 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +106 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/cache.d.ts +39 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +112 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/config.d.ts +21 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +90 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/degit.d.ts +25 -0
- package/dist/lib/degit.d.ts.map +1 -0
- package/dist/lib/degit.js +187 -0
- package/dist/lib/degit.js.map +1 -0
- package/dist/lib/git.d.ts +10 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +43 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/project.d.ts +38 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +72 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/tarball.d.ts +7 -0
- package/dist/lib/tarball.d.ts.map +1 -0
- package/dist/lib/tarball.js +130 -0
- package/dist/lib/tarball.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import readline from "node:readline";
|
|
5
|
+
import { getToken } from "../lib/config.js";
|
|
6
|
+
import { loadProjectConfig } from "../lib/project.js";
|
|
7
|
+
import { listSecrets, setSecret, deleteSecret, exportSecrets, } from "../lib/api.js";
|
|
8
|
+
function getServerId(options) {
|
|
9
|
+
// Priority: --server flag > project config
|
|
10
|
+
if (options.server) {
|
|
11
|
+
return options.server;
|
|
12
|
+
}
|
|
13
|
+
const projectConfig = loadProjectConfig(process.cwd());
|
|
14
|
+
if (projectConfig?.serverId) {
|
|
15
|
+
return projectConfig.serverId;
|
|
16
|
+
}
|
|
17
|
+
console.error(chalk.red("No server specified."));
|
|
18
|
+
console.error(chalk.dim("Use --server <id> or run from a linked project directory."));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
function requireAuth() {
|
|
22
|
+
const token = getToken();
|
|
23
|
+
if (!token) {
|
|
24
|
+
console.error(chalk.red("Not authenticated. Run: mcpize login"));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function secretsListCommand(options) {
|
|
29
|
+
requireAuth();
|
|
30
|
+
const serverId = getServerId(options);
|
|
31
|
+
const environment = options.environment || "production";
|
|
32
|
+
const spinner = ora("Fetching secrets...").start();
|
|
33
|
+
try {
|
|
34
|
+
const secrets = await listSecrets(serverId, environment);
|
|
35
|
+
spinner.stop();
|
|
36
|
+
if (secrets.length === 0) {
|
|
37
|
+
console.log(chalk.dim(`No secrets found for environment: ${environment}`));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
console.log(chalk.bold(`\nSecrets (${environment}):\n`));
|
|
41
|
+
for (const secret of secrets) {
|
|
42
|
+
const required = secret.required ? chalk.yellow(" [required]") : "";
|
|
43
|
+
console.log(` ${chalk.cyan(secret.name)}${required}`);
|
|
44
|
+
console.log(chalk.dim(` Updated: ${new Date(secret.updated_at).toLocaleString()}`));
|
|
45
|
+
}
|
|
46
|
+
console.log();
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
spinner.fail("Failed to list secrets");
|
|
50
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function secretsSetCommand(name, value, options) {
|
|
55
|
+
requireAuth();
|
|
56
|
+
const serverId = getServerId(options);
|
|
57
|
+
const environment = options.environment || "production";
|
|
58
|
+
// Validate name format
|
|
59
|
+
if (!/^[A-Z_][A-Z0-9_]*$/.test(name)) {
|
|
60
|
+
console.error(chalk.red("Secret name must be uppercase letters, numbers, and underscores (e.g., OPENAI_API_KEY)"));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
let secretValue;
|
|
64
|
+
if (options.fromFile) {
|
|
65
|
+
// Read value from file
|
|
66
|
+
try {
|
|
67
|
+
secretValue = fs.readFileSync(options.fromFile, "utf-8").trim();
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error(chalk.red(`Failed to read file: ${options.fromFile}`));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (value) {
|
|
75
|
+
secretValue = value;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Read from stdin (for piping)
|
|
79
|
+
if (process.stdin.isTTY) {
|
|
80
|
+
// Interactive mode - prompt for value
|
|
81
|
+
const rl = readline.createInterface({
|
|
82
|
+
input: process.stdin,
|
|
83
|
+
output: process.stdout,
|
|
84
|
+
});
|
|
85
|
+
secretValue = await new Promise((resolve) => {
|
|
86
|
+
// Hide input for secrets
|
|
87
|
+
process.stdout.write(`Enter value for ${name}: `);
|
|
88
|
+
let input = "";
|
|
89
|
+
process.stdin.setRawMode(true);
|
|
90
|
+
process.stdin.resume();
|
|
91
|
+
process.stdin.on("data", (char) => {
|
|
92
|
+
const c = char.toString();
|
|
93
|
+
if (c === "\n" || c === "\r") {
|
|
94
|
+
process.stdin.setRawMode(false);
|
|
95
|
+
process.stdout.write("\n");
|
|
96
|
+
rl.close();
|
|
97
|
+
resolve(input);
|
|
98
|
+
}
|
|
99
|
+
else if (c === "\u0003") {
|
|
100
|
+
// Ctrl+C
|
|
101
|
+
process.exit(0);
|
|
102
|
+
}
|
|
103
|
+
else if (c === "\u007F") {
|
|
104
|
+
// Backspace
|
|
105
|
+
if (input.length > 0) {
|
|
106
|
+
input = input.slice(0, -1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
input += c;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Piped input
|
|
117
|
+
const chunks = [];
|
|
118
|
+
for await (const chunk of process.stdin) {
|
|
119
|
+
chunks.push(chunk);
|
|
120
|
+
}
|
|
121
|
+
secretValue = Buffer.concat(chunks).toString("utf-8").trim();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!secretValue) {
|
|
125
|
+
console.error(chalk.red("Secret value cannot be empty"));
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
const spinner = ora(`Setting ${name}...`).start();
|
|
129
|
+
try {
|
|
130
|
+
await setSecret(serverId, name, secretValue, {
|
|
131
|
+
environment,
|
|
132
|
+
required: options.required,
|
|
133
|
+
});
|
|
134
|
+
spinner.succeed(`Secret ${chalk.cyan(name)} set for ${environment}`);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
spinner.fail(`Failed to set secret ${name}`);
|
|
138
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export async function secretsDeleteCommand(name, options) {
|
|
143
|
+
requireAuth();
|
|
144
|
+
const serverId = getServerId(options);
|
|
145
|
+
const environment = options.environment || "production";
|
|
146
|
+
const spinner = ora(`Deleting ${name}...`).start();
|
|
147
|
+
try {
|
|
148
|
+
await deleteSecret(serverId, name, environment);
|
|
149
|
+
spinner.succeed(`Secret ${chalk.cyan(name)} deleted from ${environment}`);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
spinner.fail(`Failed to delete secret ${name}`);
|
|
153
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export async function secretsExportCommand(options) {
|
|
158
|
+
requireAuth();
|
|
159
|
+
const serverId = getServerId(options);
|
|
160
|
+
const environment = options.environment || "production";
|
|
161
|
+
const format = options.format || "env";
|
|
162
|
+
const spinner = ora("Exporting secrets...").start();
|
|
163
|
+
try {
|
|
164
|
+
const secrets = await exportSecrets(serverId, environment);
|
|
165
|
+
spinner.stop();
|
|
166
|
+
if (secrets.length === 0) {
|
|
167
|
+
console.error(chalk.dim(`No secrets found for environment: ${environment}`));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (format === "json") {
|
|
171
|
+
const obj = {};
|
|
172
|
+
for (const secret of secrets) {
|
|
173
|
+
obj[secret.name] = secret.value;
|
|
174
|
+
}
|
|
175
|
+
console.log(JSON.stringify(obj, null, 2));
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// .env format
|
|
179
|
+
for (const secret of secrets) {
|
|
180
|
+
// Escape special characters in value
|
|
181
|
+
const escapedValue = secret.value
|
|
182
|
+
.replace(/\\/g, "\\\\")
|
|
183
|
+
.replace(/"/g, '\\"')
|
|
184
|
+
.replace(/\n/g, "\\n");
|
|
185
|
+
console.log(`${secret.name}="${escapedValue}"`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
spinner.fail("Failed to export secrets");
|
|
191
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,eAAe,CAAC;AAOvB,SAAS,WAAW,CAAC,OAAuB;IAC1C,2CAA2C;IAC3C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC5B,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CACvE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAuB;IAC9D,WAAW,EAAE,CAAC;IACd,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IAExD,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,MAAM,CAAC,CAAC,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAC1E,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,KAAyB,EACzB,OAA0B;IAE1B,WAAW,EAAE,CAAC;IACd,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IAExD,uBAAuB;IACvB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,wFAAwF,CACzF,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,WAAmB,CAAC;IAExB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,uBAAuB;QACvB,IAAI,CAAC;YACH,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,QAAQ,EAAE,CAAC,CACtD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,+BAA+B;QAC/B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,sCAAsC;YACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YAEH,WAAW,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;gBAClD,yBAAyB;gBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC;gBAElD,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC1B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC7B,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;wBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;wBACX,OAAO,CAAC,KAAK,CAAC,CAAC;oBACjB,CAAC;yBAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;wBAC1B,SAAS;wBACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;yBAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;wBAC1B,YAAY;wBACZ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACrB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBAC7B,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,KAAK,IAAI,CAAC,CAAC;oBACb,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,cAAc;YACd,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;YAC3C,WAAW;YACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,OAAuB;IAEvB,WAAW,EAAE,CAAC;IACd,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IAExD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAChD,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA6B;IAE7B,WAAW,EAAE,CAAC;IACd,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAEvC,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,GAAG,GAA2B,EAAE,CAAC;YACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YAClC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,cAAc;YACd,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,qCAAqC;gBACrC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK;qBAC9B,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;qBACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;qBACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,GAAG,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAkGD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+HzE"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { getToken } from "../lib/config.js";
|
|
4
|
+
import { loadProjectConfig } from "../lib/project.js";
|
|
5
|
+
import { getServerStatus, withRetry, NetworkError, } from "../lib/api.js";
|
|
6
|
+
import { getCache, getCacheStale, setCache, formatAge as formatCacheAge, CacheTTL, CacheKeys, } from "../lib/cache.js";
|
|
7
|
+
function getServerId(options) {
|
|
8
|
+
if (options.server) {
|
|
9
|
+
return options.server;
|
|
10
|
+
}
|
|
11
|
+
const projectConfig = loadProjectConfig(process.cwd());
|
|
12
|
+
if (projectConfig?.serverId) {
|
|
13
|
+
return projectConfig.serverId;
|
|
14
|
+
}
|
|
15
|
+
console.error(chalk.red("No server specified."));
|
|
16
|
+
console.error(chalk.dim("Use --server <id> or run from a linked project directory."));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
function requireAuth() {
|
|
20
|
+
const token = getToken();
|
|
21
|
+
if (!token) {
|
|
22
|
+
console.error(chalk.red("Not authenticated. Run: mcpize login"));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function formatStatus(status) {
|
|
27
|
+
switch (status) {
|
|
28
|
+
case "success":
|
|
29
|
+
return chalk.green("success");
|
|
30
|
+
case "failed":
|
|
31
|
+
return chalk.red("failed");
|
|
32
|
+
case "building":
|
|
33
|
+
return chalk.yellow("building");
|
|
34
|
+
case "deploying":
|
|
35
|
+
return chalk.cyan("deploying");
|
|
36
|
+
case "pending":
|
|
37
|
+
return chalk.dim("pending");
|
|
38
|
+
default:
|
|
39
|
+
return status;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function formatHealthStatus(status) {
|
|
43
|
+
if (!status)
|
|
44
|
+
return chalk.dim("unknown");
|
|
45
|
+
switch (status) {
|
|
46
|
+
case "healthy":
|
|
47
|
+
return chalk.green("healthy");
|
|
48
|
+
case "unhealthy":
|
|
49
|
+
return chalk.red("unhealthy");
|
|
50
|
+
case "unknown":
|
|
51
|
+
return chalk.dim("unknown");
|
|
52
|
+
default:
|
|
53
|
+
return status;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function formatAge(dateStr) {
|
|
57
|
+
const date = new Date(dateStr);
|
|
58
|
+
const now = new Date();
|
|
59
|
+
const diffMs = now.getTime() - date.getTime();
|
|
60
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
61
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
62
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
63
|
+
if (diffDays > 0) {
|
|
64
|
+
return `${diffDays}d ago`;
|
|
65
|
+
}
|
|
66
|
+
else if (diffHours > 0) {
|
|
67
|
+
return `${diffHours}h ago`;
|
|
68
|
+
}
|
|
69
|
+
else if (diffMins > 0) {
|
|
70
|
+
return `${diffMins}m ago`;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return "just now";
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function formatDeployment(dep, index) {
|
|
77
|
+
const sha = dep.git_sha ? dep.git_sha.slice(0, 7) : chalk.dim("n/a");
|
|
78
|
+
const branch = dep.git_branch || chalk.dim("n/a");
|
|
79
|
+
const status = formatStatus(dep.status);
|
|
80
|
+
const age = formatAge(dep.created_at);
|
|
81
|
+
const author = dep.git_author || chalk.dim("unknown");
|
|
82
|
+
const prefix = index === 0 ? chalk.cyan("*") : " ";
|
|
83
|
+
console.log(`${prefix} ${sha} ${branch.padEnd(15)} ${status.padEnd(18)} ${age.padEnd(10)} ${author}`);
|
|
84
|
+
if (dep.git_message) {
|
|
85
|
+
console.log(` ${chalk.dim(dep.git_message.slice(0, 60))}`);
|
|
86
|
+
}
|
|
87
|
+
if (dep.status === "failed" && dep.error_message) {
|
|
88
|
+
console.log(` ${chalk.red(dep.error_message.slice(0, 80))}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export async function statusCommand(options) {
|
|
92
|
+
requireAuth();
|
|
93
|
+
const serverId = getServerId(options);
|
|
94
|
+
const cacheKey = CacheKeys.serverStatus(serverId);
|
|
95
|
+
// Try to get from cache first (unless --refresh)
|
|
96
|
+
let status = null;
|
|
97
|
+
let fromCache = false;
|
|
98
|
+
let cacheAge = 0;
|
|
99
|
+
if (!options.refresh) {
|
|
100
|
+
const cached = getCache(cacheKey);
|
|
101
|
+
if (cached) {
|
|
102
|
+
status = cached.data;
|
|
103
|
+
fromCache = true;
|
|
104
|
+
cacheAge = cached.age;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Fetch from API if no cache or refresh requested
|
|
108
|
+
if (!status) {
|
|
109
|
+
const spinner = ora("Fetching server status...").start();
|
|
110
|
+
try {
|
|
111
|
+
status = await withRetry(() => getServerStatus(serverId), {
|
|
112
|
+
onRetry: (attempt, delay) => {
|
|
113
|
+
spinner.text = `Retrying... (attempt ${attempt + 1}/3, waiting ${delay / 1000}s)`;
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
spinner.stop();
|
|
117
|
+
// Save to cache
|
|
118
|
+
setCache(cacheKey, status, CacheTTL.STATUS);
|
|
119
|
+
fromCache = false;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
spinner.stop();
|
|
123
|
+
// Try stale cache as fallback
|
|
124
|
+
const staleCache = getCacheStale(cacheKey);
|
|
125
|
+
if (staleCache) {
|
|
126
|
+
console.log(chalk.yellow(`\n⚠ Cannot connect to MCPize API (showing cached data from ${formatCacheAge(staleCache.age)})\n`));
|
|
127
|
+
status = staleCache.data;
|
|
128
|
+
fromCache = true;
|
|
129
|
+
cacheAge = staleCache.age;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// No cache available, show error
|
|
133
|
+
if (error instanceof NetworkError) {
|
|
134
|
+
console.error(chalk.red(`\n✗ ${error.message}`));
|
|
135
|
+
console.error(chalk.dim("Run 'mcpize status --refresh' when online to update"));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
139
|
+
}
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (options.json) {
|
|
145
|
+
console.log(JSON.stringify({ ...status, _cached: fromCache, _cacheAge: cacheAge }, null, 2));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const { server, deployments, stats } = status;
|
|
149
|
+
// Show cached indicator if applicable
|
|
150
|
+
if (fromCache && cacheAge > 0) {
|
|
151
|
+
console.log(chalk.dim(`(cached ${formatCacheAge(cacheAge)})`));
|
|
152
|
+
}
|
|
153
|
+
// Server info
|
|
154
|
+
console.log(chalk.bold(`\n${server.name}`));
|
|
155
|
+
console.log(chalk.dim(`ID: ${server.id}`));
|
|
156
|
+
console.log(chalk.dim(`Slug: ${server.slug}`));
|
|
157
|
+
console.log();
|
|
158
|
+
// Status line
|
|
159
|
+
console.log(`Status: ${formatStatus(server.status)}`);
|
|
160
|
+
console.log(`Health: ${formatHealthStatus(server.health_status)}`);
|
|
161
|
+
if (server.hosting_url) {
|
|
162
|
+
console.log(`URL: ${chalk.cyan(server.hosting_url)}`);
|
|
163
|
+
}
|
|
164
|
+
console.log();
|
|
165
|
+
// Stats
|
|
166
|
+
console.log(chalk.bold("Stats:"));
|
|
167
|
+
console.log(` Deployments: ${stats.total_deployments} total, ${chalk.green(stats.successful_deployments + " success")}, ${chalk.red(stats.failed_deployments + " failed")}`);
|
|
168
|
+
console.log(` Secrets: ${stats.secrets_count} configured`);
|
|
169
|
+
console.log();
|
|
170
|
+
// Deployments
|
|
171
|
+
if (deployments.length === 0) {
|
|
172
|
+
console.log(chalk.dim("No deployments yet."));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
console.log(chalk.bold("Recent Deployments:"));
|
|
176
|
+
console.log(chalk.dim(" SHA Branch Status Age Author"));
|
|
177
|
+
console.log(chalk.dim(" " + "-".repeat(70)));
|
|
178
|
+
for (let i = 0; i < deployments.length; i++) {
|
|
179
|
+
formatDeployment(deployments[i], i);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
console.log();
|
|
183
|
+
if (fromCache) {
|
|
184
|
+
console.log(chalk.dim("Run 'mcpize status --refresh' to update"));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
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,241 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Suppress dotenv v17 verbose logging
|
|
3
|
+
process.env.DOTENV_CONFIG_QUIET = "true";
|
|
4
|
+
import { config } from "dotenv";
|
|
5
|
+
// Load .env from current directory (for local development)
|
|
6
|
+
config();
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
import { loginCommand } from "./commands/login.js";
|
|
10
|
+
import { logoutCommand } from "./commands/logout.js";
|
|
11
|
+
import { deployCommand } from "./commands/deploy.js";
|
|
12
|
+
import { linkCommand } from "./commands/link.js";
|
|
13
|
+
import { initCommand } from "./commands/init.js";
|
|
14
|
+
import { secretsListCommand, secretsSetCommand, secretsDeleteCommand, secretsExportCommand, } from "./commands/secrets.js";
|
|
15
|
+
import { logsCommand } from "./commands/logs.js";
|
|
16
|
+
import { statusCommand } from "./commands/status.js";
|
|
17
|
+
import { doctorCommand } from "./commands/doctor.js";
|
|
18
|
+
import { setTokenOverride } from "./lib/auth.js";
|
|
19
|
+
const program = new Command();
|
|
20
|
+
program
|
|
21
|
+
.name("mcpize")
|
|
22
|
+
.description("MCPize CLI - Deploy MCP servers to the cloud")
|
|
23
|
+
.version("1.0.0")
|
|
24
|
+
.option("--token <token>", "API token (overrides MCPIZE_TOKEN env and saved session)")
|
|
25
|
+
.hook("preAction", (thisCommand) => {
|
|
26
|
+
const opts = thisCommand.opts();
|
|
27
|
+
if (opts.token) {
|
|
28
|
+
setTokenOverride(opts.token);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
program
|
|
32
|
+
.command("init [name]")
|
|
33
|
+
.description("Create a new MCP server project")
|
|
34
|
+
.option("-t, --template <template>", "Template to use (e.g., typescript, openapi)")
|
|
35
|
+
.option("--dir <path>", "Target directory")
|
|
36
|
+
.option("--no-install", "Skip dependency installation")
|
|
37
|
+
.option("--no-git", "Skip git initialization")
|
|
38
|
+
// Template-specific options (passed to post-init script via env)
|
|
39
|
+
.option("--from-url <url>", "OpenAPI spec URL to generate from")
|
|
40
|
+
.option("--from-file <path>", "Local OpenAPI spec file to generate from")
|
|
41
|
+
.allowUnknownOption(true) // Allow any options for future templates
|
|
42
|
+
.action(async (name, options) => {
|
|
43
|
+
try {
|
|
44
|
+
await initCommand(name, options);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
program
|
|
52
|
+
.command("login")
|
|
53
|
+
.description("Authenticate with MCPize via browser")
|
|
54
|
+
.action(async () => {
|
|
55
|
+
try {
|
|
56
|
+
await loginCommand();
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
program
|
|
64
|
+
.command("logout")
|
|
65
|
+
.description("Log out from MCPize")
|
|
66
|
+
.action(async () => {
|
|
67
|
+
try {
|
|
68
|
+
await logoutCommand();
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
program
|
|
76
|
+
.command("deploy")
|
|
77
|
+
.description("Deploy current project to MCPize")
|
|
78
|
+
.option("--no-wait", "Don't wait for deployment to complete (just trigger and exit)")
|
|
79
|
+
.option("--notes <notes>", "Add deployment notes")
|
|
80
|
+
.option("-y, --yes", "Auto-create server if not linked (non-interactive)")
|
|
81
|
+
.action(async (options) => {
|
|
82
|
+
try {
|
|
83
|
+
await deployCommand(options);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
program
|
|
91
|
+
.command("whoami")
|
|
92
|
+
.description("Display current authenticated user")
|
|
93
|
+
.action(async () => {
|
|
94
|
+
const { getToken } = await import("./lib/config.js");
|
|
95
|
+
const token = getToken();
|
|
96
|
+
if (!token) {
|
|
97
|
+
console.log(chalk.yellow("Not logged in. Run: mcpize login"));
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
console.log(chalk.green("Authenticated"));
|
|
101
|
+
console.log(chalk.dim(`Token: ${token.slice(0, 8)}...${token.slice(-4)}`));
|
|
102
|
+
});
|
|
103
|
+
program
|
|
104
|
+
.command("link")
|
|
105
|
+
.description("Link current directory to an existing MCPize server")
|
|
106
|
+
.option("--server <id>", "Server ID to link to")
|
|
107
|
+
.option("--force", "Force re-link even if already linked")
|
|
108
|
+
.action(async (options) => {
|
|
109
|
+
try {
|
|
110
|
+
await linkCommand(options);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// Secrets command group
|
|
118
|
+
const secrets = program
|
|
119
|
+
.command("secrets")
|
|
120
|
+
.description("Manage environment secrets");
|
|
121
|
+
secrets
|
|
122
|
+
.command("list")
|
|
123
|
+
.description("List all secrets (names only)")
|
|
124
|
+
.option("-e, --environment <env>", "Environment (production, staging, preview)", "production")
|
|
125
|
+
.option("--server <id>", "Server ID (uses linked project if not specified)")
|
|
126
|
+
.action(async (options) => {
|
|
127
|
+
try {
|
|
128
|
+
await secretsListCommand(options);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
secrets
|
|
136
|
+
.command("set <name> [value]")
|
|
137
|
+
.description("Set a secret (value can be piped or entered interactively)")
|
|
138
|
+
.option("-e, --environment <env>", "Environment (production, staging, preview)", "production")
|
|
139
|
+
.option("--server <id>", "Server ID (uses linked project if not specified)")
|
|
140
|
+
.option("--required", "Mark secret as required for deployment")
|
|
141
|
+
.option("--from-file <path>", "Read secret value from file")
|
|
142
|
+
.action(async (name, value, options) => {
|
|
143
|
+
try {
|
|
144
|
+
await secretsSetCommand(name, value, options);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
secrets
|
|
152
|
+
.command("delete <name>")
|
|
153
|
+
.alias("rm")
|
|
154
|
+
.description("Delete a secret")
|
|
155
|
+
.option("-e, --environment <env>", "Environment (production, staging, preview)", "production")
|
|
156
|
+
.option("--server <id>", "Server ID (uses linked project if not specified)")
|
|
157
|
+
.action(async (name, options) => {
|
|
158
|
+
try {
|
|
159
|
+
await secretsDeleteCommand(name, options);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
secrets
|
|
167
|
+
.command("export")
|
|
168
|
+
.description("Export secrets with values (use with caution)")
|
|
169
|
+
.option("-e, --environment <env>", "Environment (production, staging, preview)", "production")
|
|
170
|
+
.option("--server <id>", "Server ID (uses linked project if not specified)")
|
|
171
|
+
.option("-f, --format <format>", "Output format: env, json", "env")
|
|
172
|
+
.action(async (options) => {
|
|
173
|
+
try {
|
|
174
|
+
await secretsExportCommand(options);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// Logs command (proxies to Google Cloud Logging)
|
|
182
|
+
program
|
|
183
|
+
.command("logs")
|
|
184
|
+
.description("View deployment and runtime logs from Cloud Logging")
|
|
185
|
+
.option("--server <id>", "Server ID (uses linked project if not specified)")
|
|
186
|
+
.option("-d, --deployment <id>", "Filter by deployment ID")
|
|
187
|
+
.option("-t, --type <type>", "Log type: build, runtime, bridge", "runtime")
|
|
188
|
+
.option("-s, --severity <level>", "Minimum severity: DEBUG, INFO, WARNING, ERROR")
|
|
189
|
+
.option("--since <duration>", "Show logs since (e.g., 1h, 30m, 24h)")
|
|
190
|
+
.option("-n, --tail <lines>", "Number of lines to show", "50")
|
|
191
|
+
.option("-f, --follow", "Follow log output (requires Supabase Realtime)")
|
|
192
|
+
.option("--json", "Output in JSON format")
|
|
193
|
+
.option("--refresh", "Force refresh from API (ignore cache)")
|
|
194
|
+
.action(async (options) => {
|
|
195
|
+
try {
|
|
196
|
+
await logsCommand({
|
|
197
|
+
...options,
|
|
198
|
+
severity: options.severity?.toUpperCase(),
|
|
199
|
+
tail: options.tail ? parseInt(options.tail, 10) : 50,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
// Status command
|
|
208
|
+
program
|
|
209
|
+
.command("status")
|
|
210
|
+
.description("Show server status, deployments, and usage stats")
|
|
211
|
+
.option("--server <id>", "Server ID (uses linked project if not specified)")
|
|
212
|
+
.option("--json", "Output in JSON format")
|
|
213
|
+
.option("--refresh", "Force refresh from API (ignore cache)")
|
|
214
|
+
.action(async (options) => {
|
|
215
|
+
try {
|
|
216
|
+
await statusCommand(options);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
// Doctor command
|
|
224
|
+
program
|
|
225
|
+
.command("doctor")
|
|
226
|
+
.description("Run local diagnostics and pre-deploy validation")
|
|
227
|
+
.option("--manifest", "Check mcpize.yaml only")
|
|
228
|
+
.option("--dockerfile", "Check Dockerfile only")
|
|
229
|
+
.option("--fix", "Attempt automatic fixes (not yet implemented)")
|
|
230
|
+
.action(async (options) => {
|
|
231
|
+
try {
|
|
232
|
+
await doctorCommand(options);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
// Parse arguments
|
|
240
|
+
program.parse();
|
|
241
|
+
//# sourceMappingURL=index.js.map
|