@hcmai/cli 0.3.3 → 0.3.4
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/index.js +148 -24
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2503,13 +2503,13 @@ async function envRemove(name, args) {
|
|
|
2503
2503
|
}
|
|
2504
2504
|
}
|
|
2505
2505
|
const ids = await listIdentities(name);
|
|
2506
|
-
const
|
|
2506
|
+
const failed2 = [];
|
|
2507
2507
|
for (const id of ids) {
|
|
2508
2508
|
try {
|
|
2509
2509
|
await TokenStore2.forIdentity(id).clear();
|
|
2510
2510
|
await deleteIdentity(id);
|
|
2511
2511
|
} catch (err) {
|
|
2512
|
-
|
|
2512
|
+
failed2.push(id);
|
|
2513
2513
|
process.stderr.write(
|
|
2514
2514
|
`[hcm] event=identity_cleanup_failed identity=${id} reason=${JSON.stringify(String(err.message))}
|
|
2515
2515
|
`
|
|
@@ -2522,9 +2522,9 @@ async function envRemove(name, args) {
|
|
|
2522
2522
|
g.activeEnv = "default";
|
|
2523
2523
|
await saveGlobalConfig2(g);
|
|
2524
2524
|
}
|
|
2525
|
-
const removedCount = ids.length -
|
|
2525
|
+
const removedCount = ids.length - failed2.length;
|
|
2526
2526
|
const noun = (n) => n === 1 ? "identity" : "identities";
|
|
2527
|
-
const failPart =
|
|
2527
|
+
const failPart = failed2.length > 0 ? `, ${failed2.length} ${noun(failed2.length)} failed: ${failed2.join(", ")}` : "";
|
|
2528
2528
|
exitOk(`\u2705 env '${name}' removed (${removedCount} ${noun(removedCount)} removed${failPart})`);
|
|
2529
2529
|
} catch (e) {
|
|
2530
2530
|
exitWithError(e);
|
|
@@ -7568,9 +7568,15 @@ async function identityRemove(name) {
|
|
|
7568
7568
|
}
|
|
7569
7569
|
}
|
|
7570
7570
|
|
|
7571
|
+
// src/commands/delivery-action-policy.ts
|
|
7572
|
+
init_auth_guard();
|
|
7573
|
+
import {
|
|
7574
|
+
HcmClient as HcmClient17,
|
|
7575
|
+
formatObject as formatObject17
|
|
7576
|
+
} from "@hcmai/sdk";
|
|
7577
|
+
|
|
7571
7578
|
// src/commands/delivery.ts
|
|
7572
7579
|
import { createHash as createHash5 } from "crypto";
|
|
7573
|
-
import { formatObject as formatObject17 } from "@hcmai/sdk";
|
|
7574
7580
|
var APPROVAL_BYPASS_FLAGS = /* @__PURE__ */ new Set(["-y", "--yes", "--force", "--auto-approve"]);
|
|
7575
7581
|
var CREDENTIAL_FLAGS = /* @__PURE__ */ new Set([
|
|
7576
7582
|
"--password",
|
|
@@ -7587,9 +7593,10 @@ var GUARDED_EXECUTOR_REASON_CODES = /* @__PURE__ */ new Set([
|
|
|
7587
7593
|
"record-update",
|
|
7588
7594
|
"cache-mutation",
|
|
7589
7595
|
"setting-write",
|
|
7590
|
-
"credential-reset"
|
|
7596
|
+
"credential-reset",
|
|
7597
|
+
"action-write"
|
|
7591
7598
|
]);
|
|
7592
|
-
function assessDeliveryCommand(inputArgv) {
|
|
7599
|
+
function assessDeliveryCommand(inputArgv, options = {}) {
|
|
7593
7600
|
const argv = inputArgv[0] === "--" ? inputArgv.slice(1) : [...inputArgv];
|
|
7594
7601
|
const commandSha256 = sha2565(JSON.stringify(argv));
|
|
7595
7602
|
const name = argv[0] ?? "";
|
|
@@ -7599,8 +7606,8 @@ function assessDeliveryCommand(inputArgv) {
|
|
|
7599
7606
|
const sensitiveFlags = [
|
|
7600
7607
|
...new Set([...PAYLOAD_FLAGS, ...CREDENTIAL_FLAGS].filter((flag) => hasFlag(argv, flag)))
|
|
7601
7608
|
];
|
|
7602
|
-
const target = summarizeTarget(argv);
|
|
7603
|
-
let classification = classify(argv);
|
|
7609
|
+
const target = summarizeTarget(argv, options.actionResolution);
|
|
7610
|
+
let classification = classify(argv, options.actionResolution);
|
|
7604
7611
|
const invalidPayload = payloadError(argv);
|
|
7605
7612
|
if (invalidPayload) {
|
|
7606
7613
|
classification = forbidden("invalid-input", "JSON payload \u65E0\u6548\uFF0C\u4E0D\u80FD\u8FDB\u5165\u4EFB\u4F55\u6267\u884C\u8DEF\u5F84\u3002");
|
|
@@ -7621,8 +7628,8 @@ function assessDeliveryCommand(inputArgv) {
|
|
|
7621
7628
|
const allowed = classification.risk === "R0" || classification.risk === "R1";
|
|
7622
7629
|
return {
|
|
7623
7630
|
schemaVersion: 1,
|
|
7624
|
-
contractVersion: "2026-08-
|
|
7625
|
-
assessmentId: sha2565(`2026-08-
|
|
7631
|
+
contractVersion: "2026-08-29",
|
|
7632
|
+
assessmentId: sha2565(`2026-08-29
|
|
7626
7633
|
${commandSha256}`).slice(0, 24),
|
|
7627
7634
|
commandSha256,
|
|
7628
7635
|
command: { name: name || "(empty)", ...subcommand ? { subcommand } : {} },
|
|
@@ -7642,11 +7649,7 @@ ${commandSha256}`).slice(0, 24),
|
|
|
7642
7649
|
}
|
|
7643
7650
|
};
|
|
7644
7651
|
}
|
|
7645
|
-
function
|
|
7646
|
-
const assessment = assessDeliveryCommand(argv);
|
|
7647
|
-
process.stdout.write(formatObject17(assessment, { format: args.output ?? "json" }) + "\n");
|
|
7648
|
-
}
|
|
7649
|
-
function classify(argv) {
|
|
7652
|
+
function classify(argv, actionResolution) {
|
|
7650
7653
|
const name = argv[0] ?? "";
|
|
7651
7654
|
const subcommand = argv[1] ?? "";
|
|
7652
7655
|
if (argv.some((arg) => APPROVAL_BYPASS_FLAGS.has(flagName(arg)))) {
|
|
@@ -7747,9 +7750,15 @@ function classify(argv) {
|
|
|
7747
7750
|
if (name === "upload") return guarded("tenant-write", "document-upload");
|
|
7748
7751
|
if (name === "download") return direct("R1", "managed-local-write", "document-download");
|
|
7749
7752
|
if (name === "action") {
|
|
7753
|
+
if (actionResolution?.status === "resolved") {
|
|
7754
|
+
return classifyAction(actionResolution.policy);
|
|
7755
|
+
}
|
|
7756
|
+
if (actionResolution?.status === "failed") {
|
|
7757
|
+
return forbidden(actionResolution.reasonCode, actionResolution.reason);
|
|
7758
|
+
}
|
|
7750
7759
|
return forbidden(
|
|
7751
7760
|
"action-effect-unclassified",
|
|
7752
|
-
"
|
|
7761
|
+
"\u5C1A\u672A\u8BFB\u53D6 Core Action \u98CE\u63A7\u58F0\u660E\uFF0C\u4E0D\u80FD\u6309\u540D\u79F0\u731C\u6D4B\u540E\u653E\u884C\u3002"
|
|
7753
7762
|
);
|
|
7754
7763
|
}
|
|
7755
7764
|
if (name === "delete" || name === "meta" && subcommand === "delete") {
|
|
@@ -7766,14 +7775,19 @@ function classify(argv) {
|
|
|
7766
7775
|
}
|
|
7767
7776
|
return forbidden("unknown-command", "\u672A\u77E5\u547D\u4EE4\u6309\u6700\u9AD8\u98CE\u9669\u5173\u95ED\u3002");
|
|
7768
7777
|
}
|
|
7769
|
-
function summarizeTarget(argv) {
|
|
7778
|
+
function summarizeTarget(argv, actionResolution) {
|
|
7770
7779
|
const name = argv[0] ?? "";
|
|
7771
7780
|
const subcommand = argv[1] ?? "";
|
|
7772
7781
|
const target = {};
|
|
7773
7782
|
if (["query", "describe", "create", "update", "delete"].includes(name) && subcommand) {
|
|
7774
7783
|
target.model = subcommand;
|
|
7775
7784
|
}
|
|
7776
|
-
if (name === "action" && subcommand)
|
|
7785
|
+
if (name === "action" && subcommand) {
|
|
7786
|
+
target.action = subcommand;
|
|
7787
|
+
if (actionResolution?.status === "resolved") {
|
|
7788
|
+
target.actionPolicy = { ...actionResolution.policy };
|
|
7789
|
+
}
|
|
7790
|
+
}
|
|
7777
7791
|
if (name === "skills" && argv[2] && !argv[2].startsWith("-")) target.skill = argv[2];
|
|
7778
7792
|
if (name === "meta" && argv[2] && !argv[2].startsWith("-")) target.path = argv[2];
|
|
7779
7793
|
if (name === "cache" && argv[2] && !argv[2].startsWith("-")) {
|
|
@@ -7837,6 +7851,18 @@ function guarded(effect, reasonCode) {
|
|
|
7837
7851
|
reason: "\u666E\u901A\u526F\u4F5C\u7528\u64CD\u4F5C\uFF1B\u53EA\u5141\u8BB8\u5728 controlled \u9879\u76EE\u4E2D\u901A\u8FC7 delivery prepare + delivery execute \u5355\u6B21\u53D7\u63A7\u6267\u884C\u3002"
|
|
7838
7852
|
};
|
|
7839
7853
|
}
|
|
7854
|
+
function classifyAction(policy) {
|
|
7855
|
+
if (policy.readOnly) {
|
|
7856
|
+
return {
|
|
7857
|
+
risk: "R1",
|
|
7858
|
+
execution: "direct",
|
|
7859
|
+
effect: "remote-read",
|
|
7860
|
+
reasonCode: "action-read-only",
|
|
7861
|
+
reason: "Core \u58F0\u660E\u8BE5 Action \u4E3A\u53EA\u8BFB\uFF0C\u4E0E Moirai \u7684\u53EA\u8BFB Action \u8DEF\u5F84\u4E00\u81F4\uFF0C\u53EF\u76F4\u63A5\u6267\u884C\u3002"
|
|
7862
|
+
};
|
|
7863
|
+
}
|
|
7864
|
+
return guarded("tenant-write", "action-write");
|
|
7865
|
+
}
|
|
7840
7866
|
function forbidden(reasonCode, reason) {
|
|
7841
7867
|
return { risk: "R3", execution: "forbidden", effect: reasonCode, reasonCode, reason };
|
|
7842
7868
|
}
|
|
@@ -7889,6 +7915,104 @@ function isPlainObject(value) {
|
|
|
7889
7915
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7890
7916
|
}
|
|
7891
7917
|
|
|
7918
|
+
// src/commands/delivery-action-policy.ts
|
|
7919
|
+
async function assessEffectiveDeliveryCommand(inputArgv, dependencies = {}) {
|
|
7920
|
+
const local = assessDeliveryCommand(inputArgv);
|
|
7921
|
+
if (local.reasonCode !== "action-effect-unclassified") return local;
|
|
7922
|
+
const request = parseActionRequest(inputArgv);
|
|
7923
|
+
if ("status" in request) {
|
|
7924
|
+
return assessDeliveryCommand(inputArgv, { actionResolution: request });
|
|
7925
|
+
}
|
|
7926
|
+
const resolution = await (dependencies.resolveAction ?? resolveCoreAction)(request);
|
|
7927
|
+
return assessDeliveryCommand(inputArgv, { actionResolution: resolution });
|
|
7928
|
+
}
|
|
7929
|
+
async function deliveryAssessCommand(argv, args) {
|
|
7930
|
+
const assessment = await assessEffectiveDeliveryCommand(argv);
|
|
7931
|
+
process.stdout.write(formatObject17(assessment, { format: args.output ?? "json" }) + "\n");
|
|
7932
|
+
}
|
|
7933
|
+
async function resolveCoreAction(request) {
|
|
7934
|
+
try {
|
|
7935
|
+
const auth = await getActiveAuthContextFromCli({
|
|
7936
|
+
env: request.env,
|
|
7937
|
+
as: request.identity,
|
|
7938
|
+
profile: request.profile
|
|
7939
|
+
});
|
|
7940
|
+
const description = await HcmClient17.fromAuthContext(auth).describe(request.model);
|
|
7941
|
+
const matches = description.actions.filter((action2) => matchesRequest(action2, request));
|
|
7942
|
+
if (matches.length === 0) {
|
|
7943
|
+
return failed(
|
|
7944
|
+
"action-metadata-not-found",
|
|
7945
|
+
"Core \u5143\u6570\u636E\u4E2D\u6CA1\u6709\u4E0E\u672C\u6B21 method/scope \u7CBE\u786E\u5339\u914D\u7684 Action\uFF0C\u62D2\u7EDD\u6267\u884C\u3002"
|
|
7946
|
+
);
|
|
7947
|
+
}
|
|
7948
|
+
if (matches.length > 1) {
|
|
7949
|
+
return failed(
|
|
7950
|
+
"action-metadata-ambiguous",
|
|
7951
|
+
"Core \u5143\u6570\u636E\u5B58\u5728\u591A\u4E2A\u4E0E\u672C\u6B21 method/scope \u5339\u914D\u7684 Action\uFF0C\u65E0\u6CD5\u552F\u4E00\u5224\u5B9A\uFF0C\u62D2\u7EDD\u6267\u884C\u3002"
|
|
7952
|
+
);
|
|
7953
|
+
}
|
|
7954
|
+
const action = matches[0];
|
|
7955
|
+
if (typeof action.readOnly !== "boolean") {
|
|
7956
|
+
return failed(
|
|
7957
|
+
"action-readonly-unclassified",
|
|
7958
|
+
"Core \u672A\u8FD4\u56DE Action \u7684 readOnly \u58F0\u660E\uFF0C\u6309\u5B89\u5168\u9ED8\u8BA4\u62D2\u7EDD\u6267\u884C\u3002"
|
|
7959
|
+
);
|
|
7960
|
+
}
|
|
7961
|
+
return {
|
|
7962
|
+
status: "resolved",
|
|
7963
|
+
policy: {
|
|
7964
|
+
scope: action.scope,
|
|
7965
|
+
httpMethod: action.httpMethod.toUpperCase(),
|
|
7966
|
+
readOnly: action.readOnly,
|
|
7967
|
+
...action.source ? { source: action.source } : {}
|
|
7968
|
+
}
|
|
7969
|
+
};
|
|
7970
|
+
} catch {
|
|
7971
|
+
return failed(
|
|
7972
|
+
"action-metadata-unavailable",
|
|
7973
|
+
"\u65E0\u6CD5\u8BFB\u53D6 Core Action \u5143\u6570\u636E\uFF0C\u6309\u5B89\u5168\u9ED8\u8BA4\u62D2\u7EDD\u6267\u884C\u3002"
|
|
7974
|
+
);
|
|
7975
|
+
}
|
|
7976
|
+
}
|
|
7977
|
+
function matchesRequest(action, request) {
|
|
7978
|
+
return action.name === request.action && action.httpMethod?.toUpperCase() === request.httpMethod && action.scope?.toLowerCase() === request.scope;
|
|
7979
|
+
}
|
|
7980
|
+
function parseActionRequest(inputArgv) {
|
|
7981
|
+
const argv = inputArgv[0] === "--" ? inputArgv.slice(1) : [...inputArgv];
|
|
7982
|
+
const spec = argv[1] ?? "";
|
|
7983
|
+
const separator = spec.indexOf(".");
|
|
7984
|
+
if (separator <= 0 || separator === spec.length - 1) {
|
|
7985
|
+
return failed("invalid-action-spec", "Action \u5FC5\u987B\u4F7F\u7528 <Model>.<Action> \u683C\u5F0F\u3002");
|
|
7986
|
+
}
|
|
7987
|
+
const httpMethod = (flagValue2(argv, "--method") ?? "POST").toUpperCase();
|
|
7988
|
+
if (!["GET", "POST", "PUT", "DELETE"].includes(httpMethod)) {
|
|
7989
|
+
return failed("invalid-action-method", "Action method \u5FC5\u987B\u662F GET\u3001POST\u3001PUT \u6216 DELETE\u3002");
|
|
7990
|
+
}
|
|
7991
|
+
const explicitScope = flagValue2(argv, "--scope");
|
|
7992
|
+
const scope = explicitScope ?? (flagValue2(argv, "--id") ? "object" : "class");
|
|
7993
|
+
if (scope !== "class" && scope !== "object") {
|
|
7994
|
+
return failed("invalid-action-scope", "Action scope \u5FC5\u987B\u662F class \u6216 object\u3002");
|
|
7995
|
+
}
|
|
7996
|
+
return {
|
|
7997
|
+
model: spec.slice(0, separator),
|
|
7998
|
+
action: spec.slice(separator + 1),
|
|
7999
|
+
httpMethod,
|
|
8000
|
+
scope,
|
|
8001
|
+
env: flagValue2(argv, "--env"),
|
|
8002
|
+
identity: flagValue2(argv, "--as"),
|
|
8003
|
+
profile: flagValue2(argv, "--profile")
|
|
8004
|
+
};
|
|
8005
|
+
}
|
|
8006
|
+
function failed(reasonCode, reason) {
|
|
8007
|
+
return { status: "failed", reasonCode, reason };
|
|
8008
|
+
}
|
|
8009
|
+
function flagValue2(argv, flag) {
|
|
8010
|
+
const equals = argv.find((arg) => arg.startsWith(`${flag}=`));
|
|
8011
|
+
if (equals) return equals.slice(flag.length + 1);
|
|
8012
|
+
const index = argv.indexOf(flag);
|
|
8013
|
+
return index >= 0 ? argv[index + 1] : void 0;
|
|
8014
|
+
}
|
|
8015
|
+
|
|
7892
8016
|
// src/commands/delivery-execution.ts
|
|
7893
8017
|
import { createHash as createHash6, randomBytes as secureRandomBytes } from "crypto";
|
|
7894
8018
|
import { spawn } from "child_process";
|
|
@@ -7904,7 +8028,7 @@ var PLAN_ID_PATTERN = /^[a-f0-9]{24}$/;
|
|
|
7904
8028
|
async function prepareDeliveryExecution(input) {
|
|
7905
8029
|
const project = await realProject(input.project);
|
|
7906
8030
|
await readProjectMode(project);
|
|
7907
|
-
const assessment =
|
|
8031
|
+
const assessment = await (input.assessCommand ?? assessEffectiveDeliveryCommand)(input.argv);
|
|
7908
8032
|
assertGuardedAssessment(assessment, input.argv);
|
|
7909
8033
|
const ttlSeconds = input.ttlSeconds ?? DEFAULT_TTL_SECONDS;
|
|
7910
8034
|
if (!Number.isInteger(ttlSeconds) || ttlSeconds < MIN_TTL_SECONDS || ttlSeconds > MAX_TTL_SECONDS) {
|
|
@@ -7967,7 +8091,7 @@ async function executeDeliveryPlan(input) {
|
|
|
7967
8091
|
}
|
|
7968
8092
|
if (now.getTime() < createdAt - 5e3) throw invalid4("\u5F53\u524D\u65F6\u95F4\u65E9\u4E8E\u8BA1\u5212\u521B\u5EFA\u65F6\u95F4");
|
|
7969
8093
|
if (now.getTime() > expiresAt) throw invalid4("\u6267\u884C\u8BA1\u5212\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0 prepare");
|
|
7970
|
-
const assessment =
|
|
8094
|
+
const assessment = await (input.assessCommand ?? assessEffectiveDeliveryCommand)(input.argv);
|
|
7971
8095
|
assertGuardedAssessment(assessment, input.argv);
|
|
7972
8096
|
if (canonicalJson(assessment) !== canonicalJson(plan.assessment)) {
|
|
7973
8097
|
throw invalid4("\u5B9E\u9645 argv \u4E0E\u6267\u884C\u8BA1\u5212\u7684\u547D\u4EE4\u6458\u8981\u6216\u98CE\u9669\u4E8B\u5B9E\u4E0D\u4E00\u81F4");
|
|
@@ -8389,7 +8513,7 @@ function invalid4(message, cause) {
|
|
|
8389
8513
|
init_auth_guard();
|
|
8390
8514
|
init_exit();
|
|
8391
8515
|
import {
|
|
8392
|
-
HcmClient as
|
|
8516
|
+
HcmClient as HcmClient18,
|
|
8393
8517
|
adminResetPassword,
|
|
8394
8518
|
formatObject as formatObject19,
|
|
8395
8519
|
fromAxiosError as fromAxiosError17,
|
|
@@ -8423,7 +8547,7 @@ async function userResetPasswordCommand(args) {
|
|
|
8423
8547
|
try {
|
|
8424
8548
|
const password = args.passwordStdin ? await readSecretFromStdin() : await promptPasswordTwice();
|
|
8425
8549
|
const request = buildAdminResetPasswordRequest(args, password);
|
|
8426
|
-
const client3 =
|
|
8550
|
+
const client3 = HcmClient18.fromAuthContext(await getActiveAuthContextFromCli(args));
|
|
8427
8551
|
const result2 = await adminResetPassword(client3.raw(), request);
|
|
8428
8552
|
process.stdout.write(formatObject19(result2, { format: args.output ?? "json" }) + "\n");
|
|
8429
8553
|
} catch (cause) {
|
|
@@ -8484,7 +8608,7 @@ identity.command("remove <name>").description("\u5220\u9664 identity\uFF08\u6E05
|
|
|
8484
8608
|
var user = program.command("user").description("\u7BA1\u7406\u79DF\u6237\u7528\u6237\u7684\u4E13\u7528\u51ED\u636E\u6D41\u7A0B");
|
|
8485
8609
|
user.command("reset-password").description("\u7531 admin.system \u5B89\u5168\u91CD\u7F6E\u7528\u6237\u5BC6\u7801\uFF0C\u5E76\u4F7F\u65E2\u6709\u4F1A\u8BDD\u5931\u6548").option("--id <uuid>", "\u76EE\u6807\u7528\u6237 ID\uFF08\u4E0E --username \u4E8C\u9009\u4E00\uFF09").option("--username <user>", "\u76EE\u6807\u7528\u6237\u540D\uFF08\u4E0E --id \u4E8C\u9009\u4E00\uFF09").option("--password-stdin", "\u4ECE\u6807\u51C6\u8F93\u5165\u8BFB\u53D6\u65B0\u5BC6\u7801\uFF08Agent/\u53D7\u63A7\u4EA4\u4ED8\u5FC5\u987B\u4F7F\u7528\uFF09").option("--no-force-change", "\u4E0B\u6B21\u767B\u5F55\u4E0D\u5F3A\u5236\u6539\u5BC6\uFF08\u4EC5\u9650\u5DF2\u6279\u51C6\u7684\u9694\u79BB\u6D4B\u8BD5\u73AF\u5883\uFF09").option("--env <name>", "\u4E34\u65F6\u5207\u73AF\u5883\uFF08\u8986\u76D6 activeEnv\uFF0C\u672C\u6B21\u547D\u4EE4\uFF09").option("--as <identity>", "\u4E34\u65F6\u6362\u8EAB\u4EFD\uFF08\u5FC5\u987B\u5177\u5907 admin.system\uFF09").option("--output <fmt>", "\u8F93\u51FA\u683C\u5F0F\uFF1Atable | json | yaml", "json").action((opts) => userResetPasswordCommand(opts));
|
|
8486
8610
|
var delivery = program.command("delivery").description("\u987E\u95EE\u4EA4\u4ED8\u547D\u4EE4\u7684\u98CE\u9669\u8BC4\u4F30\u4E0E\u4E00\u6B21\u6027\u53D7\u63A7\u6267\u884C\u5408\u540C");
|
|
8487
|
-
delivery.command("assess").description("\
|
|
8611
|
+
delivery.command("assess").description("\u8BC4\u4F30\u4E00\u6B21 HCM CLI argv\uFF1BAction \u98CE\u63A7\u58F0\u660E\u8BFB\u53D6\u81EA\u76EE\u6807 Core\uFF0C\u7528 -- \u5206\u9694\u88AB\u8BC4\u4F30\u547D\u4EE4").option("--output <fmt>", "\u8F93\u51FA\u683C\u5F0F\uFF1Atable | json | yaml", "json").allowUnknownOption(true).argument("<command...>", "\u88AB\u8BC4\u4F30\u7684 HCM \u5B50\u547D\u4EE4\u4E0E\u53C2\u6570\uFF0C\u4E0D\u5305\u542B hcm \u672C\u8EAB").action((command, opts) => deliveryAssessCommand(command, opts));
|
|
8488
8612
|
delivery.command("prepare").description("\u628A\u53D7\u652F\u6301\u7684 R2 argv \u4E0E\u9501\u3001\u8FD0\u884C\u65F6\u548C\u53D8\u66F4/\u56DE\u6EDA\u8BF4\u660E\u7ED1\u5B9A\u4E3A\u77ED\u65F6\u6267\u884C\u8BA1\u5212").requiredOption("--change-ref <file>", "\u9879\u76EE work/ \u6216 decisions/ \u4E0B\u7684\u53D8\u66F4\u8BF4\u660E").requiredOption("--rollback-ref <file>", "\u9879\u76EE work/ \u6216 decisions/ \u4E0B\u7684\u56DE\u6EDA\u8BF4\u660E").requiredOption("--evidence-dir <dir>", "\u9879\u76EE evidence/ \u4E0B\u7684\u6536\u636E\u76EE\u5F55").option("--project <dir>", "HCM \u987E\u95EE\u9879\u76EE\u6839\u76EE\u5F55", ".").option("--ttl-seconds <n>", "\u6709\u6548\u671F\u79D2\u6570\uFF0860-3600\uFF09", "900").option("--output <fmt>", "\u8F93\u51FA\u683C\u5F0F\uFF1Atable | json | yaml", "json").allowUnknownOption(true).argument("<command...>", "\u88AB\u7ED1\u5B9A\u7684 R2 HCM \u5B50\u547D\u4EE4\u4E0E\u53C2\u6570\uFF0C\u4E0D\u5305\u542B hcm \u672C\u8EAB").action((command, opts) => deliveryPrepareCommand(command, opts));
|
|
8489
8613
|
delivery.command("execute <planId>").description("\u9010\u6B21\u6279\u51C6\u540E\u6D88\u8D39\u77ED\u65F6\u8BA1\u5212\uFF0C\u5E76\u6267\u884C\u4E00\u6B21\u4E0E\u8BA1\u5212\u5B8C\u5168\u76F8\u540C\u7684 R2 argv").option("--project <dir>", "HCM \u987E\u95EE\u9879\u76EE\u6839\u76EE\u5F55", ".").option("--output <fmt>", "\u6536\u636E\u8F93\u51FA\u683C\u5F0F\uFF1Atable | json | yaml", "json").allowUnknownOption(true).argument("<command...>", "\u4E0E prepare \u5B8C\u5168\u76F8\u540C\u7684 R2 HCM \u5B50\u547D\u4EE4\u4E0E\u53C2\u6570").action((planId, command, opts) => deliveryExecuteCommand(planId, command, opts));
|
|
8490
8614
|
program.command("query <Model>").description("\u67E5\u8BE2 Model \u5217\u8868\u6570\u636E\uFF08\u901A\u8FC7 ModelQueryDsl JSON \u8868\u8FBE\u8FC7\u6EE4/\u6392\u5E8F/\u5206\u9875\uFF09").option(
|