@numa-tech/numa 1.12.10 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -14
- package/dist/ai-registry/commands.js +33 -33
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/app-config.d.ts +0 -1
- package/dist/app-config.js +4 -2
- package/dist/app-config.js.map +1 -1
- package/dist/application-onboarding/client.d.ts +83 -8
- package/dist/application-onboarding/client.js +23 -1
- package/dist/application-onboarding/client.js.map +1 -1
- package/dist/application-onboarding/commands.js +66 -4
- package/dist/application-onboarding/commands.js.map +1 -1
- package/dist/application-onboarding/schemas.d.ts +301 -58
- package/dist/application-onboarding/schemas.js +134 -8
- package/dist/application-onboarding/schemas.js.map +1 -1
- package/dist/application-onboarding/tui-model.d.ts +18 -0
- package/dist/application-onboarding/tui-model.js +215 -3
- package/dist/application-onboarding/tui-model.js.map +1 -1
- package/dist/application-onboarding/tui.d.ts +1 -1
- package/dist/application-onboarding/tui.js +20 -6
- package/dist/application-onboarding/tui.js.map +1 -1
- package/dist/authorization/access-request-client.d.ts +45 -0
- package/dist/authorization/access-request-client.js +93 -0
- package/dist/authorization/access-request-client.js.map +1 -0
- package/dist/authorization/access-request-commands.d.ts +25 -0
- package/dist/authorization/access-request-commands.js +196 -0
- package/dist/authorization/access-request-commands.js.map +1 -0
- package/dist/authorization/access-request-schemas.d.ts +123 -0
- package/dist/authorization/access-request-schemas.js +67 -0
- package/dist/authorization/access-request-schemas.js.map +1 -0
- package/dist/authorization/client.d.ts +50 -0
- package/dist/authorization/client.js +113 -0
- package/dist/authorization/client.js.map +1 -0
- package/dist/authorization/commands.d.ts +40 -0
- package/dist/authorization/commands.js +296 -0
- package/dist/authorization/commands.js.map +1 -0
- package/dist/authorization/errors.d.ts +13 -0
- package/dist/authorization/errors.js +70 -0
- package/dist/authorization/errors.js.map +1 -0
- package/dist/authorization/schemas.d.ts +187 -0
- package/dist/authorization/schemas.js +101 -0
- package/dist/authorization/schemas.js.map +1 -0
- package/dist/cli.js +73 -9
- package/dist/cli.js.map +1 -1
- package/dist/clusters/client.d.ts +436 -0
- package/dist/clusters/client.js +207 -0
- package/dist/clusters/client.js.map +1 -0
- package/dist/clusters/commands.d.ts +11 -0
- package/dist/clusters/commands.js +373 -0
- package/dist/clusters/commands.js.map +1 -0
- package/dist/clusters/errors.d.ts +10 -0
- package/dist/clusters/errors.js +61 -0
- package/dist/clusters/errors.js.map +1 -0
- package/dist/clusters/kubeconfig-discovery.d.ts +48 -0
- package/dist/clusters/kubeconfig-discovery.js +280 -0
- package/dist/clusters/kubeconfig-discovery.js.map +1 -0
- package/dist/clusters/schemas.d.ts +510 -0
- package/dist/clusters/schemas.js +201 -0
- package/dist/clusters/schemas.js.map +1 -0
- package/dist/command-catalog.js +490 -26
- package/dist/command-catalog.js.map +1 -1
- package/dist/gitops/client.d.ts +499 -0
- package/dist/gitops/client.js +163 -0
- package/dist/gitops/client.js.map +1 -0
- package/dist/gitops/commands.d.ts +11 -0
- package/dist/gitops/commands.js +367 -0
- package/dist/gitops/commands.js.map +1 -0
- package/dist/gitops/errors.d.ts +10 -0
- package/dist/gitops/errors.js +59 -0
- package/dist/gitops/errors.js.map +1 -0
- package/dist/gitops/schemas.d.ts +1712 -0
- package/dist/gitops/schemas.js +360 -0
- package/dist/gitops/schemas.js.map +1 -0
- package/dist/repositories/client.d.ts +540 -0
- package/dist/repositories/client.js +215 -0
- package/dist/repositories/client.js.map +1 -0
- package/dist/repositories/commands.d.ts +10 -0
- package/dist/repositories/commands.js +347 -0
- package/dist/repositories/commands.js.map +1 -0
- package/dist/repositories/errors.d.ts +10 -0
- package/dist/repositories/errors.js +60 -0
- package/dist/repositories/errors.js.map +1 -0
- package/dist/repositories/schemas.d.ts +1692 -0
- package/dist/repositories/schemas.js +255 -0
- package/dist/repositories/schemas.js.map +1 -0
- package/dist/web-console-page.d.ts +1 -1
- package/dist/web-console-page.js +1 -1
- package/dist/web-console.js +2 -2
- package/dist/web-console.js.map +1 -1
- package/examples/ai-registry/README.md +18 -0
- package/examples/ai-registry/nacos-instance.username-password.example.json +25 -0
- package/package.json +4 -4
- package/skills/numa-ai-registry/SKILL.md +5 -5
- package/skills/numa-ai-registry/evals/evals.json +1 -1
- package/skills/numa-ai-registry/references/command-contract.md +22 -22
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { resolveBackendUrl } from "../backend.js";
|
|
2
|
+
import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
|
|
3
|
+
import { GitOpsError, redactGitOpsText } from "./errors.js";
|
|
4
|
+
import { GitOpsApiErrorSchema, GitOpsChangeEventListSchema, GitOpsChangeRunDetailSchema, GitOpsChangeRunExecutionSchema, GitOpsImportResultSchema, GitOpsImageUpdateListSchema, GitOpsPlanSchema, GitOpsProfileListSchema, GitOpsProfileSchema, GitOpsRepositoryListSchema, GitOpsRepositoryProbeSchema, GitOpsRepositorySchema, GitOpsTargetListSchema, GitOpsTargetObservationListSchema, GitOpsTargetSchema, GitOpsTargetValidationSchema } from "./schemas.js";
|
|
5
|
+
export const GITOPS_ADMIN_API_ROOT = "/api/v1/admin/gitops";
|
|
6
|
+
export const GITOPS_API_ROOT = "/api/v1/gitops";
|
|
7
|
+
export const GITOPS_SERVICE_BINDINGS_ROOT = `${GITOPS_API_ROOT}/service-bindings`;
|
|
8
|
+
export const GITOPS_CHANGE_RUNS_ROOT = `${GITOPS_API_ROOT}/change-runs`;
|
|
9
|
+
export const GITOPS_CONTRACT_VERSION = "v1";
|
|
10
|
+
function safeIdentifier(value, label) {
|
|
11
|
+
const trimmed = value.trim();
|
|
12
|
+
if (!trimmed || trimmed.length > 256 || /[/?#\\\u0000-\u001f\u007f]/u.test(trimmed)) {
|
|
13
|
+
throw new GitOpsError(`${label} is invalid.`, "GITOPS_CLI_INPUT_INVALID");
|
|
14
|
+
}
|
|
15
|
+
return trimmed;
|
|
16
|
+
}
|
|
17
|
+
function queryPath(path, values) {
|
|
18
|
+
const query = new URLSearchParams();
|
|
19
|
+
for (const [key, value] of Object.entries(values)) {
|
|
20
|
+
if (value != null && value !== "")
|
|
21
|
+
query.set(key, String(value));
|
|
22
|
+
}
|
|
23
|
+
return query.size ? `${path}?${query.toString()}` : path;
|
|
24
|
+
}
|
|
25
|
+
async function responseBody(response) {
|
|
26
|
+
const text = await response.text();
|
|
27
|
+
if (!text)
|
|
28
|
+
return {};
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(text);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return text;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function requestIdFrom(response, body) {
|
|
37
|
+
if (body && typeof body === "object" && "requestId" in body && typeof body.requestId === "string")
|
|
38
|
+
return body.requestId;
|
|
39
|
+
if (body && typeof body === "object" && "error" in body && body.error && typeof body.error === "object"
|
|
40
|
+
&& "requestId" in body.error && typeof body.error.requestId === "string")
|
|
41
|
+
return body.error.requestId;
|
|
42
|
+
return response.headers.get("x-request-id") ?? undefined;
|
|
43
|
+
}
|
|
44
|
+
function apiFailure(response, body) {
|
|
45
|
+
const parsed = GitOpsApiErrorSchema.safeParse(body);
|
|
46
|
+
const message = parsed.success
|
|
47
|
+
? parsed.data.message ?? response.statusText ?? "GitOps API request failed."
|
|
48
|
+
: typeof body === "string" ? body : response.statusText || "GitOps API request failed.";
|
|
49
|
+
return new GitOpsError(`GitOps API HTTP ${response.status}: ${redactGitOpsText(message)}`, parsed.success ? parsed.data.code ?? "GITOPS_API_ERROR" : "GITOPS_API_ERROR", response.status, requestIdFrom(response, body), parsed.success ? parsed.data.details : undefined);
|
|
50
|
+
}
|
|
51
|
+
export class GitOpsClient {
|
|
52
|
+
config;
|
|
53
|
+
fetchImpl;
|
|
54
|
+
tokenProvider;
|
|
55
|
+
constructor(config, dependencies = {}) {
|
|
56
|
+
this.config = config;
|
|
57
|
+
this.fetchImpl = dependencies.fetch ?? fetch;
|
|
58
|
+
this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
|
|
59
|
+
}
|
|
60
|
+
async authenticatedFetch(path, init = {}) {
|
|
61
|
+
const url = resolveBackendUrl(this.config, { method: "GET", path });
|
|
62
|
+
const headers = new Headers(init.headers);
|
|
63
|
+
headers.set("Accept", "application/json");
|
|
64
|
+
headers.set("X-Numa-GitOps-Contract", GITOPS_CONTRACT_VERSION);
|
|
65
|
+
if (init.body != null)
|
|
66
|
+
headers.set("Content-Type", "application/json");
|
|
67
|
+
return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), {
|
|
68
|
+
fetch: this.fetchImpl,
|
|
69
|
+
tokenProvider: this.tokenProvider
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async json(path, schema, init = {}, expectedStatuses) {
|
|
73
|
+
const response = await this.authenticatedFetch(path, init);
|
|
74
|
+
const body = await responseBody(response);
|
|
75
|
+
if (!response.ok)
|
|
76
|
+
throw apiFailure(response, body);
|
|
77
|
+
if (expectedStatuses && !expectedStatuses.includes(response.status)) {
|
|
78
|
+
throw new GitOpsError(`GitOps API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "GITOPS_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
|
|
79
|
+
}
|
|
80
|
+
const parsed = schema.safeParse(body);
|
|
81
|
+
if (!parsed.success) {
|
|
82
|
+
throw new GitOpsError(`GitOps API returned an invalid response: ${parsed.error.message}`, "GITOPS_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
|
|
83
|
+
}
|
|
84
|
+
return parsed.data;
|
|
85
|
+
}
|
|
86
|
+
listRepositories(options = {}) {
|
|
87
|
+
return this.json(queryPath(`${GITOPS_ADMIN_API_ROOT}/repositories`, {
|
|
88
|
+
status: options.status, search: options.search, cursor: options.cursor, limit: options.limit
|
|
89
|
+
}), GitOpsRepositoryListSchema);
|
|
90
|
+
}
|
|
91
|
+
getRepository(repositoryKey) {
|
|
92
|
+
return this.json(`${GITOPS_ADMIN_API_ROOT}/repositories/${encodeURIComponent(safeIdentifier(repositoryKey, "repository-key"))}`, GitOpsRepositorySchema);
|
|
93
|
+
}
|
|
94
|
+
probeRepository(repositoryKey) {
|
|
95
|
+
return this.json(`${GITOPS_ADMIN_API_ROOT}/repositories/${encodeURIComponent(safeIdentifier(repositoryKey, "repository-key"))}/probe`, GitOpsRepositoryProbeSchema, {
|
|
96
|
+
method: "POST", body: "{}"
|
|
97
|
+
}, [200, 202]);
|
|
98
|
+
}
|
|
99
|
+
listTargets(options = {}) {
|
|
100
|
+
return this.json(queryPath(`${GITOPS_ADMIN_API_ROOT}/deployment-targets`, {
|
|
101
|
+
status: options.status,
|
|
102
|
+
environmentId: options.environmentId,
|
|
103
|
+
cursor: options.cursor,
|
|
104
|
+
limit: options.limit
|
|
105
|
+
}), GitOpsTargetListSchema);
|
|
106
|
+
}
|
|
107
|
+
getTarget(targetKey) {
|
|
108
|
+
return this.json(`${GITOPS_ADMIN_API_ROOT}/deployment-targets/${encodeURIComponent(safeIdentifier(targetKey, "target-key"))}`, GitOpsTargetSchema);
|
|
109
|
+
}
|
|
110
|
+
validateTarget(targetKey) {
|
|
111
|
+
return this.json(`${GITOPS_ADMIN_API_ROOT}/deployment-targets/${encodeURIComponent(safeIdentifier(targetKey, "target-key"))}/validate`, GitOpsTargetValidationSchema, {
|
|
112
|
+
method: "POST", body: "{}"
|
|
113
|
+
}, [200, 202]);
|
|
114
|
+
}
|
|
115
|
+
listProfiles(options = {}) {
|
|
116
|
+
return this.json(queryPath(`${GITOPS_ADMIN_API_ROOT}/layout-profiles`, {
|
|
117
|
+
status: options.status, search: options.search, cursor: options.cursor, limit: options.limit
|
|
118
|
+
}), GitOpsProfileListSchema);
|
|
119
|
+
}
|
|
120
|
+
getProfile(profileCode) {
|
|
121
|
+
return this.json(`${GITOPS_ADMIN_API_ROOT}/layout-profiles/${encodeURIComponent(safeIdentifier(profileCode, "profile-code"))}`, GitOpsProfileSchema);
|
|
122
|
+
}
|
|
123
|
+
importService(input) {
|
|
124
|
+
return this.json(`${GITOPS_SERVICE_BINDINGS_ROOT}/import`, GitOpsImportResultSchema, {
|
|
125
|
+
method: "POST",
|
|
126
|
+
headers: { "Idempotency-Key": input.idempotencyKey },
|
|
127
|
+
body: JSON.stringify({
|
|
128
|
+
applicationCode: input.applicationCode,
|
|
129
|
+
targetKey: input.targetKey,
|
|
130
|
+
...(input.profileCode ? { profileCode: input.profileCode } : {}),
|
|
131
|
+
...(input.profileVersion ? { profileVersion: input.profileVersion } : {})
|
|
132
|
+
})
|
|
133
|
+
}, [200, 201, 202]);
|
|
134
|
+
}
|
|
135
|
+
planService(input) {
|
|
136
|
+
return this.json(`${GITOPS_SERVICE_BINDINGS_ROOT}/plans`, GitOpsPlanSchema, {
|
|
137
|
+
method: "POST",
|
|
138
|
+
body: JSON.stringify(input)
|
|
139
|
+
}, [200, 201]);
|
|
140
|
+
}
|
|
141
|
+
applyServicePlan(input) {
|
|
142
|
+
return this.json(GITOPS_CHANGE_RUNS_ROOT, GitOpsChangeRunExecutionSchema, {
|
|
143
|
+
method: "POST",
|
|
144
|
+
headers: { "Idempotency-Key": input.idempotencyKey },
|
|
145
|
+
body: JSON.stringify({ planNumber: input.planNumber, planHash: input.planHash })
|
|
146
|
+
}, [202]);
|
|
147
|
+
}
|
|
148
|
+
getChangeRun(identifier) {
|
|
149
|
+
return this.json(`${GITOPS_CHANGE_RUNS_ROOT}/${encodeURIComponent(safeIdentifier(identifier, "run-number"))}`, GitOpsChangeRunDetailSchema, {}, [200]);
|
|
150
|
+
}
|
|
151
|
+
getChangeEvents(identifier) {
|
|
152
|
+
return this.json(`${GITOPS_CHANGE_RUNS_ROOT}/${encodeURIComponent(safeIdentifier(identifier, "run-number"))}/events`, GitOpsChangeEventListSchema, {}, [200]);
|
|
153
|
+
}
|
|
154
|
+
getServiceImageUpdates(bindingId) {
|
|
155
|
+
const id = encodeURIComponent(safeIdentifier(bindingId, "service-binding-id"));
|
|
156
|
+
return this.json(`${GITOPS_SERVICE_BINDINGS_ROOT}/${id}/image-updates`, GitOpsImageUpdateListSchema, {}, [200]);
|
|
157
|
+
}
|
|
158
|
+
getServiceTargetObservations(bindingId) {
|
|
159
|
+
const id = encodeURIComponent(safeIdentifier(bindingId, "service-binding-id"));
|
|
160
|
+
return this.json(`${GITOPS_SERVICE_BINDINGS_ROOT}/${id}/target-observations`, GitOpsTargetObservationListSchema, {}, [200]);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/gitops/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { GitOpsClient } from "./client.js";
|
|
3
|
+
import { type JsonObject } from "./schemas.js";
|
|
4
|
+
export interface GitOpsCommandDependencies {
|
|
5
|
+
clientFactory?: () => GitOpsClient;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseGitOpsIdentifier(value: string | undefined, label: string): string;
|
|
8
|
+
export declare function parseGitOpsIdempotencyKey(value: string | undefined, required?: boolean): string;
|
|
9
|
+
export declare function parseGitOpsPlanHash(value: string | undefined): string;
|
|
10
|
+
export declare function readGitOpsSpec(file: string): Promise<JsonObject>;
|
|
11
|
+
export declare function registerGitOpsCommands(program: Command, dependencies?: GitOpsCommandDependencies): void;
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFile, stat } from "node:fs/promises";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { loadAppConfig } from "../app-config.js";
|
|
5
|
+
import { loadConfig } from "../config.js";
|
|
6
|
+
import { GitOpsClient } from "./client.js";
|
|
7
|
+
import { GitOpsError, sanitizeGitOpsOutput } from "./errors.js";
|
|
8
|
+
const MAX_SPEC_BYTES = 1024 * 1024;
|
|
9
|
+
const SAFE_OPAQUE_VALUE = /^[A-Za-z0-9][A-Za-z0-9._:/+-]*$/u;
|
|
10
|
+
const ALLOWED_SPEC_ROOT_FIELDS = new Set([
|
|
11
|
+
"workloadKind", "chart", "workload", "service", "probes", "ingress",
|
|
12
|
+
"environment", "secretEnvironment", "advancedValues"
|
|
13
|
+
]);
|
|
14
|
+
const MANAGED_SPEC_FIELDS = new Set([
|
|
15
|
+
"image", "appcode", "applicationcode", "environmentid", "targetkey",
|
|
16
|
+
"repositorykey", "repositoryurl", "repourl", "cloneurl",
|
|
17
|
+
"writebranch", "reconcilebranch", "overlaypath", "basepath", "imageconfigpath",
|
|
18
|
+
"repositoryyamlpointer", "tagyamlpointer", "namespace", "releasename", "imagetag"
|
|
19
|
+
]);
|
|
20
|
+
const SENSITIVE_ENV_NAME = /(password|passwd|secret|token|credential|api.?key|access.?key|private.?key)/iu;
|
|
21
|
+
function addExamples(command, examples, notes = []) {
|
|
22
|
+
const noteSection = notes.length
|
|
23
|
+
? `\n说明:\n${notes.map((item) => ` - ${item}`).join("\n")}\n`
|
|
24
|
+
: "";
|
|
25
|
+
return command.addHelpText("after", `${noteSection}\nExamples:\n${examples.map((item) => ` ${item}`).join("\n")}\n`);
|
|
26
|
+
}
|
|
27
|
+
function snakeCase(key) {
|
|
28
|
+
return key.replace(/([a-z0-9])([A-Z])/gu, "$1_$2").toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
function stableOutput(value) {
|
|
31
|
+
const safe = sanitizeGitOpsOutput(value);
|
|
32
|
+
if (Array.isArray(safe))
|
|
33
|
+
return safe.map(stableOutput);
|
|
34
|
+
if (safe && typeof safe === "object") {
|
|
35
|
+
return Object.fromEntries(Object.entries(safe).map(([key, item]) => [snakeCase(key), stableOutput(item)]));
|
|
36
|
+
}
|
|
37
|
+
return safe;
|
|
38
|
+
}
|
|
39
|
+
async function jsonEnabled(command) {
|
|
40
|
+
const configured = await loadAppConfig();
|
|
41
|
+
return Boolean(command.optsWithGlobals().json || configured.output === "json");
|
|
42
|
+
}
|
|
43
|
+
async function output(command, payload, textValue) {
|
|
44
|
+
if (await jsonEnabled(command)) {
|
|
45
|
+
process.stdout.write(`${JSON.stringify(stableOutput(payload), null, 2)}\n`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
process.stdout.write(`${String(sanitizeGitOpsOutput(textValue))}\n`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function parseGitOpsIdentifier(value, label) {
|
|
52
|
+
const trimmed = value?.trim() ?? "";
|
|
53
|
+
if (!trimmed || trimmed.length > 256 || /[/?#\\\u0000-\u001f\u007f]/u.test(trimmed)) {
|
|
54
|
+
throw new GitOpsError(`${label} must be a non-empty stable identifier of at most 256 characters.`, "GITOPS_CLI_INPUT_INVALID");
|
|
55
|
+
}
|
|
56
|
+
return trimmed;
|
|
57
|
+
}
|
|
58
|
+
export function parseGitOpsIdempotencyKey(value, required = true) {
|
|
59
|
+
const trimmed = value?.trim() ?? "";
|
|
60
|
+
if (!trimmed && !required)
|
|
61
|
+
return randomUUID();
|
|
62
|
+
if (!trimmed || trimmed.length > 200 || !SAFE_OPAQUE_VALUE.test(trimmed)) {
|
|
63
|
+
throw new GitOpsError("idempotency-key must be 1-200 characters and contain only letters, numbers, . _ : / + -.", "GITOPS_IDEMPOTENCY_KEY_INVALID");
|
|
64
|
+
}
|
|
65
|
+
return trimmed;
|
|
66
|
+
}
|
|
67
|
+
export function parseGitOpsPlanHash(value) {
|
|
68
|
+
const trimmed = value?.trim() ?? "";
|
|
69
|
+
if (!/^[0-9a-f]{64}$/u.test(trimmed)) {
|
|
70
|
+
throw new GitOpsError("plan-hash must be the exact 64-character lower-case server hash.", "GITOPS_PLAN_HASH_INVALID");
|
|
71
|
+
}
|
|
72
|
+
return trimmed;
|
|
73
|
+
}
|
|
74
|
+
function positiveInteger(value, label, fallback, maximum) {
|
|
75
|
+
if (value == null)
|
|
76
|
+
return fallback;
|
|
77
|
+
const parsed = Number(value);
|
|
78
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > maximum) {
|
|
79
|
+
throw new GitOpsError(`${label} must be an integer between 1 and ${maximum}.`, "GITOPS_CLI_INPUT_INVALID");
|
|
80
|
+
}
|
|
81
|
+
return parsed;
|
|
82
|
+
}
|
|
83
|
+
function normalizedField(value) {
|
|
84
|
+
return value.replace(/[^A-Za-z0-9]/gu, "").toLowerCase();
|
|
85
|
+
}
|
|
86
|
+
function validateCanonicalSpec(value, path = "spec") {
|
|
87
|
+
if (Array.isArray(value)) {
|
|
88
|
+
value.forEach((item, index) => validateCanonicalSpec(item, `${path}[${index}]`));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (value == null || typeof value !== "object")
|
|
92
|
+
return;
|
|
93
|
+
const object = value;
|
|
94
|
+
if (String(object.kind ?? "").toLowerCase() === "secret"
|
|
95
|
+
&& (Object.hasOwn(object, "data") || Object.hasOwn(object, "stringData"))) {
|
|
96
|
+
throw new GitOpsError(`Raw Kubernetes Secret data is forbidden at ${path}; use an existing SecretRef or ExternalSecret.`, "GITOPS_SECRET_DATA_FORBIDDEN");
|
|
97
|
+
}
|
|
98
|
+
const insideEnvironment = /(?:^|\.)(?:env|environment|environmentvariables)(?:\[|\.|$)/iu.test(path);
|
|
99
|
+
if (insideEnvironment && typeof object.name === "string" && SENSITIVE_ENV_NAME.test(object.name)
|
|
100
|
+
&& Object.hasOwn(object, "value") && typeof object.value !== "object") {
|
|
101
|
+
throw new GitOpsError(`Plaintext sensitive environment value is forbidden at ${path}; use a SecretRef or ExternalSecret.`, "GITOPS_SECRET_DATA_FORBIDDEN");
|
|
102
|
+
}
|
|
103
|
+
for (const [key, item] of Object.entries(object)) {
|
|
104
|
+
const normalizedKey = normalizedField(key);
|
|
105
|
+
const managedImageField = /(?:^|\.)image(?:\.|$)/iu.test(path)
|
|
106
|
+
&& (normalizedKey === "repository" || normalizedKey === "tag");
|
|
107
|
+
if (MANAGED_SPEC_FIELDS.has(normalizedKey) || managedImageField) {
|
|
108
|
+
throw new GitOpsError(`${path}.${key} is platform-managed; select a target/profile instead of supplying repository, branch, namespace, release, image tag, or Flux paths.`, "GITOPS_MANAGED_FIELD_FORBIDDEN");
|
|
109
|
+
}
|
|
110
|
+
if (insideEnvironment && SENSITIVE_ENV_NAME.test(key)
|
|
111
|
+
&& item != null && typeof item !== "object") {
|
|
112
|
+
throw new GitOpsError(`Plaintext sensitive environment value is forbidden at ${path}.${key}; use a SecretRef or ExternalSecret.`, "GITOPS_SECRET_DATA_FORBIDDEN");
|
|
113
|
+
}
|
|
114
|
+
validateCanonicalSpec(item, `${path}.${key}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export async function readGitOpsSpec(file) {
|
|
118
|
+
const path = file.trim();
|
|
119
|
+
if (!path)
|
|
120
|
+
throw new GitOpsError("spec file is required.", "GITOPS_SPEC_INVALID");
|
|
121
|
+
let source;
|
|
122
|
+
try {
|
|
123
|
+
const metadata = await stat(path);
|
|
124
|
+
if (!metadata.isFile() || metadata.size > MAX_SPEC_BYTES) {
|
|
125
|
+
throw new GitOpsError("spec must be a JSON file no larger than 1 MiB.", "GITOPS_SPEC_INVALID");
|
|
126
|
+
}
|
|
127
|
+
source = await readFile(path, "utf8");
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (error instanceof GitOpsError)
|
|
131
|
+
throw error;
|
|
132
|
+
throw new GitOpsError(`Unable to read spec file: ${path}`, "GITOPS_SPEC_INVALID");
|
|
133
|
+
}
|
|
134
|
+
let parsed;
|
|
135
|
+
try {
|
|
136
|
+
parsed = JSON.parse(source);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
throw new GitOpsError("spec must contain valid JSON.", "GITOPS_SPEC_INVALID");
|
|
140
|
+
}
|
|
141
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
142
|
+
throw new GitOpsError("spec root must be a JSON object.", "GITOPS_SPEC_INVALID");
|
|
143
|
+
}
|
|
144
|
+
for (const key of Object.keys(parsed)) {
|
|
145
|
+
if (!ALLOWED_SPEC_ROOT_FIELDS.has(key)) {
|
|
146
|
+
throw new GitOpsError(`spec.${key} is not part of the MCI_FLUX_V1 structural contract or is platform-managed.`, "GITOPS_MANAGED_FIELD_FORBIDDEN");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
validateCanonicalSpec(parsed);
|
|
150
|
+
return parsed;
|
|
151
|
+
}
|
|
152
|
+
function repositoryLine(item) {
|
|
153
|
+
return `${String(item.repositoryKey ?? "-")}\t${String(item.status ?? "UNKNOWN")}\t${String(item.name ?? "-")}`;
|
|
154
|
+
}
|
|
155
|
+
function targetLine(item) {
|
|
156
|
+
return `${String(item.targetKey ?? "-")}\t${String(item.tier ?? "-")}\t${String(item.clusterCode ?? "-")}\t${String(item.envId ?? "-")}\t${String(item.namespace ?? "-")}`;
|
|
157
|
+
}
|
|
158
|
+
function profileLine(item) {
|
|
159
|
+
return `${String(item.profileCode ?? "-")}@${String(item.version ?? "-")}\t${String(item.state ?? "-")}\t${String(item.templateDigest ?? "-")}`;
|
|
160
|
+
}
|
|
161
|
+
export function registerGitOpsCommands(program, dependencies = {}) {
|
|
162
|
+
const client = () => dependencies.clientFactory?.() ?? new GitOpsClient(loadConfig());
|
|
163
|
+
const gitops = program.command("gitops")
|
|
164
|
+
.description("通过 DevOps Platform 管理多集群 GitOps 基础拓扑和受管服务变更")
|
|
165
|
+
.addHelpText("after", `
|
|
166
|
+
Phase 1/2 安全边界:
|
|
167
|
+
repository/target/profile 都使用平台 stable key;CLI 不接受任意仓库 URL、分支或本地 Flux 路径。
|
|
168
|
+
service import/plan/apply/status/events/evidence 只使用服务端锁定计划或团队范围只读证据;不开放内部 observe 写接口。
|
|
169
|
+
image.repository、image.tag、namespace、releaseName 和仓库坐标都由服务端从锁定 target/revision 派生。
|
|
170
|
+
`);
|
|
171
|
+
const repository = gitops.command("repository").description("查看和探测平台登记的 GitOps 仓库");
|
|
172
|
+
addExamples(repository.command("list")
|
|
173
|
+
.description("列出当前用户可见的 GitOps 仓库")
|
|
174
|
+
.option("--status <status>", "按健康状态过滤")
|
|
175
|
+
.option("--search <text>", "按 stable key 或名称搜索")
|
|
176
|
+
.option("--cursor <cursor>", "分页游标")
|
|
177
|
+
.option("--limit <number>", "返回条数,1-100", "20")
|
|
178
|
+
.action(async (options, command) => {
|
|
179
|
+
const result = await client().listRepositories({
|
|
180
|
+
status: options.status?.trim().toUpperCase(), search: options.search,
|
|
181
|
+
cursor: options.cursor, limit: positiveInteger(options.limit, "limit", 20, 100)
|
|
182
|
+
});
|
|
183
|
+
await output(command, { ok: true, repositories: result }, result.items.map(repositoryLine).join("\n") || "没有找到 GitOps 仓库");
|
|
184
|
+
}), ["numa gitops repository list --json"]);
|
|
185
|
+
addExamples(repository.command("get <repository-key>")
|
|
186
|
+
.description("查看 GitOps 仓库登记、策略和最近探测信息")
|
|
187
|
+
.action(async (value, _options, command) => {
|
|
188
|
+
const result = await client().getRepository(parseGitOpsIdentifier(value, "repository-key"));
|
|
189
|
+
await output(command, { ok: true, repository: result }, JSON.stringify(stableOutput(result), null, 2));
|
|
190
|
+
}), ["numa gitops repository get mci-flux --json"]);
|
|
191
|
+
addExamples(repository.command("probe <repository-key>")
|
|
192
|
+
.description("由平台使用已登记 SCM 连接探测仓库,不接收 URL 或凭据")
|
|
193
|
+
.action(async (value, _options, command) => {
|
|
194
|
+
const result = await client().probeRepository(parseGitOpsIdentifier(value, "repository-key"));
|
|
195
|
+
await output(command, { ok: result.healthy, probe: result }, `${result.repositoryKey}\t${result.status}\t${result.revision ?? "-"}`);
|
|
196
|
+
if (!result.healthy)
|
|
197
|
+
process.exitCode = 1;
|
|
198
|
+
}), ["numa gitops repository probe mci-flux --json"]);
|
|
199
|
+
const target = gitops.command("target").description("查看并检查集群、环境、Flux 仓库的登记拓扑关系");
|
|
200
|
+
addExamples(target.command("list")
|
|
201
|
+
.description("列出 Deployment targets")
|
|
202
|
+
.option("--status <status>", "按 target 状态过滤")
|
|
203
|
+
.option("--environment-id <id>", "按平台 environment ID 过滤")
|
|
204
|
+
.option("--cursor <cursor>", "分页游标")
|
|
205
|
+
.option("--limit <number>", "返回条数,1-100", "20")
|
|
206
|
+
.action(async (options, command) => {
|
|
207
|
+
const result = await client().listTargets({
|
|
208
|
+
status: options.status?.trim().toUpperCase(),
|
|
209
|
+
environmentId: options.environmentId && parseGitOpsIdentifier(options.environmentId, "environment-id"),
|
|
210
|
+
cursor: options.cursor,
|
|
211
|
+
limit: positiveInteger(options.limit, "limit", 20, 100)
|
|
212
|
+
});
|
|
213
|
+
await output(command, { ok: true, targets: result }, result.items.map(targetLine).join("\n") || "没有找到 Deployment target");
|
|
214
|
+
}), ["numa gitops target list --environment-id 12 --status active --json"], [
|
|
215
|
+
"Phase 1 服务端仅支持 status 和 environmentId 过滤;cluster、repository 和 tier 过滤留待后续契约。"
|
|
216
|
+
]);
|
|
217
|
+
addExamples(target.command("get <target-key>")
|
|
218
|
+
.description("查看单个 Deployment target")
|
|
219
|
+
.action(async (value, _options, command) => {
|
|
220
|
+
const result = await client().getTarget(parseGitOpsIdentifier(value, "target-key"));
|
|
221
|
+
await output(command, { ok: true, target: result }, JSON.stringify(stableOutput(result), null, 2));
|
|
222
|
+
}), ["numa gitops target get mci-dev-primary --json"]);
|
|
223
|
+
addExamples(target.command("validate <target-key>")
|
|
224
|
+
.description("执行 Phase 1 target topology-only 拓扑关系检查")
|
|
225
|
+
.action(async (value, _options, command) => {
|
|
226
|
+
const result = await client().validateTarget(parseGitOpsIdentifier(value, "target-key"));
|
|
227
|
+
await output(command, { ok: result.valid, validation: result }, `${result.targetKey}\t${result.scope ?? "TOPOLOGY_ONLY"}\t${result.valid ? "VALID" : "INVALID"}\t${result.issues.length} issue(s)`);
|
|
228
|
+
if (!result.valid)
|
|
229
|
+
process.exitCode = 1;
|
|
230
|
+
}), ["numa gitops target validate mci-dev-primary --json"]);
|
|
231
|
+
const profile = gitops.command("profile").description("查看不可变的 GitOps layout profile 版本");
|
|
232
|
+
addExamples(profile.command("list")
|
|
233
|
+
.description("列出 layout profiles")
|
|
234
|
+
.option("--status <status>", "按 profile 状态过滤")
|
|
235
|
+
.option("--search <text>", "按 profile code 搜索")
|
|
236
|
+
.option("--cursor <cursor>", "分页游标")
|
|
237
|
+
.option("--limit <number>", "返回条数,1-100", "20")
|
|
238
|
+
.action(async (options, command) => {
|
|
239
|
+
const result = await client().listProfiles({
|
|
240
|
+
status: options.status?.trim().toUpperCase(), search: options.search,
|
|
241
|
+
cursor: options.cursor, limit: positiveInteger(options.limit, "limit", 20, 100)
|
|
242
|
+
});
|
|
243
|
+
await output(command, { ok: true, profiles: result }, result.items.map(profileLine).join("\n") || "没有找到 layout profile");
|
|
244
|
+
}), ["numa gitops profile list --status active --json"]);
|
|
245
|
+
addExamples(profile.command("get <profile-code>")
|
|
246
|
+
.description("查看 layout profile 及服务端返回的版本列表")
|
|
247
|
+
.action(async (value, _options, command) => {
|
|
248
|
+
const result = await client().getProfile(parseGitOpsIdentifier(value, "profile-code"));
|
|
249
|
+
await output(command, { ok: true, profile: result }, JSON.stringify(stableOutput(result), null, 2));
|
|
250
|
+
}), ["numa gitops profile get MCI_FLUX_V1 --json"]);
|
|
251
|
+
const service = gitops.command("service").description("导入、计划、执行并查询受管服务结构变更");
|
|
252
|
+
addExamples(service.command("import")
|
|
253
|
+
.description("从受管 target 的锁定 SCM revision 导入 MCI_FLUX_V1 服务绑定")
|
|
254
|
+
.requiredOption("--application <code>", "应用 stable code")
|
|
255
|
+
.requiredOption("--target <target-key>", "Deployment target stable key")
|
|
256
|
+
.option("--profile <code>", "layout profile code", "MCI_FLUX_V1")
|
|
257
|
+
.option("--profile-version <version>", "profile 版本(当前支持 1 或 1.0.0)")
|
|
258
|
+
.requiredOption("--idempotency-key <key>", "可恢复导入请求的幂等键")
|
|
259
|
+
.action(async (options, command) => {
|
|
260
|
+
const result = await client().importService({
|
|
261
|
+
applicationCode: parseGitOpsIdentifier(options.application, "application"),
|
|
262
|
+
targetKey: parseGitOpsIdentifier(options.target, "target"),
|
|
263
|
+
profileCode: options.profile && parseGitOpsIdentifier(options.profile, "profile"),
|
|
264
|
+
profileVersion: options.profileVersion && parseGitOpsIdentifier(options.profileVersion, "profile-version"),
|
|
265
|
+
idempotencyKey: parseGitOpsIdempotencyKey(options.idempotencyKey)
|
|
266
|
+
});
|
|
267
|
+
await output(command, { ok: true, import: result }, `${result.service.serviceId}\t${result.service.applicationCode}\t${result.service.targetKey}\t${result.service.state}\t${result.importedRevision ?? "-"}`);
|
|
268
|
+
}), [
|
|
269
|
+
"numa gitops service import --application code-index --target mci-dev-primary --idempotency-key code-index-dev-import-1 --json"
|
|
270
|
+
], [
|
|
271
|
+
"导入只读 SCM 并登记 DECLARED binding;不会提交 Git 或改变 image tag。",
|
|
272
|
+
"重试必须复用同一 application 和 idempotency-key。"
|
|
273
|
+
]);
|
|
274
|
+
addExamples(service.command("plan")
|
|
275
|
+
.description("用服务端 MCI_FLUX_V1 renderer 生成并持久化结构计划,不写 SCM")
|
|
276
|
+
.requiredOption("--application <code>", "应用 stable code")
|
|
277
|
+
.requiredOption("--target <target-key>", "Deployment target stable key")
|
|
278
|
+
.option("--profile <code>", "layout profile code", "MCI_FLUX_V1")
|
|
279
|
+
.option("--profile-version <version>", "profile 版本(当前支持 1 或 1.0.0)")
|
|
280
|
+
.option("--service-id <id>", "已有 service binding 的字符串 ID")
|
|
281
|
+
.requiredOption("--spec <file>", "MCI_FLUX_V1 structural spec JSON 文件(最大 1 MiB)")
|
|
282
|
+
.action(async (options, command) => {
|
|
283
|
+
const result = await client().planService({
|
|
284
|
+
applicationCode: parseGitOpsIdentifier(options.application, "application"),
|
|
285
|
+
targetKey: parseGitOpsIdentifier(options.target, "target"),
|
|
286
|
+
profileCode: parseGitOpsIdentifier(options.profile, "profile"),
|
|
287
|
+
profileVersion: options.profileVersion && parseGitOpsIdentifier(options.profileVersion, "profile-version"),
|
|
288
|
+
serviceId: options.serviceId && parseGitOpsIdentifier(options.serviceId, "service-id"),
|
|
289
|
+
spec: await readGitOpsSpec(options.spec)
|
|
290
|
+
});
|
|
291
|
+
await output(command, { ok: true, plan: result }, `${result.planNumber}\t${result.state}\t${result.planHash}\t${result.baseRevision}\t${result.files.length} file(s)`);
|
|
292
|
+
}), [
|
|
293
|
+
"numa gitops service plan --application code-index --target mci-dev-primary --spec gitops-service.json --json",
|
|
294
|
+
"numa gitops service plan --application code-index --target mci-dev-primary --service-id 77 --spec gitops-service.json --json"
|
|
295
|
+
], [
|
|
296
|
+
"spec 不得包含 image、app/env/namespace/release、仓库、分支或 Flux 路径字段。",
|
|
297
|
+
"响应中的 canonicalSpecHash、planHash、sideEffects 和 baseRevision 均由服务端锁定。",
|
|
298
|
+
"plan 只持久化计划与快照,不写 SCM;执行必须另行调用 apply。"
|
|
299
|
+
]);
|
|
300
|
+
addExamples(service.command("apply <plan-number>")
|
|
301
|
+
.description("按服务端不可变 planHash 执行受管结构变更")
|
|
302
|
+
.requiredOption("--plan-hash <hash>", "plan 返回的 64 位 lower-case SHA-256")
|
|
303
|
+
.requiredOption("--idempotency-key <key>", "未知结果恢复所需的稳定幂等键")
|
|
304
|
+
.option("--yes", "确认执行可能写入 SCM 的结构变更")
|
|
305
|
+
.action(async (value, options, command) => {
|
|
306
|
+
if (!options.yes) {
|
|
307
|
+
throw new GitOpsError("Applying a GitOps plan requires --yes.", "GITOPS_CONFIRMATION_REQUIRED");
|
|
308
|
+
}
|
|
309
|
+
const result = await client().applyServicePlan({
|
|
310
|
+
planNumber: parseGitOpsIdentifier(value, "plan-number"),
|
|
311
|
+
planHash: parseGitOpsPlanHash(options.planHash),
|
|
312
|
+
idempotencyKey: parseGitOpsIdempotencyKey(options.idempotencyKey)
|
|
313
|
+
});
|
|
314
|
+
await output(command, { ok: true, run: result }, `${result.runNumber}\t${result.state}\t${result.serviceId ?? "-"}\t${result.resultRevision ?? result.reviewUrl ?? "-"}`);
|
|
315
|
+
if (["STALE", "FAILED", "CANCELLED", "SUPERSEDED"].includes(result.state))
|
|
316
|
+
process.exitCode = 1;
|
|
317
|
+
}), [
|
|
318
|
+
"numa gitops service apply gplan_01 --plan-hash <64-hex> --idempotency-key code-index-dev-apply-1 --yes --json"
|
|
319
|
+
], [
|
|
320
|
+
"必须原样提交 plan 返回的 planNumber/planHash;结果未知时使用同一 Idempotency-Key 重试。",
|
|
321
|
+
"生产 target 由服务端强制 ops-admin;非生产要求 gitops-operator 和应用团队 MAINTAINER。",
|
|
322
|
+
"DIRECT_BRANCH 可直接完成;REVIEWED_CHANGE 会返回 WAITING_REVIEW 和 reviewUrl。"
|
|
323
|
+
]);
|
|
324
|
+
addExamples(service.command("status <run-number>")
|
|
325
|
+
.description("按 stable runNo 或数字 ID 查询 GitOps change run")
|
|
326
|
+
.action(async (value, _options, command) => {
|
|
327
|
+
const result = await client().getChangeRun(parseGitOpsIdentifier(value, "run-number"));
|
|
328
|
+
await output(command, { ok: true, run: result }, `${result.runNumber}\t${result.state}\t${result.resultRevision ?? "-"}\t${result.reviewUrl ?? result.failureCode ?? "-"}`);
|
|
329
|
+
}), [
|
|
330
|
+
"numa gitops service status gplan_01 --json",
|
|
331
|
+
"numa gitops service status 42 --json"
|
|
332
|
+
], [
|
|
333
|
+
"查询是只读操作;WAITING_REVIEW 表示结构变更等待 SCM 审查合并。"
|
|
334
|
+
]);
|
|
335
|
+
addExamples(service.command("events <run-number>")
|
|
336
|
+
.description("按 stable runNo 或数字 ID 读取 GitOps change run 事件")
|
|
337
|
+
.action(async (value, _options, command) => {
|
|
338
|
+
const result = await client().getChangeEvents(parseGitOpsIdentifier(value, "run-number"));
|
|
339
|
+
await output(command, { ok: true, events: result }, result.map((event) => `${event.sequence}\t${event.type}\t${event.state}\t${event.createdAt}\t${event.message}`).join("\n")
|
|
340
|
+
|| "没有 GitOps change events");
|
|
341
|
+
}), [
|
|
342
|
+
"numa gitops service events gplan_01 --json",
|
|
343
|
+
"numa gitops service events 42 --json"
|
|
344
|
+
], [
|
|
345
|
+
"事件按服务端 sequence 升序返回;details 是 output 的兼容别名。"
|
|
346
|
+
]);
|
|
347
|
+
addExamples(service.command("evidence <service-binding-id>")
|
|
348
|
+
.description("读取服务绑定的 Jenkins 镜像更新与独立 Flux observation 证据")
|
|
349
|
+
.action(async (value, _options, command) => {
|
|
350
|
+
const bindingId = parseGitOpsIdentifier(value, "service-binding-id");
|
|
351
|
+
const api = client();
|
|
352
|
+
const [imageUpdates, targetObservations] = await Promise.all([
|
|
353
|
+
api.getServiceImageUpdates(bindingId),
|
|
354
|
+
api.getServiceTargetObservations(bindingId)
|
|
355
|
+
]);
|
|
356
|
+
const latestObservation = targetObservations[0];
|
|
357
|
+
await output(command, { ok: true, bindingId, imageUpdates, targetObservations }, `${bindingId}\t${latestObservation?.activationState ?? "NO_EVIDENCE"}\t${imageUpdates.length} image update(s)\t${targetObservations.length} observation(s)`);
|
|
358
|
+
if (latestObservation?.state === "REJECTED")
|
|
359
|
+
process.exitCode = 1;
|
|
360
|
+
}), [
|
|
361
|
+
"numa gitops service evidence 77 --json"
|
|
362
|
+
], [
|
|
363
|
+
"该命令只读且按 service binding 的 governing team 做 VIEWER 授权;不会提交 writer/observer 证明。",
|
|
364
|
+
"JENKINS_ATTESTED 只能推进 VERIFYING;只有独立 FLUX_OBSERVER_ATTESTED 证明可显示 ACTIVE。"
|
|
365
|
+
]);
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/gitops/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function redactGitOpsText(value: string): string;
|
|
2
|
+
export declare function sanitizeGitOpsOutput(value: unknown, key?: string): unknown;
|
|
3
|
+
export declare class GitOpsError extends Error {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
readonly status?: number | undefined;
|
|
6
|
+
readonly requestId?: string | undefined;
|
|
7
|
+
readonly details?: unknown;
|
|
8
|
+
constructor(message: string, code: string, status?: number | undefined, requestId?: string | undefined, details?: unknown);
|
|
9
|
+
}
|
|
10
|
+
export declare function gitOpsExitCode(error: GitOpsError): number;
|