percher 0.2.11 → 0.4.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/bin/percher.js +7532 -3049
- package/dist/package.json +45 -0
- package/dist/src/ci-env.d.ts +6 -0
- package/dist/src/ci-env.d.ts.map +1 -0
- package/dist/src/ci-env.js +35 -0
- package/dist/src/ci-env.js.map +1 -0
- package/dist/src/cli-utils.d.ts +44 -0
- package/dist/src/cli-utils.d.ts.map +1 -0
- package/dist/src/cli-utils.js +129 -0
- package/dist/src/cli-utils.js.map +1 -0
- package/dist/src/commands/account.d.ts +4 -0
- package/dist/src/commands/account.d.ts.map +1 -0
- package/dist/src/commands/account.js +280 -0
- package/dist/src/commands/account.js.map +1 -0
- package/dist/src/commands/apps.d.ts +13 -0
- package/dist/src/commands/apps.d.ts.map +1 -0
- package/dist/src/commands/apps.js +483 -0
- package/dist/src/commands/apps.js.map +1 -0
- package/dist/src/commands/auth.d.ts +4 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +21 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/data.d.ts +4 -0
- package/dist/src/commands/data.d.ts.map +1 -0
- package/dist/src/commands/data.js +148 -0
- package/dist/src/commands/data.js.map +1 -0
- package/dist/src/commands/deploys.d.ts +4 -0
- package/dist/src/commands/deploys.d.ts.map +1 -0
- package/dist/src/commands/deploys.js +197 -0
- package/dist/src/commands/deploys.js.map +1 -0
- package/dist/src/commands/env.d.ts +4 -0
- package/dist/src/commands/env.d.ts.map +1 -0
- package/dist/src/commands/env.js +66 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/github.d.ts +4 -0
- package/dist/src/commands/github.d.ts.map +1 -0
- package/dist/src/commands/github.js +93 -0
- package/dist/src/commands/github.js.map +1 -0
- package/dist/src/commands/status.d.ts +4 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +53 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/env-set-input.d.ts +13 -0
- package/dist/src/env-set-input.d.ts.map +1 -0
- package/dist/src/env-set-input.js +59 -0
- package/dist/src/env-set-input.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +19 -790
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompt-hidden.d.ts +15 -0
- package/dist/src/prompt-hidden.d.ts.map +1 -0
- package/dist/src/prompt-hidden.js +104 -0
- package/dist/src/prompt-hidden.js.map +1 -0
- package/dist/src/telemetry.d.ts +1 -1
- package/dist/src/telemetry.d.ts.map +1 -1
- package/dist/src/telemetry.js +8 -1
- package/dist/src/telemetry.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as core from "@percher/core";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { SilentExitError, writeLine } from "../cli-utils";
|
|
4
|
+
export function registerStatusCommands(cli, ctx) {
|
|
5
|
+
cli
|
|
6
|
+
.command("status", "Show Percher platform status (API + worker health)")
|
|
7
|
+
.option("--json", "Output JSON instead of formatted text")
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
const result = await core.status(ctx, { json: Boolean(options.json) });
|
|
10
|
+
if (options.json) {
|
|
11
|
+
await writeLine(ctx, JSON.stringify(result, null, 2));
|
|
12
|
+
if (result.verdict === "unreachable")
|
|
13
|
+
throw new SilentExitError(1);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
await renderHumanStatus(ctx, result);
|
|
17
|
+
if (result.verdict === "unreachable")
|
|
18
|
+
throw new SilentExitError(1);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async function renderHumanStatus(ctx, result) {
|
|
22
|
+
const symbol = result.verdict === "operational"
|
|
23
|
+
? pc.green("✓")
|
|
24
|
+
: result.verdict === "worker-degraded"
|
|
25
|
+
? pc.yellow("⚠")
|
|
26
|
+
: pc.red("✗");
|
|
27
|
+
await writeLine(ctx, `${symbol} ${result.summary}`);
|
|
28
|
+
if (!result.health)
|
|
29
|
+
return;
|
|
30
|
+
const worker = result.health.worker;
|
|
31
|
+
if (!worker) {
|
|
32
|
+
// Local dev / non-prod API — no worker daemon configured. Don't
|
|
33
|
+
// pretend there's a worker; just say so.
|
|
34
|
+
await writeLine(ctx, pc.dim(" worker: not configured (local Docker socket)"));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (worker.health) {
|
|
38
|
+
const ok = worker.health.ok;
|
|
39
|
+
const symbol = ok ? pc.green("✓") : pc.red("✗");
|
|
40
|
+
const lastOk = worker.health.lastOkAt ?? "never";
|
|
41
|
+
await writeLine(ctx, ` ${symbol} worker health: ${ok ? "ok" : `failing (${worker.health.consecutiveErrs} consecutive)`} last-ok=${pc.dim(lastOk)}`);
|
|
42
|
+
}
|
|
43
|
+
if (worker.circuitBreaker) {
|
|
44
|
+
const breaker = worker.circuitBreaker;
|
|
45
|
+
const symbol = breaker.open ? pc.red("✗") : pc.green("✓");
|
|
46
|
+
const state = breaker.open ? "open (deploys fail fast)" : "closed";
|
|
47
|
+
await writeLine(ctx, ` ${symbol} circuit breaker: ${state} ${breaker.failuresInWindow}/${breaker.threshold} failures in last ${Math.round(breaker.windowMs / 1000)}s`);
|
|
48
|
+
}
|
|
49
|
+
if (result.health.version) {
|
|
50
|
+
await writeLine(ctx, pc.dim(` api version: ${result.health.version}`));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# 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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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class EnvSetInputError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export interface ResolveEnvSetInputsArgs {
|
|
5
|
+
args: string[];
|
|
6
|
+
fromStdin: boolean | undefined;
|
|
7
|
+
fromFile: string | undefined;
|
|
8
|
+
readStdin: () => Promise<string>;
|
|
9
|
+
readFile: (path: string) => Promise<string>;
|
|
10
|
+
promptHidden: (question: string) => Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveEnvSetInputs(opts: ResolveEnvSetInputsArgs): Promise<Record<string, string>>;
|
|
13
|
+
//# sourceMappingURL=env-set-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-set-input.d.ts","sourceRoot":"","sources":["../../src/env-set-input.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD;AAUD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiDjC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export class EnvSetInputError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "EnvSetInputError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
function trimTrailingNewline(s) {
|
|
8
|
+
return s.replace(/\r?\n$/, "");
|
|
9
|
+
}
|
|
10
|
+
function isBareKey(arg) {
|
|
11
|
+
return !arg.includes("=");
|
|
12
|
+
}
|
|
13
|
+
export async function resolveEnvSetInputs(opts) {
|
|
14
|
+
const { args, fromStdin, fromFile } = opts;
|
|
15
|
+
if (fromStdin && fromFile) {
|
|
16
|
+
throw new EnvSetInputError("Cannot combine --from-stdin and --from-file");
|
|
17
|
+
}
|
|
18
|
+
// Source-flag mode: exactly one bare KEY argument.
|
|
19
|
+
if (fromStdin || fromFile) {
|
|
20
|
+
if (args.length !== 1) {
|
|
21
|
+
throw new EnvSetInputError("--from-stdin/--from-file expects exactly one KEY (without =VALUE)");
|
|
22
|
+
}
|
|
23
|
+
const key = args[0] ?? "";
|
|
24
|
+
if (!isBareKey(key)) {
|
|
25
|
+
throw new EnvSetInputError("--from-stdin/--from-file expects bare KEY, not KEY=VALUE");
|
|
26
|
+
}
|
|
27
|
+
const raw = fromStdin ? await opts.readStdin() : await opts.readFile(fromFile ?? "");
|
|
28
|
+
const value = trimTrailingNewline(raw);
|
|
29
|
+
if (value.length === 0) {
|
|
30
|
+
throw new EnvSetInputError(`Empty value for ${key}`);
|
|
31
|
+
}
|
|
32
|
+
return { [key]: value };
|
|
33
|
+
}
|
|
34
|
+
// Mixed mode: each arg is either KEY=VALUE or bare KEY (→ prompt).
|
|
35
|
+
const out = {};
|
|
36
|
+
for (const arg of args) {
|
|
37
|
+
if (isBareKey(arg)) {
|
|
38
|
+
const value = await opts.promptHidden(`Value for ${arg}:`);
|
|
39
|
+
if (value.length === 0) {
|
|
40
|
+
throw new EnvSetInputError(`Empty value for ${arg}`);
|
|
41
|
+
}
|
|
42
|
+
out[arg] = value;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const eqIdx = arg.indexOf("=");
|
|
46
|
+
const key = arg.slice(0, eqIdx);
|
|
47
|
+
const value = arg.slice(eqIdx + 1);
|
|
48
|
+
if (key.length === 0) {
|
|
49
|
+
throw new EnvSetInputError(`Empty key in "${arg}"`);
|
|
50
|
+
}
|
|
51
|
+
if (value.length === 0) {
|
|
52
|
+
throw new EnvSetInputError(`Empty value for ${key}`);
|
|
53
|
+
}
|
|
54
|
+
out[key] = value;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=env-set-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-set-input.js","sourceRoot":"","sources":["../../src/env-set-input.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAgB7C,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAoChF"}
|