@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,215 @@
|
|
|
1
|
+
import { resolveBackendUrl } from "../backend.js";
|
|
2
|
+
import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
|
|
3
|
+
import { RepositoryError, redactRepositoryText } from "./errors.js";
|
|
4
|
+
import { RemoteRepositoryListSchema, RemoteRepositorySchema, RepositoryApiErrorSchema, RepositoryCapabilitiesSchema, RepositoryNamespaceListSchema, RepositoryPlanRequestSchema, RepositoryPlanSchema, RepositoryRunCreateSchema, RepositoryRunEventListSchema, RepositoryRunListSchema, RepositoryRunSchema, ScmConnectionListSchema, SourceRepositoryListSchema, SourceRepositorySchema } from "./schemas.js";
|
|
5
|
+
export const SCM_API_ROOT = "/api/v1/scm";
|
|
6
|
+
export const SOURCE_REPOSITORY_CONTRACT_VERSION = "v2";
|
|
7
|
+
function safeIdentifier(value, label) {
|
|
8
|
+
const trimmed = value.trim();
|
|
9
|
+
if (!trimmed || trimmed.length > 256 || !/^[A-Za-z0-9][A-Za-z0-9._:+%~-]*$/u.test(trimmed)
|
|
10
|
+
|| /%(?![0-9A-Fa-f]{2})/u.test(trimmed)) {
|
|
11
|
+
throw new RepositoryError(`${label} is invalid.`, "REPOSITORY_CLI_INPUT_INVALID");
|
|
12
|
+
}
|
|
13
|
+
return trimmed;
|
|
14
|
+
}
|
|
15
|
+
function safeRequestId(value, label) {
|
|
16
|
+
const trimmed = value.trim();
|
|
17
|
+
if (!trimmed || trimmed.length > 200 || !/^[A-Za-z0-9][A-Za-z0-9._:/+-]*$/u.test(trimmed)) {
|
|
18
|
+
throw new RepositoryError(`${label} is invalid.`, "REPOSITORY_IDEMPOTENCY_INVALID");
|
|
19
|
+
}
|
|
20
|
+
return trimmed;
|
|
21
|
+
}
|
|
22
|
+
function positiveInteger(value, label, maximum) {
|
|
23
|
+
if (value == null)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (!Number.isInteger(value) || value < 1 || value > maximum) {
|
|
26
|
+
throw new RepositoryError(`${label} must be an integer between 1 and ${maximum}.`, "REPOSITORY_CLI_INPUT_INVALID");
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function queryPath(path, values) {
|
|
31
|
+
const query = new URLSearchParams();
|
|
32
|
+
for (const [key, value] of Object.entries(values)) {
|
|
33
|
+
if (value != null && value !== "")
|
|
34
|
+
query.set(key, String(value));
|
|
35
|
+
}
|
|
36
|
+
return query.size ? `${path}?${query.toString()}` : path;
|
|
37
|
+
}
|
|
38
|
+
async function responseBody(response) {
|
|
39
|
+
const text = await response.text();
|
|
40
|
+
if (!text)
|
|
41
|
+
return {};
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(text);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return text;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function requestIdFrom(response, body) {
|
|
50
|
+
if (body && typeof body === "object" && "requestId" in body && typeof body.requestId === "string")
|
|
51
|
+
return body.requestId;
|
|
52
|
+
if (body && typeof body === "object" && "error" in body && body.error && typeof body.error === "object"
|
|
53
|
+
&& "requestId" in body.error && typeof body.error.requestId === "string")
|
|
54
|
+
return body.error.requestId;
|
|
55
|
+
return response.headers.get("x-request-id") ?? undefined;
|
|
56
|
+
}
|
|
57
|
+
function apiFailure(response, body) {
|
|
58
|
+
const parsed = RepositoryApiErrorSchema.safeParse(body);
|
|
59
|
+
const message = parsed.success
|
|
60
|
+
? parsed.data.message ?? response.statusText ?? "Source Repository API request failed."
|
|
61
|
+
: typeof body === "string" ? body : response.statusText || "Source Repository API request failed.";
|
|
62
|
+
return new RepositoryError(`Source Repository API HTTP ${response.status}: ${redactRepositoryText(message)}`, parsed.success ? parsed.data.code ?? "REPOSITORY_API_ERROR" : "REPOSITORY_API_ERROR", response.status, requestIdFrom(response, body), parsed.success ? parsed.data.details : undefined);
|
|
63
|
+
}
|
|
64
|
+
export class SourceRepositoryClient {
|
|
65
|
+
config;
|
|
66
|
+
fetchImpl;
|
|
67
|
+
tokenProvider;
|
|
68
|
+
constructor(config, dependencies = {}) {
|
|
69
|
+
this.config = config;
|
|
70
|
+
this.fetchImpl = dependencies.fetch ?? fetch;
|
|
71
|
+
this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
|
|
72
|
+
}
|
|
73
|
+
async authenticatedFetch(path, init = {}) {
|
|
74
|
+
const method = String(init.method ?? "GET").toUpperCase();
|
|
75
|
+
const url = resolveBackendUrl(this.config, { method, path });
|
|
76
|
+
const headers = new Headers(init.headers);
|
|
77
|
+
headers.set("Accept", "application/json");
|
|
78
|
+
headers.set("X-Numa-Repository-Contract", SOURCE_REPOSITORY_CONTRACT_VERSION);
|
|
79
|
+
if (init.body != null)
|
|
80
|
+
headers.set("Content-Type", "application/json");
|
|
81
|
+
return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), {
|
|
82
|
+
fetch: this.fetchImpl,
|
|
83
|
+
tokenProvider: this.tokenProvider
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async json(path, schema, init = {}, expectedStatuses) {
|
|
87
|
+
const response = await this.authenticatedFetch(path, init);
|
|
88
|
+
const body = await responseBody(response);
|
|
89
|
+
if (!response.ok)
|
|
90
|
+
throw apiFailure(response, body);
|
|
91
|
+
if (expectedStatuses && !expectedStatuses.includes(response.status)) {
|
|
92
|
+
throw new RepositoryError(`Source Repository API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "REPOSITORY_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
|
|
93
|
+
}
|
|
94
|
+
const parsed = schema.safeParse(body);
|
|
95
|
+
if (!parsed.success) {
|
|
96
|
+
throw new RepositoryError(`Source Repository API returned an invalid response: ${parsed.error.message}`, "REPOSITORY_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
|
|
97
|
+
}
|
|
98
|
+
return parsed.data;
|
|
99
|
+
}
|
|
100
|
+
listConnections() {
|
|
101
|
+
return this.json(`${SCM_API_ROOT}/connections`, ScmConnectionListSchema);
|
|
102
|
+
}
|
|
103
|
+
listRepositories(options = {}) {
|
|
104
|
+
return this.json(queryPath(`${SCM_API_ROOT}/repositories`, {
|
|
105
|
+
status: options.status,
|
|
106
|
+
connection: options.connectionCode,
|
|
107
|
+
namespace: options.namespace,
|
|
108
|
+
ownerTeam: options.ownerTeamId,
|
|
109
|
+
managementMode: options.managementMode,
|
|
110
|
+
search: options.search,
|
|
111
|
+
page: positiveInteger(options.page, "page", 1_000_000),
|
|
112
|
+
size: positiveInteger(options.size, "size", 100)
|
|
113
|
+
}), SourceRepositoryListSchema);
|
|
114
|
+
}
|
|
115
|
+
getRepository(repositoryKey) {
|
|
116
|
+
return this.json(`${SCM_API_ROOT}/repositories/${encodeURIComponent(safeIdentifier(repositoryKey, "repository-key"))}`, SourceRepositorySchema);
|
|
117
|
+
}
|
|
118
|
+
listNamespaces(connectionCode, options = {}) {
|
|
119
|
+
const connection = encodeURIComponent(safeIdentifier(connectionCode, "connection-code"));
|
|
120
|
+
return this.json(queryPath(`${SCM_API_ROOT}/connections/${connection}/namespaces`, {
|
|
121
|
+
search: options.search, cursor: options.cursor, limit: positiveInteger(options.limit, "limit", 100)
|
|
122
|
+
}), RepositoryNamespaceListSchema);
|
|
123
|
+
}
|
|
124
|
+
listRemoteRepositories(connectionCode, options = {}) {
|
|
125
|
+
const connection = encodeURIComponent(safeIdentifier(connectionCode, "connection-code"));
|
|
126
|
+
return this.json(queryPath(`${SCM_API_ROOT}/connections/${connection}/remote-repositories`, {
|
|
127
|
+
search: options.search, cursor: options.cursor, limit: positiveInteger(options.limit, "limit", 100)
|
|
128
|
+
}), RemoteRepositoryListSchema);
|
|
129
|
+
}
|
|
130
|
+
getRemoteRepository(connectionCode, externalId) {
|
|
131
|
+
const connection = encodeURIComponent(safeIdentifier(connectionCode, "connection-code"));
|
|
132
|
+
const external = encodeURIComponent(safeIdentifier(externalId, "external-id"));
|
|
133
|
+
return this.json(`${SCM_API_ROOT}/connections/${connection}/remote-repositories/${external}`, RemoteRepositorySchema);
|
|
134
|
+
}
|
|
135
|
+
getCapabilities(connectionCode, consumerType) {
|
|
136
|
+
const connection = encodeURIComponent(safeIdentifier(connectionCode, "connection-code"));
|
|
137
|
+
return this.json(queryPath(`${SCM_API_ROOT}/connections/${connection}/repository-capabilities`, {
|
|
138
|
+
consumer: consumerType
|
|
139
|
+
}), RepositoryCapabilitiesSchema);
|
|
140
|
+
}
|
|
141
|
+
createPlan(input) {
|
|
142
|
+
const parsed = RepositoryPlanRequestSchema.safeParse(input);
|
|
143
|
+
if (!parsed.success) {
|
|
144
|
+
throw new RepositoryError(`Repository plan input is invalid: ${parsed.error.message}`, "REPOSITORY_CLI_INPUT_INVALID");
|
|
145
|
+
}
|
|
146
|
+
return this.json(`${SCM_API_ROOT}/repository-plans`, RepositoryPlanSchema, {
|
|
147
|
+
method: "POST", body: JSON.stringify(parsed.data)
|
|
148
|
+
}, [200, 201]);
|
|
149
|
+
}
|
|
150
|
+
getPlan(planNo) {
|
|
151
|
+
return this.json(`${SCM_API_ROOT}/repository-plans/${encodeURIComponent(safeIdentifier(planNo, "plan-no"))}`, RepositoryPlanSchema);
|
|
152
|
+
}
|
|
153
|
+
createRun(input, idempotencyKey) {
|
|
154
|
+
const parsed = RepositoryRunCreateSchema.safeParse(input);
|
|
155
|
+
if (!parsed.success) {
|
|
156
|
+
throw new RepositoryError(`Repository run input is invalid: ${parsed.error.message}`, "REPOSITORY_CLI_INPUT_INVALID");
|
|
157
|
+
}
|
|
158
|
+
const key = safeRequestId(idempotencyKey, "idempotency-key");
|
|
159
|
+
const clientRequestId = safeRequestId(parsed.data.clientRequestId, "client-request-id");
|
|
160
|
+
if (key !== clientRequestId) {
|
|
161
|
+
throw new RepositoryError("idempotency-key must exactly match client-request-id so an unknown result can be resolved safely.", "REPOSITORY_IDEMPOTENCY_INVALID");
|
|
162
|
+
}
|
|
163
|
+
return this.json(`${SCM_API_ROOT}/repository-runs`, RepositoryRunSchema, {
|
|
164
|
+
method: "POST",
|
|
165
|
+
headers: { "Idempotency-Key": key },
|
|
166
|
+
body: JSON.stringify({ ...parsed.data, clientRequestId })
|
|
167
|
+
}, [200, 201, 202]);
|
|
168
|
+
}
|
|
169
|
+
listRuns(options = {}) {
|
|
170
|
+
return this.json(queryPath(`${SCM_API_ROOT}/repository-runs`, {
|
|
171
|
+
state: options.state,
|
|
172
|
+
repositoryKey: options.repositoryKey,
|
|
173
|
+
consumerType: options.consumerType,
|
|
174
|
+
page: positiveInteger(options.page, "page", 1_000_000),
|
|
175
|
+
size: positiveInteger(options.size, "size", 100)
|
|
176
|
+
}), RepositoryRunListSchema);
|
|
177
|
+
}
|
|
178
|
+
getRun(runNo) {
|
|
179
|
+
return this.json(`${SCM_API_ROOT}/repository-runs/${encodeURIComponent(safeIdentifier(runNo, "run-no"))}`, RepositoryRunSchema);
|
|
180
|
+
}
|
|
181
|
+
resolveRun(clientRequestId) {
|
|
182
|
+
return this.json(queryPath(`${SCM_API_ROOT}/repository-runs/resolve`, {
|
|
183
|
+
clientRequestId: safeRequestId(clientRequestId, "client-request-id")
|
|
184
|
+
}), RepositoryRunSchema);
|
|
185
|
+
}
|
|
186
|
+
getEvents(runNo, afterSequence) {
|
|
187
|
+
if (afterSequence != null && (!Number.isInteger(afterSequence) || afterSequence < 0)) {
|
|
188
|
+
throw new RepositoryError("after-sequence must be a non-negative integer.", "REPOSITORY_CLI_INPUT_INVALID");
|
|
189
|
+
}
|
|
190
|
+
const run = encodeURIComponent(safeIdentifier(runNo, "run-no"));
|
|
191
|
+
return this.json(queryPath(`${SCM_API_ROOT}/repository-runs/${run}/events`, {
|
|
192
|
+
afterSequence
|
|
193
|
+
}), RepositoryRunEventListSchema);
|
|
194
|
+
}
|
|
195
|
+
retryRun(runNo) {
|
|
196
|
+
const run = encodeURIComponent(safeIdentifier(runNo, "run-no"));
|
|
197
|
+
return this.json(`${SCM_API_ROOT}/repository-runs/${run}/retry`, RepositoryRunSchema, {
|
|
198
|
+
method: "POST", body: "{}"
|
|
199
|
+
}, [200, 202]);
|
|
200
|
+
}
|
|
201
|
+
reconcileRun(runNo) {
|
|
202
|
+
const run = encodeURIComponent(safeIdentifier(runNo, "run-no"));
|
|
203
|
+
return this.json(`${SCM_API_ROOT}/repository-runs/${run}/reconcile`, RepositoryRunSchema, {
|
|
204
|
+
method: "POST", body: "{}"
|
|
205
|
+
}, [200, 202]);
|
|
206
|
+
}
|
|
207
|
+
reconcileRepository(repositoryKey, idempotencyKey) {
|
|
208
|
+
const repository = encodeURIComponent(safeIdentifier(repositoryKey, "repository-key"));
|
|
209
|
+
const key = safeRequestId(idempotencyKey, "idempotency-key");
|
|
210
|
+
return this.json(`${SCM_API_ROOT}/repositories/${repository}/reconcile`, RepositoryRunSchema, {
|
|
211
|
+
method: "POST", headers: { "Idempotency-Key": key }, body: "{}"
|
|
212
|
+
}, [200, 202]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/repositories/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { SourceRepositoryClient } from "./client.js";
|
|
3
|
+
export interface RepositoryCommandDependencies {
|
|
4
|
+
clientFactory?: () => SourceRepositoryClient;
|
|
5
|
+
exposeMutations?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseRepositoryIdentifier(value: string | undefined, label: string): string;
|
|
8
|
+
export declare function parseRepositoryRequestId(value: string | undefined, label: string): string;
|
|
9
|
+
export declare function parseRepositoryPlanHash(value: string | undefined): string;
|
|
10
|
+
export declare function registerRepositoryCommands(program: Command, dependencies?: RepositoryCommandDependencies): void;
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { loadAppConfig } from "../app-config.js";
|
|
3
|
+
import { loadConfig } from "../config.js";
|
|
4
|
+
import { SourceRepositoryClient } from "./client.js";
|
|
5
|
+
import { RepositoryError, sanitizeRepositoryOutput } from "./errors.js";
|
|
6
|
+
import { RepositoryConsumerTypeSchema, RepositoryInitializationSchema, RepositoryOperationSchema, RepositoryVisibilitySchema } from "./schemas.js";
|
|
7
|
+
const SAFE_IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:+%~-]*$/u;
|
|
8
|
+
const SAFE_REQUEST_ID = /^[A-Za-z0-9][A-Za-z0-9._:/+-]*$/u;
|
|
9
|
+
const PLAN_HASH = /^(?:sha256:)?[0-9a-f]{64}$/u;
|
|
10
|
+
function addExamples(command, examples, notes = []) {
|
|
11
|
+
const noteSection = notes.length ? `\n说明:\n${notes.map((item) => ` - ${item}`).join("\n")}\n` : "";
|
|
12
|
+
return command.addHelpText("after", `${noteSection}\nExamples:\n${examples.map((item) => ` ${item}`).join("\n")}\n`);
|
|
13
|
+
}
|
|
14
|
+
function snakeCase(key) {
|
|
15
|
+
return key.replace(/([a-z0-9])([A-Z])/gu, "$1_$2").toLowerCase();
|
|
16
|
+
}
|
|
17
|
+
function stableOutput(value) {
|
|
18
|
+
const safe = sanitizeRepositoryOutput(value);
|
|
19
|
+
if (Array.isArray(safe))
|
|
20
|
+
return safe.map(stableOutput);
|
|
21
|
+
if (safe && typeof safe === "object") {
|
|
22
|
+
return Object.fromEntries(Object.entries(safe).map(([key, item]) => [snakeCase(key), stableOutput(item)]));
|
|
23
|
+
}
|
|
24
|
+
return safe;
|
|
25
|
+
}
|
|
26
|
+
async function jsonEnabled(command) {
|
|
27
|
+
const configured = await loadAppConfig();
|
|
28
|
+
return Boolean(command.optsWithGlobals().json || configured.output === "json");
|
|
29
|
+
}
|
|
30
|
+
async function output(command, payload, textValue) {
|
|
31
|
+
if (await jsonEnabled(command))
|
|
32
|
+
process.stdout.write(`${JSON.stringify(stableOutput(payload), null, 2)}\n`);
|
|
33
|
+
else
|
|
34
|
+
process.stdout.write(`${String(sanitizeRepositoryOutput(textValue))}\n`);
|
|
35
|
+
}
|
|
36
|
+
export function parseRepositoryIdentifier(value, label) {
|
|
37
|
+
const trimmed = value?.trim() ?? "";
|
|
38
|
+
if (!trimmed || trimmed.length > 256 || !SAFE_IDENTIFIER.test(trimmed) || /%(?![0-9A-Fa-f]{2})/u.test(trimmed)) {
|
|
39
|
+
throw new RepositoryError(`${label} must be a stable identifier and cannot be a URL or path.`, "REPOSITORY_CLI_INPUT_INVALID");
|
|
40
|
+
}
|
|
41
|
+
return trimmed;
|
|
42
|
+
}
|
|
43
|
+
export function parseRepositoryRequestId(value, label) {
|
|
44
|
+
const trimmed = value?.trim() ?? "";
|
|
45
|
+
if (!trimmed || trimmed.length > 200 || !SAFE_REQUEST_ID.test(trimmed)) {
|
|
46
|
+
throw new RepositoryError(`${label} must be 1-200 safe opaque characters.`, "REPOSITORY_IDEMPOTENCY_INVALID");
|
|
47
|
+
}
|
|
48
|
+
return trimmed;
|
|
49
|
+
}
|
|
50
|
+
export function parseRepositoryPlanHash(value) {
|
|
51
|
+
const trimmed = value?.trim() ?? "";
|
|
52
|
+
if (!PLAN_HASH.test(trimmed)) {
|
|
53
|
+
throw new RepositoryError("plan-hash must be the exact SHA-256 hash returned by the server plan.", "REPOSITORY_PLAN_REQUIRED");
|
|
54
|
+
}
|
|
55
|
+
return trimmed;
|
|
56
|
+
}
|
|
57
|
+
function positiveInteger(value, label, fallback, maximum) {
|
|
58
|
+
if (value == null)
|
|
59
|
+
return fallback;
|
|
60
|
+
const parsed = Number(value);
|
|
61
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > maximum) {
|
|
62
|
+
throw new RepositoryError(`${label} must be an integer between 1 and ${maximum}.`, "REPOSITORY_CLI_INPUT_INVALID");
|
|
63
|
+
}
|
|
64
|
+
return parsed;
|
|
65
|
+
}
|
|
66
|
+
function nonNegativeInteger(value, label, fallback) {
|
|
67
|
+
if (value == null)
|
|
68
|
+
return fallback;
|
|
69
|
+
const parsed = Number(value);
|
|
70
|
+
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
71
|
+
throw new RepositoryError(`${label} must be a non-negative integer.`, "REPOSITORY_CLI_INPUT_INVALID");
|
|
72
|
+
}
|
|
73
|
+
return parsed;
|
|
74
|
+
}
|
|
75
|
+
function consumerType(value) {
|
|
76
|
+
if (!value)
|
|
77
|
+
return undefined;
|
|
78
|
+
const parsed = RepositoryConsumerTypeSchema.safeParse(value.trim().toUpperCase());
|
|
79
|
+
if (!parsed.success)
|
|
80
|
+
throw new RepositoryError("consumer must be standalone, application-onboarding, or gitops.", "REPOSITORY_CLI_INPUT_INVALID");
|
|
81
|
+
return parsed.data;
|
|
82
|
+
}
|
|
83
|
+
function visibility(value) {
|
|
84
|
+
if (!value)
|
|
85
|
+
return undefined;
|
|
86
|
+
const parsed = RepositoryVisibilitySchema.safeParse(value.trim().toUpperCase());
|
|
87
|
+
if (!parsed.success)
|
|
88
|
+
throw new RepositoryError("visibility must be private, internal, or public.", "REPOSITORY_CLI_INPUT_INVALID");
|
|
89
|
+
return parsed.data;
|
|
90
|
+
}
|
|
91
|
+
function initialization(value) {
|
|
92
|
+
const parsed = RepositoryInitializationSchema.safeParse((value ?? "EMPTY").trim().toUpperCase());
|
|
93
|
+
if (!parsed.success)
|
|
94
|
+
throw new RepositoryError("initialization must be empty or readme.", "REPOSITORY_CLI_INPUT_INVALID");
|
|
95
|
+
return parsed.data;
|
|
96
|
+
}
|
|
97
|
+
function ownerTeamId(value) {
|
|
98
|
+
if (value == null)
|
|
99
|
+
return undefined;
|
|
100
|
+
const trimmed = value.trim();
|
|
101
|
+
if (!/^[1-9]\d*$/u.test(trimmed)) {
|
|
102
|
+
throw new RepositoryError("owner-team-id must be a positive platform team ID.", "REPOSITORY_CLI_INPUT_INVALID");
|
|
103
|
+
}
|
|
104
|
+
return trimmed;
|
|
105
|
+
}
|
|
106
|
+
function requireYes(value) {
|
|
107
|
+
if (!value)
|
|
108
|
+
throw new RepositoryError("Mutation requires --yes after reviewing the server plan.", "REPOSITORY_CLI_INPUT_INVALID");
|
|
109
|
+
}
|
|
110
|
+
function repositoryLine(item) {
|
|
111
|
+
return `${String(item.repositoryKey ?? "-")}\t${String(item.status ?? "UNKNOWN")}\t${String(item.connectionCode ?? "-")}\t${String(item.fullName ?? item.name ?? "-")}`;
|
|
112
|
+
}
|
|
113
|
+
function runLine(item) {
|
|
114
|
+
return `${String(item.runNo ?? "-")}\t${String(item.state ?? "UNKNOWN")}\t${String(item.stepCode ?? "-")}\t${String(item.errorCode ?? "-")}`;
|
|
115
|
+
}
|
|
116
|
+
function commonPlanFields(options) {
|
|
117
|
+
return {
|
|
118
|
+
consumerType: consumerType(options.consumer) ?? "STANDALONE",
|
|
119
|
+
...(options.consumerRef ? { consumerRef: parseRepositoryIdentifier(options.consumerRef, "consumer-ref") } : {}),
|
|
120
|
+
...(options.ownerTeamId ? { ownerTeamId: ownerTeamId(options.ownerTeamId) } : {})
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function planText(plan) {
|
|
124
|
+
return `${plan.planNo}\t${plan.operation}\t${plan.state}\t${plan.blockers.length} blocker(s)`;
|
|
125
|
+
}
|
|
126
|
+
async function applyPlan(client, expectedOperation, options) {
|
|
127
|
+
requireYes(options.yes);
|
|
128
|
+
const planNo = parseRepositoryIdentifier(options.planNo, "plan-no");
|
|
129
|
+
const planHash = parseRepositoryPlanHash(options.planHash);
|
|
130
|
+
const clientRequestId = parseRepositoryRequestId(options.clientRequestId, "client-request-id");
|
|
131
|
+
const idempotencyKey = parseRepositoryRequestId(options.idempotencyKey, "idempotency-key");
|
|
132
|
+
if (clientRequestId !== idempotencyKey) {
|
|
133
|
+
throw new RepositoryError("idempotency-key must exactly match client-request-id so an unknown result can be resolved safely.", "REPOSITORY_IDEMPOTENCY_INVALID");
|
|
134
|
+
}
|
|
135
|
+
const plan = await client.getPlan(planNo);
|
|
136
|
+
if (plan.operation !== expectedOperation) {
|
|
137
|
+
throw new RepositoryError(`Plan ${planNo} is ${plan.operation}, not ${expectedOperation}.`, "REPOSITORY_PLAN_OPERATION_MISMATCH");
|
|
138
|
+
}
|
|
139
|
+
if (plan.planHash !== planHash) {
|
|
140
|
+
throw new RepositoryError("The supplied plan-hash does not match the current server plan; create or fetch a fresh plan.", "REPOSITORY_PLAN_HASH_MISMATCH");
|
|
141
|
+
}
|
|
142
|
+
if (plan.blockers.length) {
|
|
143
|
+
throw new RepositoryError("The server plan contains blockers and cannot be applied.", "REPOSITORY_PLAN_BLOCKED", undefined, undefined, plan.blockers);
|
|
144
|
+
}
|
|
145
|
+
return client.createRun({ planNo, planHash, clientRequestId }, idempotencyKey);
|
|
146
|
+
}
|
|
147
|
+
function addApplyOptions(command) {
|
|
148
|
+
return command
|
|
149
|
+
.requiredOption("--plan-no <number>", "服务端 plan 编号")
|
|
150
|
+
.requiredOption("--plan-hash <hash>", "服务端返回的精确 plan hash(原样提交)")
|
|
151
|
+
.requiredOption("--client-request-id <id>", "结果未知恢复用稳定请求 ID")
|
|
152
|
+
.requiredOption("--idempotency-key <key>", "必须与 client-request-id 完全相同")
|
|
153
|
+
.option("--yes", "确认执行服务端 plan");
|
|
154
|
+
}
|
|
155
|
+
export function registerRepositoryCommands(program, dependencies = {}) {
|
|
156
|
+
const client = () => dependencies.clientFactory?.() ?? new SourceRepositoryClient(loadConfig());
|
|
157
|
+
const repository = program.command("repository")
|
|
158
|
+
.description("通过 DevOps Source Repository Control Plane 管理代码仓库")
|
|
159
|
+
.addHelpText("after", `
|
|
160
|
+
安全边界:
|
|
161
|
+
CLI 只选择平台 connection、provider externalId 和 repositoryKey,不接受 URL、token、credential 或本地路径。
|
|
162
|
+
写操作先生成服务端不可变 plan,再按 planHash 与 Idempotency-Key 执行。
|
|
163
|
+
`);
|
|
164
|
+
const connection = repository.command("connection").description("查看当前用户可用的安全 SCM connection inventory");
|
|
165
|
+
addExamples(connection.command("list").description("列出 connection code、provider、状态和能力")
|
|
166
|
+
.action(async (_options, command) => {
|
|
167
|
+
const result = await client().listConnections();
|
|
168
|
+
await output(command, { ok: true, connections: result }, result.items
|
|
169
|
+
.map((item) => `${item.code}\t${item.provider}\t${item.status}\t${item.name}`).join("\n") || "没有可用的 SCM connection");
|
|
170
|
+
}), ["numa repository connection list --json"]);
|
|
171
|
+
addExamples(repository.command("list")
|
|
172
|
+
.description("列出 Source Repository catalog")
|
|
173
|
+
.option("--status <status>", "按 catalog 状态过滤")
|
|
174
|
+
.option("--connection <code>", "按 connection code 过滤")
|
|
175
|
+
.option("--namespace <external-id>", "按 provider namespace external ID 过滤")
|
|
176
|
+
.option("--owner-team-id <id>", "按 owner team stable ID 过滤")
|
|
177
|
+
.option("--management-mode <mode>", "按 MANAGED|IMPORTED|LEGACY 过滤")
|
|
178
|
+
.option("--search <text>", "按名称或 stable key 搜索")
|
|
179
|
+
.option("--page <number>", "页码,从 1 开始", "1")
|
|
180
|
+
.option("--size <number>", "每页条数,1-100", "20")
|
|
181
|
+
.action(async (options, command) => {
|
|
182
|
+
const result = await client().listRepositories({
|
|
183
|
+
status: options.status?.trim().toUpperCase(),
|
|
184
|
+
connectionCode: options.connection && parseRepositoryIdentifier(options.connection, "connection"),
|
|
185
|
+
namespace: options.namespace && parseRepositoryIdentifier(options.namespace, "namespace"),
|
|
186
|
+
ownerTeamId: ownerTeamId(options.ownerTeamId),
|
|
187
|
+
managementMode: options.managementMode?.trim().toUpperCase(),
|
|
188
|
+
search: options.search?.trim(), page: positiveInteger(options.page, "page", 1, 1_000_000),
|
|
189
|
+
size: positiveInteger(options.size, "size", 20, 100)
|
|
190
|
+
});
|
|
191
|
+
await output(command, { ok: true, repositories: result }, result.items.map(repositoryLine).join("\n") || "没有找到 Source Repository");
|
|
192
|
+
}), ["numa repository list --connection codeup-main --json"]);
|
|
193
|
+
addExamples(repository.command("get <repository-key>")
|
|
194
|
+
.description("按平台 repositoryKey 查看 catalog 详情")
|
|
195
|
+
.action(async (value, _options, command) => {
|
|
196
|
+
const result = await client().getRepository(parseRepositoryIdentifier(value, "repository-key"));
|
|
197
|
+
await output(command, { ok: true, repository: result }, JSON.stringify(stableOutput(result), null, 2));
|
|
198
|
+
}), ["numa repository get repo_01 --json"]);
|
|
199
|
+
const namespace = repository.command("namespace").description("发现 provider 可用 namespace,不接收 URL 或凭据");
|
|
200
|
+
addExamples(namespace.command("list")
|
|
201
|
+
.requiredOption("--connection <code>", "平台 connection code")
|
|
202
|
+
.option("--search <text>", "搜索 namespace")
|
|
203
|
+
.option("--cursor <cursor>", "分页游标")
|
|
204
|
+
.option("--limit <number>", "返回条数,1-100", "20")
|
|
205
|
+
.action(async (options, command) => {
|
|
206
|
+
const result = await client().listNamespaces(parseRepositoryIdentifier(options.connection, "connection"), {
|
|
207
|
+
search: options.search?.trim(), cursor: options.cursor?.trim(), limit: positiveInteger(options.limit, "limit", 20, 100)
|
|
208
|
+
});
|
|
209
|
+
await output(command, { ok: true, namespaces: result }, result.items
|
|
210
|
+
.map((item) => `${item.externalId}\t${item.fullPath ?? item.name}`).join("\n") || "没有找到 namespace");
|
|
211
|
+
}), ["numa repository namespace list --connection codeup-main --json"]);
|
|
212
|
+
const remote = repository.command("remote").description("发现 provider 中的远端仓库");
|
|
213
|
+
addExamples(remote.command("list")
|
|
214
|
+
.requiredOption("--connection <code>", "平台 connection code")
|
|
215
|
+
.option("--search <text>", "搜索远端仓库")
|
|
216
|
+
.option("--cursor <cursor>", "分页游标")
|
|
217
|
+
.option("--limit <number>", "返回条数,1-100", "20")
|
|
218
|
+
.action(async (options, command) => {
|
|
219
|
+
const result = await client().listRemoteRepositories(parseRepositoryIdentifier(options.connection, "connection"), {
|
|
220
|
+
search: options.search?.trim(), cursor: options.cursor?.trim(), limit: positiveInteger(options.limit, "limit", 20, 100)
|
|
221
|
+
});
|
|
222
|
+
await output(command, { ok: true, remote_repositories: result }, result.items
|
|
223
|
+
.map((item) => `${item.externalId}\t${item.defaultBranch ?? "-"}\t${item.fullName ?? item.name}`).join("\n") || "没有找到远端仓库");
|
|
224
|
+
}), ["numa repository remote list --connection codeup-main --search order --json"]);
|
|
225
|
+
addExamples(remote.command("get <external-id>")
|
|
226
|
+
.requiredOption("--connection <code>", "平台 connection code")
|
|
227
|
+
.description("按 provider externalId 查看一个远端仓库")
|
|
228
|
+
.action(async (externalId, options, command) => {
|
|
229
|
+
const result = await client().getRemoteRepository(parseRepositoryIdentifier(options.connection, "connection"), parseRepositoryIdentifier(externalId, "external-id"));
|
|
230
|
+
await output(command, { ok: true, remote_repository: result }, JSON.stringify(stableOutput(result), null, 2));
|
|
231
|
+
}), ["numa repository remote get 123456 --connection codeup-main --json"]);
|
|
232
|
+
addExamples(repository.command("capabilities")
|
|
233
|
+
.description("查询 connection 对指定 consumer 的仓库能力和约束")
|
|
234
|
+
.requiredOption("--connection <code>", "平台 connection code")
|
|
235
|
+
.option("--consumer <type>", "standalone|application-onboarding|gitops")
|
|
236
|
+
.action(async (options, command) => {
|
|
237
|
+
const result = await client().getCapabilities(parseRepositoryIdentifier(options.connection, "connection"), consumerType(options.consumer));
|
|
238
|
+
await output(command, { ok: true, capabilities: result }, JSON.stringify(stableOutput(result), null, 2));
|
|
239
|
+
}), ["numa repository capabilities --connection codeup-main --consumer gitops --json"]);
|
|
240
|
+
addExamples(repository.command("status [run-no]")
|
|
241
|
+
.description("按 runNo/clientRequestId 查询运行;无目标时分页列出 runs")
|
|
242
|
+
.option("--client-request-id <id>", "结果未知时按原稳定请求 ID 恢复")
|
|
243
|
+
.option("--state <state>", "列表按 state 过滤")
|
|
244
|
+
.option("--repository-key <key>", "列表按 repositoryKey 过滤")
|
|
245
|
+
.option("--consumer <type>", "列表按 consumerType 过滤")
|
|
246
|
+
.option("--page <number>", "页码,从 1 开始", "1")
|
|
247
|
+
.option("--size <number>", "每页条数,1-100", "20")
|
|
248
|
+
.action(async (runNo, options, command) => {
|
|
249
|
+
if (runNo && options.clientRequestId)
|
|
250
|
+
throw new RepositoryError("Choose run-no or client-request-id, not both.", "REPOSITORY_CLI_INPUT_INVALID");
|
|
251
|
+
if (runNo) {
|
|
252
|
+
const result = await client().getRun(parseRepositoryIdentifier(runNo, "run-no"));
|
|
253
|
+
await output(command, { ok: true, run: result }, runLine(result));
|
|
254
|
+
}
|
|
255
|
+
else if (options.clientRequestId) {
|
|
256
|
+
const result = await client().resolveRun(parseRepositoryRequestId(options.clientRequestId, "client-request-id"));
|
|
257
|
+
await output(command, { ok: true, run: result }, runLine(result));
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const result = await client().listRuns({
|
|
261
|
+
state: options.state?.trim().toUpperCase(),
|
|
262
|
+
repositoryKey: options.repositoryKey && parseRepositoryIdentifier(options.repositoryKey, "repository-key"),
|
|
263
|
+
consumerType: consumerType(options.consumer),
|
|
264
|
+
page: positiveInteger(options.page, "page", 1, 1_000_000),
|
|
265
|
+
size: positiveInteger(options.size, "size", 20, 100)
|
|
266
|
+
});
|
|
267
|
+
await output(command, { ok: true, runs: result }, result.items.map(runLine).join("\n") || "没有找到 repository run");
|
|
268
|
+
}
|
|
269
|
+
}), ["numa repository status run_01 --json", "numa repository status --client-request-id create-order-20260822 --json"]);
|
|
270
|
+
addExamples(repository.command("events <run-no>")
|
|
271
|
+
.description("按单调 sequence 读取运行事件")
|
|
272
|
+
.option("--after-sequence <number>", "仅返回该 sequence 之后的事件", "0")
|
|
273
|
+
.action(async (runNo, options, command) => {
|
|
274
|
+
const result = await client().getEvents(parseRepositoryIdentifier(runNo, "run-no"), nonNegativeInteger(options.afterSequence, "after-sequence", 0));
|
|
275
|
+
await output(command, { ok: true, events: result }, result.items
|
|
276
|
+
.map((item) => `${item.sequence}\t${item.eventType ?? item.type}\t${item.state ?? "-"}\t${item.message ?? "-"}`).join("\n") || "没有新事件");
|
|
277
|
+
}), ["numa repository events run_01 --after-sequence 42 --json"]);
|
|
278
|
+
if (!dependencies.exposeMutations)
|
|
279
|
+
return;
|
|
280
|
+
const plan = repository.command("plan").description("生成不可变的服务端仓库变更计划");
|
|
281
|
+
addExamples(plan.command("create")
|
|
282
|
+
.requiredOption("--connection <code>").requiredOption("--namespace <external-id>").requiredOption("--name <name>")
|
|
283
|
+
.option("--description <text>").option("--visibility <value>", "private|internal|public")
|
|
284
|
+
.option("--default-branch <branch>").option("--initialization <mode>", "empty|readme", "empty")
|
|
285
|
+
.option("--consumer <type>").option("--consumer-ref <ref>").option("--owner-team-id <id>")
|
|
286
|
+
.action(async (options, command) => {
|
|
287
|
+
const initializationMode = initialization(options.initialization);
|
|
288
|
+
const result = await client().createPlan({
|
|
289
|
+
operation: "CREATE", ...commonPlanFields(options),
|
|
290
|
+
connectionCode: parseRepositoryIdentifier(options.connection, "connection"),
|
|
291
|
+
namespaceExternalId: parseRepositoryIdentifier(options.namespace, "namespace"),
|
|
292
|
+
name: parseRepositoryIdentifier(options.name, "name"),
|
|
293
|
+
...(options.description == null ? {} : { description: options.description.trim() }),
|
|
294
|
+
...(options.visibility ? { visibility: visibility(options.visibility) } : {}),
|
|
295
|
+
...(options.defaultBranch ? { defaultBranch: parseRepositoryIdentifier(options.defaultBranch, "default-branch") } : {}),
|
|
296
|
+
initialization: initializationMode
|
|
297
|
+
});
|
|
298
|
+
await output(command, { ok: true, plan: result }, planText(result));
|
|
299
|
+
}), ["numa repository plan create --connection codeup-main --namespace 123 --name order --initialization empty --json"]);
|
|
300
|
+
addExamples(plan.command("register")
|
|
301
|
+
.requiredOption("--connection <code>").requiredOption("--external-id <id>")
|
|
302
|
+
.option("--default-branch <branch>").option("--consumer <type>").option("--consumer-ref <ref>").option("--owner-team-id <id>")
|
|
303
|
+
.action(async (options, command) => {
|
|
304
|
+
const result = await client().createPlan({
|
|
305
|
+
operation: "REGISTER_EXISTING", ...commonPlanFields(options),
|
|
306
|
+
connectionCode: parseRepositoryIdentifier(options.connection, "connection"),
|
|
307
|
+
externalId: parseRepositoryIdentifier(options.externalId, "external-id"),
|
|
308
|
+
...(options.defaultBranch ? { defaultBranch: parseRepositoryIdentifier(options.defaultBranch, "default-branch") } : {})
|
|
309
|
+
});
|
|
310
|
+
await output(command, { ok: true, plan: result }, planText(result));
|
|
311
|
+
}), ["numa repository plan register --connection codeup-main --external-id 456 --json"]);
|
|
312
|
+
for (const operation of ["USE_EXISTING", "DISABLE"]) {
|
|
313
|
+
const commandName = operation === "USE_EXISTING" ? "use-existing" : "disable";
|
|
314
|
+
addExamples(plan.command(commandName).requiredOption("--repository-key <key>")
|
|
315
|
+
.option("--consumer <type>").option("--consumer-ref <ref>").option("--owner-team-id <id>")
|
|
316
|
+
.action(async (options, command) => {
|
|
317
|
+
const result = await client().createPlan({
|
|
318
|
+
operation, ...commonPlanFields(options),
|
|
319
|
+
repositoryKey: parseRepositoryIdentifier(options.repositoryKey, "repository-key")
|
|
320
|
+
});
|
|
321
|
+
await output(command, { ok: true, plan: result }, planText(result));
|
|
322
|
+
}), [`numa repository plan ${commandName} --repository-key repo_01 --json`]);
|
|
323
|
+
}
|
|
324
|
+
for (const [name, operation] of [["create", "CREATE"], ["register", "REGISTER_EXISTING"], ["disable", "DISABLE"]]) {
|
|
325
|
+
addExamples(addApplyOptions(repository.command(name).description(`执行已审阅的 ${operation} plan`))
|
|
326
|
+
.action(async (options, command) => {
|
|
327
|
+
const result = await applyPlan(client(), RepositoryOperationSchema.parse(operation), options);
|
|
328
|
+
await output(command, { ok: true, run: result }, runLine(result));
|
|
329
|
+
}), [`numa repository ${name} --plan-no plan_01 --plan-hash <64-hex> --client-request-id request-01 --idempotency-key request-01 --yes --json`]);
|
|
330
|
+
}
|
|
331
|
+
addExamples(repository.command("retry <run-no>").option("--yes", "确认仅重试服务端允许的失败步骤")
|
|
332
|
+
.action(async (runNo, options, command) => {
|
|
333
|
+
requireYes(options.yes);
|
|
334
|
+
const result = await client().retryRun(parseRepositoryIdentifier(runNo, "run-no"));
|
|
335
|
+
await output(command, { ok: true, run: result }, runLine(result));
|
|
336
|
+
}), ["numa repository retry run_01 --yes --json"]);
|
|
337
|
+
addExamples(repository.command("reconcile <identifier>").option("--repository", "将 identifier 解释为 repositoryKey(默认 runNo)").option("--idempotency-key <key>", "仓库校准结果未知时必须复用").option("--yes")
|
|
338
|
+
.action(async (identifier, options, command) => {
|
|
339
|
+
requireYes(options.yes);
|
|
340
|
+
const stable = parseRepositoryIdentifier(identifier, options.repository ? "repository-key" : "run-no");
|
|
341
|
+
const result = options.repository
|
|
342
|
+
? await client().reconcileRepository(stable, parseRepositoryRequestId(options.idempotencyKey, "idempotency-key"))
|
|
343
|
+
: await client().reconcileRun(stable);
|
|
344
|
+
await output(command, { ok: true, result }, JSON.stringify(stableOutput(result), null, 2));
|
|
345
|
+
}), ["numa repository reconcile run_01 --yes --json", "numa repository reconcile repo_01 --repository --idempotency-key observe-repo-01 --yes --json"]);
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/repositories/commands.ts"],"names":[],"mappings":"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"}
|