@oncoding/bsteam 0.2.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/CHANGELOG.md +40 -0
- package/README.md +260 -0
- package/bin/argv.js +35 -0
- package/bin/dev.js +23 -0
- package/bin/run.js +25 -0
- package/bin/workspace-plugin.js +16 -0
- package/dist/auth/context-config.d.ts +91 -0
- package/dist/auth/context-config.d.ts.map +1 -0
- package/dist/auth/context-config.js +258 -0
- package/dist/auth/context-config.js.map +1 -0
- package/dist/auth/credential-store.d.ts +57 -0
- package/dist/auth/credential-store.d.ts.map +1 -0
- package/dist/auth/credential-store.js +146 -0
- package/dist/auth/credential-store.js.map +1 -0
- package/dist/base-command.d.ts +22 -0
- package/dist/base-command.d.ts.map +1 -0
- package/dist/base-command.js +33 -0
- package/dist/base-command.js.map +1 -0
- package/dist/command-utils/platform-command.d.ts +51 -0
- package/dist/command-utils/platform-command.d.ts.map +1 -0
- package/dist/command-utils/platform-command.js +178 -0
- package/dist/command-utils/platform-command.js.map +1 -0
- package/dist/commands/api.d.ts +26 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +132 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/auth/check.d.ts +21 -0
- package/dist/commands/auth/check.d.ts.map +1 -0
- package/dist/commands/auth/check.js +57 -0
- package/dist/commands/auth/check.js.map +1 -0
- package/dist/commands/auth/list.d.ts +13 -0
- package/dist/commands/auth/list.d.ts.map +1 -0
- package/dist/commands/auth/list.js +56 -0
- package/dist/commands/auth/list.js.map +1 -0
- package/dist/commands/auth/login.d.ts +27 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +155 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +15 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +55 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/scopes.d.ts +18 -0
- package/dist/commands/auth/scopes.d.ts.map +1 -0
- package/dist/commands/auth/scopes.js +56 -0
- package/dist/commands/auth/scopes.js.map +1 -0
- package/dist/commands/auth/status.d.ts +17 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +81 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/auth/token/create.d.ts +22 -0
- package/dist/commands/auth/token/create.d.ts.map +1 -0
- package/dist/commands/auth/token/create.js +46 -0
- package/dist/commands/auth/token/create.js.map +1 -0
- package/dist/commands/auth/token/list.d.ts +17 -0
- package/dist/commands/auth/token/list.d.ts.map +1 -0
- package/dist/commands/auth/token/list.js +33 -0
- package/dist/commands/auth/token/list.js.map +1 -0
- package/dist/commands/auth/token/revoke.d.ts +24 -0
- package/dist/commands/auth/token/revoke.d.ts.map +1 -0
- package/dist/commands/auth/token/revoke.js +29 -0
- package/dist/commands/auth/token/revoke.js.map +1 -0
- package/dist/commands/config/show.d.ts +13 -0
- package/dist/commands/config/show.d.ts.map +1 -0
- package/dist/commands/config/show.js +34 -0
- package/dist/commands/config/show.js.map +1 -0
- package/dist/commands/kb/acl/grant.d.ts +27 -0
- package/dist/commands/kb/acl/grant.d.ts.map +1 -0
- package/dist/commands/kb/acl/grant.js +49 -0
- package/dist/commands/kb/acl/grant.js.map +1 -0
- package/dist/commands/kb/acl/list.d.ts +20 -0
- package/dist/commands/kb/acl/list.d.ts.map +1 -0
- package/dist/commands/kb/acl/list.js +35 -0
- package/dist/commands/kb/acl/list.js.map +1 -0
- package/dist/commands/kb/acl/revoke.d.ts +25 -0
- package/dist/commands/kb/acl/revoke.d.ts.map +1 -0
- package/dist/commands/kb/acl/revoke.js +27 -0
- package/dist/commands/kb/acl/revoke.js.map +1 -0
- package/dist/commands/kb/acl/update.d.ts +28 -0
- package/dist/commands/kb/acl/update.d.ts.map +1 -0
- package/dist/commands/kb/acl/update.js +40 -0
- package/dist/commands/kb/acl/update.js.map +1 -0
- package/dist/commands/kb/create.d.ts +26 -0
- package/dist/commands/kb/create.d.ts.map +1 -0
- package/dist/commands/kb/create.js +59 -0
- package/dist/commands/kb/create.js.map +1 -0
- package/dist/commands/kb/delete.d.ts +24 -0
- package/dist/commands/kb/delete.d.ts.map +1 -0
- package/dist/commands/kb/delete.js +29 -0
- package/dist/commands/kb/delete.js.map +1 -0
- package/dist/commands/kb/doctor.d.ts +17 -0
- package/dist/commands/kb/doctor.d.ts.map +1 -0
- package/dist/commands/kb/doctor.js +48 -0
- package/dist/commands/kb/doctor.js.map +1 -0
- package/dist/commands/kb/file.d.ts +23 -0
- package/dist/commands/kb/file.d.ts.map +1 -0
- package/dist/commands/kb/file.js +97 -0
- package/dist/commands/kb/file.js.map +1 -0
- package/dist/commands/kb/get.d.ts +20 -0
- package/dist/commands/kb/get.d.ts.map +1 -0
- package/dist/commands/kb/get.js +37 -0
- package/dist/commands/kb/get.js.map +1 -0
- package/dist/commands/kb/git.d.ts +20 -0
- package/dist/commands/kb/git.d.ts.map +1 -0
- package/dist/commands/kb/git.js +46 -0
- package/dist/commands/kb/git.js.map +1 -0
- package/dist/commands/kb/list.d.ts +17 -0
- package/dist/commands/kb/list.d.ts.map +1 -0
- package/dist/commands/kb/list.js +36 -0
- package/dist/commands/kb/list.js.map +1 -0
- package/dist/commands/kb/share/create.d.ts +25 -0
- package/dist/commands/kb/share/create.d.ts.map +1 -0
- package/dist/commands/kb/share/create.js +42 -0
- package/dist/commands/kb/share/create.js.map +1 -0
- package/dist/commands/kb/share/list.d.ts +20 -0
- package/dist/commands/kb/share/list.d.ts.map +1 -0
- package/dist/commands/kb/share/list.js +35 -0
- package/dist/commands/kb/share/list.js.map +1 -0
- package/dist/commands/kb/share/revoke.d.ts +25 -0
- package/dist/commands/kb/share/revoke.d.ts.map +1 -0
- package/dist/commands/kb/share/revoke.js +27 -0
- package/dist/commands/kb/share/revoke.js.map +1 -0
- package/dist/commands/kb/tree.d.ts +20 -0
- package/dist/commands/kb/tree.d.ts.map +1 -0
- package/dist/commands/kb/tree.js +39 -0
- package/dist/commands/kb/tree.js.map +1 -0
- package/dist/commands/kb/update.d.ts +29 -0
- package/dist/commands/kb/update.d.ts.map +1 -0
- package/dist/commands/kb/update.js +49 -0
- package/dist/commands/kb/update.js.map +1 -0
- package/dist/commands/reimbursement/create.d.ts +31 -0
- package/dist/commands/reimbursement/create.d.ts.map +1 -0
- package/dist/commands/reimbursement/create.js +67 -0
- package/dist/commands/reimbursement/create.js.map +1 -0
- package/dist/commands/reimbursement/delete.d.ts +24 -0
- package/dist/commands/reimbursement/delete.d.ts.map +1 -0
- package/dist/commands/reimbursement/delete.js +26 -0
- package/dist/commands/reimbursement/delete.js.map +1 -0
- package/dist/commands/reimbursement/list.d.ts +17 -0
- package/dist/commands/reimbursement/list.d.ts.map +1 -0
- package/dist/commands/reimbursement/list.js +33 -0
- package/dist/commands/reimbursement/list.js.map +1 -0
- package/dist/commands/reimbursement/operations.d.ts +17 -0
- package/dist/commands/reimbursement/operations.d.ts.map +1 -0
- package/dist/commands/reimbursement/operations.js +19 -0
- package/dist/commands/reimbursement/operations.js.map +1 -0
- package/dist/commands/reimbursement/permissions/list.d.ts +17 -0
- package/dist/commands/reimbursement/permissions/list.d.ts.map +1 -0
- package/dist/commands/reimbursement/permissions/list.js +32 -0
- package/dist/commands/reimbursement/permissions/list.js.map +1 -0
- package/dist/commands/reimbursement/permissions/replace.d.ts +22 -0
- package/dist/commands/reimbursement/permissions/replace.d.ts.map +1 -0
- package/dist/commands/reimbursement/permissions/replace.js +32 -0
- package/dist/commands/reimbursement/permissions/replace.js.map +1 -0
- package/dist/commands/reimbursement/update.d.ts +31 -0
- package/dist/commands/reimbursement/update.d.ts.map +1 -0
- package/dist/commands/reimbursement/update.js +56 -0
- package/dist/commands/reimbursement/update.js.map +1 -0
- package/dist/commands/token/create.d.ts +26 -0
- package/dist/commands/token/create.d.ts.map +1 -0
- package/dist/commands/token/create.js +52 -0
- package/dist/commands/token/create.js.map +1 -0
- package/dist/commands/token/delete.d.ts +24 -0
- package/dist/commands/token/delete.d.ts.map +1 -0
- package/dist/commands/token/delete.js +26 -0
- package/dist/commands/token/delete.js.map +1 -0
- package/dist/commands/token/list.d.ts +17 -0
- package/dist/commands/token/list.d.ts.map +1 -0
- package/dist/commands/token/list.js +33 -0
- package/dist/commands/token/list.js.map +1 -0
- package/dist/commands/token/operations.d.ts +17 -0
- package/dist/commands/token/operations.d.ts.map +1 -0
- package/dist/commands/token/operations.js +19 -0
- package/dist/commands/token/operations.js.map +1 -0
- package/dist/commands/token/permissions/list.d.ts +17 -0
- package/dist/commands/token/permissions/list.d.ts.map +1 -0
- package/dist/commands/token/permissions/list.js +32 -0
- package/dist/commands/token/permissions/list.js.map +1 -0
- package/dist/commands/token/permissions/replace.d.ts +22 -0
- package/dist/commands/token/permissions/replace.d.ts.map +1 -0
- package/dist/commands/token/permissions/replace.js +32 -0
- package/dist/commands/token/permissions/replace.js.map +1 -0
- package/dist/commands/token/precheck.d.ts +20 -0
- package/dist/commands/token/precheck.d.ts.map +1 -0
- package/dist/commands/token/precheck.js +30 -0
- package/dist/commands/token/precheck.js.map +1 -0
- package/dist/commands/token/reveal.d.ts +24 -0
- package/dist/commands/token/reveal.d.ts.map +1 -0
- package/dist/commands/token/reveal.js +29 -0
- package/dist/commands/token/reveal.js.map +1 -0
- package/dist/commands/token/update.d.ts +29 -0
- package/dist/commands/token/update.d.ts.map +1 -0
- package/dist/commands/token/update.js +47 -0
- package/dist/commands/token/update.js.map +1 -0
- package/dist/commands/version.d.ts +13 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +16 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config/config-loader.d.ts +23 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +35 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/exit-codes.d.ts +14 -0
- package/dist/config/exit-codes.d.ts.map +1 -0
- package/dist/config/exit-codes.js +15 -0
- package/dist/config/exit-codes.js.map +1 -0
- package/dist/config/profiles.d.ts +14 -0
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/profiles.js +28 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/formatters/envelope.d.ts +10 -0
- package/dist/formatters/envelope.d.ts.map +1 -0
- package/dist/formatters/envelope.js +13 -0
- package/dist/formatters/envelope.js.map +1 -0
- package/dist/formatters/index.d.ts +4 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +3 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/table.d.ts +7 -0
- package/dist/formatters/table.d.ts.map +1 -0
- package/dist/formatters/table.js +17 -0
- package/dist/formatters/table.js.map +1 -0
- package/dist/hooks/init.d.ts +8 -0
- package/dist/hooks/init.d.ts.map +1 -0
- package/dist/hooks/init.js +17 -0
- package/dist/hooks/init.js.map +1 -0
- package/dist/hooks/prerun.d.ts +8 -0
- package/dist/hooks/prerun.d.ts.map +1 -0
- package/dist/hooks/prerun.js +29 -0
- package/dist/hooks/prerun.js.map +1 -0
- package/dist/http/platform-api.d.ts +48 -0
- package/dist/http/platform-api.d.ts.map +1 -0
- package/dist/http/platform-api.js +228 -0
- package/dist/http/platform-api.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { chmod, mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { getBsteamHome, normalizeApiUrl, normalizeCredentialName, redactToken, } from './credential-store.js';
|
|
5
|
+
const CONTEXT_CONFIG_API_VERSION = 'bsteam.io/v1';
|
|
6
|
+
const CONTEXT_CONFIG_KIND = 'Config';
|
|
7
|
+
const DEFAULT_CONTEXT_NAME = 'default';
|
|
8
|
+
export function getBsteamConfigFilePath(pathOverride) {
|
|
9
|
+
return pathOverride
|
|
10
|
+
?? process.env.BSTEAM_CONFIG
|
|
11
|
+
?? process.env.BSTEAM_CONFIG_FILE
|
|
12
|
+
?? join(getBsteamHome(), 'config.json');
|
|
13
|
+
}
|
|
14
|
+
export function getDefaultContextName() {
|
|
15
|
+
return process.env.BSTEAM_CONTEXT ?? DEFAULT_CONTEXT_NAME;
|
|
16
|
+
}
|
|
17
|
+
export async function readContextConfig(path = getBsteamConfigFilePath()) {
|
|
18
|
+
if (!existsSync(path))
|
|
19
|
+
return emptyContextConfigFile();
|
|
20
|
+
const raw = await readFile(path, 'utf8');
|
|
21
|
+
if (!raw.trim())
|
|
22
|
+
return emptyContextConfigFile();
|
|
23
|
+
const parsed = JSON.parse(raw);
|
|
24
|
+
return {
|
|
25
|
+
apiVersion: CONTEXT_CONFIG_API_VERSION,
|
|
26
|
+
kind: CONTEXT_CONFIG_KIND,
|
|
27
|
+
currentContext: typeof parsed.currentContext === 'string' ? parsed.currentContext : undefined,
|
|
28
|
+
clusters: normalizeClusters(parsed.clusters),
|
|
29
|
+
users: normalizeUsers(parsed.users),
|
|
30
|
+
contexts: normalizeContexts(parsed.contexts),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export async function writeContextConfig(file, path = getBsteamConfigFilePath()) {
|
|
34
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
35
|
+
const tmpPath = `${path}.${process.pid}.tmp`;
|
|
36
|
+
await writeFile(tmpPath, `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
|
|
37
|
+
await chmod(tmpPath, 0o600);
|
|
38
|
+
await rm(path, { force: true });
|
|
39
|
+
await rename(tmpPath, path);
|
|
40
|
+
await chmod(path, 0o600);
|
|
41
|
+
}
|
|
42
|
+
export async function saveContextCredential(credential, options = {}) {
|
|
43
|
+
const contextName = normalizeCredentialName(credential.contextName ?? getDefaultContextName());
|
|
44
|
+
const clusterName = normalizeCredentialName(credential.clusterName ?? contextName);
|
|
45
|
+
const userName = normalizeCredentialName(credential.userName ?? contextName);
|
|
46
|
+
const apiUrl = normalizeApiUrl(credential.apiUrl);
|
|
47
|
+
const file = await readContextConfig(getBsteamConfigFilePath(options.configPath));
|
|
48
|
+
const savedAt = credential.savedAt ?? new Date().toISOString();
|
|
49
|
+
file.clusters[clusterName] = {
|
|
50
|
+
...file.clusters[clusterName],
|
|
51
|
+
server: apiUrl,
|
|
52
|
+
};
|
|
53
|
+
file.users[userName] = {
|
|
54
|
+
token: credential.token,
|
|
55
|
+
savedAt,
|
|
56
|
+
lastVerifiedAt: credential.lastVerifiedAt,
|
|
57
|
+
user: credential.user,
|
|
58
|
+
capabilities: credential.capabilities,
|
|
59
|
+
};
|
|
60
|
+
file.contexts[contextName] = {
|
|
61
|
+
cluster: clusterName,
|
|
62
|
+
user: userName,
|
|
63
|
+
domain: credential.activeDomainId,
|
|
64
|
+
};
|
|
65
|
+
if (options.setCurrent ?? true)
|
|
66
|
+
file.currentContext = contextName;
|
|
67
|
+
await writeContextConfig(file, getBsteamConfigFilePath(options.configPath));
|
|
68
|
+
return {
|
|
69
|
+
contextName,
|
|
70
|
+
clusterName,
|
|
71
|
+
userName,
|
|
72
|
+
apiUrl,
|
|
73
|
+
token: credential.token,
|
|
74
|
+
activeDomainId: credential.activeDomainId,
|
|
75
|
+
savedAt,
|
|
76
|
+
lastVerifiedAt: credential.lastVerifiedAt,
|
|
77
|
+
user: credential.user,
|
|
78
|
+
capabilities: credential.capabilities,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export async function getContextCredential(contextName, configPath) {
|
|
82
|
+
const file = await readContextConfig(getBsteamConfigFilePath(configPath));
|
|
83
|
+
const resolvedName = contextName ?? process.env.BSTEAM_CONTEXT ?? file.currentContext;
|
|
84
|
+
if (!resolvedName)
|
|
85
|
+
return undefined;
|
|
86
|
+
const context = file.contexts[resolvedName];
|
|
87
|
+
if (!context)
|
|
88
|
+
return undefined;
|
|
89
|
+
const cluster = file.clusters[context.cluster];
|
|
90
|
+
const user = file.users[context.user];
|
|
91
|
+
if (!cluster)
|
|
92
|
+
return undefined;
|
|
93
|
+
return {
|
|
94
|
+
contextName: resolvedName,
|
|
95
|
+
clusterName: context.cluster,
|
|
96
|
+
userName: context.user,
|
|
97
|
+
apiUrl: cluster.server,
|
|
98
|
+
token: user?.token,
|
|
99
|
+
activeDomainId: context.domain,
|
|
100
|
+
savedAt: user?.savedAt,
|
|
101
|
+
lastVerifiedAt: user?.lastVerifiedAt,
|
|
102
|
+
user: user?.user,
|
|
103
|
+
capabilities: user?.capabilities,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export async function listContextCredentials(configPath) {
|
|
107
|
+
const file = await readContextConfig(getBsteamConfigFilePath(configPath));
|
|
108
|
+
return Object.entries(file.contexts)
|
|
109
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
110
|
+
.map(([contextName, context]) => {
|
|
111
|
+
const cluster = file.clusters[context.cluster];
|
|
112
|
+
const user = file.users[context.user];
|
|
113
|
+
return summarizeContextCredential({
|
|
114
|
+
contextName,
|
|
115
|
+
clusterName: context.cluster,
|
|
116
|
+
userName: context.user,
|
|
117
|
+
apiUrl: cluster?.server ?? '',
|
|
118
|
+
token: user?.token,
|
|
119
|
+
activeDomainId: context.domain,
|
|
120
|
+
savedAt: user?.savedAt,
|
|
121
|
+
lastVerifiedAt: user?.lastVerifiedAt,
|
|
122
|
+
user: user?.user,
|
|
123
|
+
capabilities: user?.capabilities,
|
|
124
|
+
}, contextName === file.currentContext);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
export async function deleteContext(contextName, configPath) {
|
|
128
|
+
const path = getBsteamConfigFilePath(configPath);
|
|
129
|
+
const file = await readContextConfig(path);
|
|
130
|
+
const resolvedName = contextName ?? file.currentContext;
|
|
131
|
+
if (!resolvedName || !file.contexts[resolvedName]) {
|
|
132
|
+
return { deleted: [], currentContext: file.currentContext };
|
|
133
|
+
}
|
|
134
|
+
const context = file.contexts[resolvedName];
|
|
135
|
+
delete file.contexts[resolvedName];
|
|
136
|
+
cleanupUnreferencedConfig(file, context.cluster, context.user);
|
|
137
|
+
if (file.currentContext === resolvedName) {
|
|
138
|
+
file.currentContext = Object.keys(file.contexts).sort()[0];
|
|
139
|
+
}
|
|
140
|
+
await writeContextConfig(file, path);
|
|
141
|
+
return { deleted: [resolvedName], currentContext: file.currentContext };
|
|
142
|
+
}
|
|
143
|
+
export async function deleteAllContexts(configPath) {
|
|
144
|
+
const path = getBsteamConfigFilePath(configPath);
|
|
145
|
+
const file = await readContextConfig(path);
|
|
146
|
+
const deleted = Object.keys(file.contexts);
|
|
147
|
+
await writeContextConfig(emptyContextConfigFile(), path);
|
|
148
|
+
return { deleted };
|
|
149
|
+
}
|
|
150
|
+
export function summarizeContextCredential(credential, isCurrent = false) {
|
|
151
|
+
return {
|
|
152
|
+
contextName: credential.contextName,
|
|
153
|
+
clusterName: credential.clusterName,
|
|
154
|
+
userName: credential.userName,
|
|
155
|
+
apiUrl: credential.apiUrl,
|
|
156
|
+
tokenRedacted: redactToken(credential.token),
|
|
157
|
+
isCurrent,
|
|
158
|
+
activeDomainId: credential.activeDomainId,
|
|
159
|
+
savedAt: credential.savedAt,
|
|
160
|
+
lastVerifiedAt: credential.lastVerifiedAt,
|
|
161
|
+
user: credential.user,
|
|
162
|
+
capabilitiesCount: credential.capabilities?.length,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export function redactContextConfig(file) {
|
|
166
|
+
const users = {};
|
|
167
|
+
for (const [name, user] of Object.entries(file.users)) {
|
|
168
|
+
users[name] = {
|
|
169
|
+
savedAt: user.savedAt,
|
|
170
|
+
lastVerifiedAt: user.lastVerifiedAt,
|
|
171
|
+
user: user.user,
|
|
172
|
+
capabilities: user.capabilities,
|
|
173
|
+
tokenRedacted: redactToken(user.token),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
apiVersion: file.apiVersion,
|
|
178
|
+
kind: file.kind,
|
|
179
|
+
currentContext: file.currentContext,
|
|
180
|
+
clusters: file.clusters,
|
|
181
|
+
users,
|
|
182
|
+
contexts: file.contexts,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function emptyContextConfigFile() {
|
|
186
|
+
return {
|
|
187
|
+
apiVersion: CONTEXT_CONFIG_API_VERSION,
|
|
188
|
+
kind: CONTEXT_CONFIG_KIND,
|
|
189
|
+
currentContext: undefined,
|
|
190
|
+
clusters: {},
|
|
191
|
+
users: {},
|
|
192
|
+
contexts: {},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function normalizeClusters(value) {
|
|
196
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
197
|
+
return {};
|
|
198
|
+
const out = {};
|
|
199
|
+
for (const [name, raw] of Object.entries(value)) {
|
|
200
|
+
if (!raw || typeof raw !== 'object')
|
|
201
|
+
continue;
|
|
202
|
+
const item = raw;
|
|
203
|
+
if (typeof item.server !== 'string' || !item.server.trim())
|
|
204
|
+
continue;
|
|
205
|
+
out[name] = {
|
|
206
|
+
server: normalizeApiUrl(item.server),
|
|
207
|
+
description: typeof item.description === 'string' ? item.description : undefined,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
function normalizeUsers(value) {
|
|
213
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
214
|
+
return {};
|
|
215
|
+
const out = {};
|
|
216
|
+
for (const [name, raw] of Object.entries(value)) {
|
|
217
|
+
if (!raw || typeof raw !== 'object')
|
|
218
|
+
continue;
|
|
219
|
+
const item = raw;
|
|
220
|
+
out[name] = {
|
|
221
|
+
token: typeof item.token === 'string' ? item.token : undefined,
|
|
222
|
+
savedAt: typeof item.savedAt === 'string' ? item.savedAt : undefined,
|
|
223
|
+
lastVerifiedAt: typeof item.lastVerifiedAt === 'string' ? item.lastVerifiedAt : undefined,
|
|
224
|
+
user: item.user,
|
|
225
|
+
capabilities: Array.isArray(item.capabilities)
|
|
226
|
+
? item.capabilities.filter((capability) => typeof capability === 'string')
|
|
227
|
+
: undefined,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return out;
|
|
231
|
+
}
|
|
232
|
+
function normalizeContexts(value) {
|
|
233
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
234
|
+
return {};
|
|
235
|
+
const out = {};
|
|
236
|
+
for (const [name, raw] of Object.entries(value)) {
|
|
237
|
+
if (!raw || typeof raw !== 'object')
|
|
238
|
+
continue;
|
|
239
|
+
const item = raw;
|
|
240
|
+
if (typeof item.cluster !== 'string' || typeof item.user !== 'string')
|
|
241
|
+
continue;
|
|
242
|
+
out[name] = {
|
|
243
|
+
cluster: item.cluster,
|
|
244
|
+
user: item.user,
|
|
245
|
+
domain: typeof item.domain === 'string' ? item.domain : undefined,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
function cleanupUnreferencedConfig(file, clusterName, userName) {
|
|
251
|
+
const clusterStillUsed = Object.values(file.contexts).some((context) => context.cluster === clusterName);
|
|
252
|
+
const userStillUsed = Object.values(file.contexts).some((context) => context.user === userName);
|
|
253
|
+
if (!clusterStillUsed)
|
|
254
|
+
delete file.clusters[clusterName];
|
|
255
|
+
if (!userStillUsed)
|
|
256
|
+
delete file.users[userName];
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=context-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-config.js","sourceRoot":"","sources":["../../src/auth/context-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface CredentialUserSnapshot {
|
|
2
|
+
id?: string;
|
|
3
|
+
principal_id?: string;
|
|
4
|
+
display_name?: string;
|
|
5
|
+
email?: string;
|
|
6
|
+
tenant_id?: string;
|
|
7
|
+
status?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface StoredCredential {
|
|
10
|
+
name: string;
|
|
11
|
+
apiUrl: string;
|
|
12
|
+
token: string;
|
|
13
|
+
savedAt: string;
|
|
14
|
+
lastVerifiedAt?: string;
|
|
15
|
+
user?: CredentialUserSnapshot;
|
|
16
|
+
capabilities?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface CredentialFile {
|
|
19
|
+
version: 1;
|
|
20
|
+
default?: string;
|
|
21
|
+
credentials: Record<string, StoredCredential>;
|
|
22
|
+
}
|
|
23
|
+
export interface CredentialSummary {
|
|
24
|
+
name: string;
|
|
25
|
+
apiUrl: string;
|
|
26
|
+
tokenRedacted: string;
|
|
27
|
+
isDefault: boolean;
|
|
28
|
+
savedAt: string;
|
|
29
|
+
lastVerifiedAt?: string;
|
|
30
|
+
user?: CredentialUserSnapshot;
|
|
31
|
+
capabilitiesCount?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function getBsteamHome(): string;
|
|
34
|
+
export declare function getCredentialsFilePath(): string;
|
|
35
|
+
export declare function getDefaultCredentialName(): string;
|
|
36
|
+
export declare function readCredentialFile(path?: string): Promise<CredentialFile>;
|
|
37
|
+
export declare function writeCredentialFile(file: CredentialFile, path?: string): Promise<void>;
|
|
38
|
+
export declare function saveCredential(credential: Omit<StoredCredential, 'name' | 'savedAt'> & {
|
|
39
|
+
name?: string;
|
|
40
|
+
savedAt?: string;
|
|
41
|
+
}, options?: {
|
|
42
|
+
setDefault?: boolean;
|
|
43
|
+
}): Promise<StoredCredential>;
|
|
44
|
+
export declare function getCredential(name?: string): Promise<StoredCredential | undefined>;
|
|
45
|
+
export declare function listCredentials(): Promise<CredentialSummary[]>;
|
|
46
|
+
export declare function deleteCredential(name?: string): Promise<{
|
|
47
|
+
deleted: string[];
|
|
48
|
+
default?: string;
|
|
49
|
+
}>;
|
|
50
|
+
export declare function deleteAllCredentials(): Promise<{
|
|
51
|
+
deleted: string[];
|
|
52
|
+
}>;
|
|
53
|
+
export declare function summarizeCredential(credential: StoredCredential, isDefault?: boolean): CredentialSummary;
|
|
54
|
+
export declare function redactToken(token?: string): string;
|
|
55
|
+
export declare function normalizeApiUrl(apiUrl: string): string;
|
|
56
|
+
export declare function normalizeCredentialName(value: string): string;
|
|
57
|
+
//# sourceMappingURL=credential-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,sBAAsB;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAKD,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,SAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAUjG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,SAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9G;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,EACD,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAgB3B;AAED,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAIxF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAMpE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAatG;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAK3E;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,gBAAgB,EAC5B,SAAS,UAAQ,GAChB,iBAAiB,CAWnB;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7D"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
const CREDENTIAL_FILE_VERSION = 1;
|
|
6
|
+
const DEFAULT_CREDENTIAL_NAME = 'default';
|
|
7
|
+
export function getBsteamHome() {
|
|
8
|
+
return process.env.BSTEAM_CONFIG_HOME
|
|
9
|
+
?? process.env.BSTEAM_HOME
|
|
10
|
+
?? join(homedir(), '.bsteam');
|
|
11
|
+
}
|
|
12
|
+
export function getCredentialsFilePath() {
|
|
13
|
+
return process.env.BSTEAM_CREDENTIALS_FILE ?? join(getBsteamHome(), 'credentials.json');
|
|
14
|
+
}
|
|
15
|
+
export function getDefaultCredentialName() {
|
|
16
|
+
return process.env.BSTEAM_CREDENTIAL ?? DEFAULT_CREDENTIAL_NAME;
|
|
17
|
+
}
|
|
18
|
+
export async function readCredentialFile(path = getCredentialsFilePath()) {
|
|
19
|
+
if (!existsSync(path))
|
|
20
|
+
return emptyCredentialFile();
|
|
21
|
+
const raw = await readFile(path, 'utf8');
|
|
22
|
+
const parsed = JSON.parse(raw);
|
|
23
|
+
return {
|
|
24
|
+
version: CREDENTIAL_FILE_VERSION,
|
|
25
|
+
default: typeof parsed.default === 'string' ? parsed.default : undefined,
|
|
26
|
+
credentials: normalizeCredentials(parsed.credentials),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export async function writeCredentialFile(file, path = getCredentialsFilePath()) {
|
|
30
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
31
|
+
const tmpPath = `${path}.${process.pid}.tmp`;
|
|
32
|
+
await writeFile(tmpPath, `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
|
|
33
|
+
await chmod(tmpPath, 0o600);
|
|
34
|
+
await rm(path, { force: true });
|
|
35
|
+
await writeFile(path, await readFile(tmpPath), { mode: 0o600 });
|
|
36
|
+
await rm(tmpPath, { force: true });
|
|
37
|
+
await chmod(path, 0o600);
|
|
38
|
+
}
|
|
39
|
+
export async function saveCredential(credential, options = {}) {
|
|
40
|
+
const name = normalizeCredentialName(credential.name ?? getDefaultCredentialName());
|
|
41
|
+
const file = await readCredentialFile();
|
|
42
|
+
const saved = {
|
|
43
|
+
name,
|
|
44
|
+
apiUrl: normalizeApiUrl(credential.apiUrl),
|
|
45
|
+
token: credential.token,
|
|
46
|
+
savedAt: credential.savedAt ?? new Date().toISOString(),
|
|
47
|
+
lastVerifiedAt: credential.lastVerifiedAt,
|
|
48
|
+
user: credential.user,
|
|
49
|
+
capabilities: credential.capabilities,
|
|
50
|
+
};
|
|
51
|
+
file.credentials[name] = saved;
|
|
52
|
+
if (options.setDefault ?? true)
|
|
53
|
+
file.default = name;
|
|
54
|
+
await writeCredentialFile(file);
|
|
55
|
+
return saved;
|
|
56
|
+
}
|
|
57
|
+
export async function getCredential(name) {
|
|
58
|
+
const file = await readCredentialFile();
|
|
59
|
+
const resolvedName = name ?? file.default ?? getDefaultCredentialName();
|
|
60
|
+
return file.credentials[resolvedName];
|
|
61
|
+
}
|
|
62
|
+
export async function listCredentials() {
|
|
63
|
+
const file = await readCredentialFile();
|
|
64
|
+
const defaultName = file.default ?? getDefaultCredentialName();
|
|
65
|
+
return Object.values(file.credentials)
|
|
66
|
+
.sort((a, b) => a.name.localeCompare(b.name))
|
|
67
|
+
.map((credential) => summarizeCredential(credential, credential.name === defaultName));
|
|
68
|
+
}
|
|
69
|
+
export async function deleteCredential(name) {
|
|
70
|
+
const file = await readCredentialFile();
|
|
71
|
+
const resolvedName = name ?? file.default ?? getDefaultCredentialName();
|
|
72
|
+
if (!file.credentials[resolvedName]) {
|
|
73
|
+
return { deleted: [], default: file.default };
|
|
74
|
+
}
|
|
75
|
+
delete file.credentials[resolvedName];
|
|
76
|
+
if (file.default === resolvedName) {
|
|
77
|
+
file.default = Object.keys(file.credentials).sort()[0];
|
|
78
|
+
}
|
|
79
|
+
await writeCredentialFile(file);
|
|
80
|
+
return { deleted: [resolvedName], default: file.default };
|
|
81
|
+
}
|
|
82
|
+
export async function deleteAllCredentials() {
|
|
83
|
+
const file = await readCredentialFile();
|
|
84
|
+
const deleted = Object.keys(file.credentials);
|
|
85
|
+
await writeCredentialFile(emptyCredentialFile());
|
|
86
|
+
return { deleted };
|
|
87
|
+
}
|
|
88
|
+
export function summarizeCredential(credential, isDefault = false) {
|
|
89
|
+
return {
|
|
90
|
+
name: credential.name,
|
|
91
|
+
apiUrl: credential.apiUrl,
|
|
92
|
+
tokenRedacted: redactToken(credential.token),
|
|
93
|
+
isDefault,
|
|
94
|
+
savedAt: credential.savedAt,
|
|
95
|
+
lastVerifiedAt: credential.lastVerifiedAt,
|
|
96
|
+
user: credential.user,
|
|
97
|
+
capabilitiesCount: credential.capabilities?.length,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function redactToken(token) {
|
|
101
|
+
if (!token)
|
|
102
|
+
return '';
|
|
103
|
+
if (token.length <= 12)
|
|
104
|
+
return '***';
|
|
105
|
+
return `${token.slice(0, 6)}...${token.slice(-4)}`;
|
|
106
|
+
}
|
|
107
|
+
export function normalizeApiUrl(apiUrl) {
|
|
108
|
+
return apiUrl.replace(/\/+$/, '');
|
|
109
|
+
}
|
|
110
|
+
export function normalizeCredentialName(value) {
|
|
111
|
+
const name = value.trim();
|
|
112
|
+
if (!/^[a-zA-Z0-9_.-]+$/.test(name)) {
|
|
113
|
+
throw new Error('credential name can only contain letters, numbers, dot, underscore, and dash');
|
|
114
|
+
}
|
|
115
|
+
return name;
|
|
116
|
+
}
|
|
117
|
+
function emptyCredentialFile() {
|
|
118
|
+
return {
|
|
119
|
+
version: CREDENTIAL_FILE_VERSION,
|
|
120
|
+
default: undefined,
|
|
121
|
+
credentials: {},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function normalizeCredentials(value) {
|
|
125
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
126
|
+
return {};
|
|
127
|
+
const out = {};
|
|
128
|
+
for (const [name, raw] of Object.entries(value)) {
|
|
129
|
+
if (!raw || typeof raw !== 'object')
|
|
130
|
+
continue;
|
|
131
|
+
const item = raw;
|
|
132
|
+
if (typeof item.apiUrl !== 'string' || typeof item.token !== 'string')
|
|
133
|
+
continue;
|
|
134
|
+
out[name] = {
|
|
135
|
+
name,
|
|
136
|
+
apiUrl: normalizeApiUrl(item.apiUrl),
|
|
137
|
+
token: item.token,
|
|
138
|
+
savedAt: typeof item.savedAt === 'string' ? item.savedAt : new Date(0).toISOString(),
|
|
139
|
+
lastVerifiedAt: typeof item.lastVerifiedAt === 'string' ? item.lastVerifiedAt : undefined,
|
|
140
|
+
user: item.user,
|
|
141
|
+
capabilities: Array.isArray(item.capabilities) ? item.capabilities.filter((x) => typeof x === 'string') : undefined,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=credential-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/auth/credential-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export declare abstract class BaseCommand extends Command {
|
|
3
|
+
static baseFlags: {
|
|
4
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
5
|
+
profile: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
6
|
+
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
context: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
'trace-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
protected isTTY: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* JSON envelope 输出
|
|
13
|
+
* 遵循 { version, ok, data, error, _notice } 协议
|
|
14
|
+
*/
|
|
15
|
+
protected outputEnvelope(data: unknown, ok?: boolean): void;
|
|
16
|
+
/**
|
|
17
|
+
* 高风险门禁检查 — 子类可覆盖
|
|
18
|
+
* 默认无门禁;高风险命令应 override 此方法
|
|
19
|
+
*/
|
|
20
|
+
protected assertSafeExecution(_flags: Record<string, unknown>): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=base-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../src/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAE7C,8BAAsB,WAAY,SAAQ,OAAO;IAC/C,MAAM,CAAC,SAAS;;;;;;MAMd;IAEF,SAAS,CAAC,KAAK,UAAiC;IAEhD;;;OAGG;IACH,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,UAAO,GAAG,IAAI;IAWxD;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAGrE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
export class BaseCommand extends Command {
|
|
3
|
+
static baseFlags = {
|
|
4
|
+
json: Flags.boolean({ description: '输出 JSON envelope 格式', default: false }),
|
|
5
|
+
profile: Flags.string({ description: '配置 profile', default: 'dev' }),
|
|
6
|
+
config: Flags.string({ description: 'bsteam CLI context config 文件路径;默认 ~/.bsteam/config.json' }),
|
|
7
|
+
context: Flags.string({ description: 'bsteam CLI context 名称;默认使用配置文件 currentContext' }),
|
|
8
|
+
'trace-id': Flags.string({ description: '跨链路追踪 ID', hidden: true }),
|
|
9
|
+
};
|
|
10
|
+
isTTY = process.stdout.isTTY ?? false;
|
|
11
|
+
/**
|
|
12
|
+
* JSON envelope 输出
|
|
13
|
+
* 遵循 { version, ok, data, error, _notice } 协议
|
|
14
|
+
*/
|
|
15
|
+
outputEnvelope(data, ok = true) {
|
|
16
|
+
const envelope = {
|
|
17
|
+
version: '1',
|
|
18
|
+
ok,
|
|
19
|
+
data: ok ? data : undefined,
|
|
20
|
+
error: ok ? undefined : data,
|
|
21
|
+
_notice: undefined,
|
|
22
|
+
};
|
|
23
|
+
this.log(JSON.stringify(envelope, null, this.isTTY ? 2 : 0));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 高风险门禁检查 — 子类可覆盖
|
|
27
|
+
* 默认无门禁;高风险命令应 override 此方法
|
|
28
|
+
*/
|
|
29
|
+
assertSafeExecution(_flags) {
|
|
30
|
+
// 默认无门禁
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=base-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../src/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,OAAgB,WAAY,SAAQ,OAAO;IAC/C,MAAM,CAAC,SAAS,GAAG;QACjB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3E,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yDAAyD,EAAE,CAAC;QAChG,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;QACvF,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KACpE,CAAC;IAEQ,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;IAEhD;;;OAGG;IACO,cAAc,CAAC,IAAa,EAAE,EAAE,GAAG,IAAI;QAC/C,MAAM,QAAQ,GAAG;YACf,OAAO,EAAE,GAAG;YACZ,EAAE;YACF,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC3B,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YAC5B,OAAO,EAAE,SAAS;SACnB,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACO,mBAAmB,CAAC,MAA+B;QAC3D,QAAQ;IACV,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type Command } from '@oclif/core';
|
|
2
|
+
import { type PlatformApiFlagInput, type PlatformApiOptions, type PlatformApiResult } from '../http/platform-api.js';
|
|
3
|
+
export declare const jsonBodyFlags: {
|
|
4
|
+
data: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
5
|
+
'data-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
6
|
+
};
|
|
7
|
+
export declare const mutationFlags: {
|
|
8
|
+
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
data: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'data-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
export interface RequestFlags extends PlatformApiFlagInput {
|
|
14
|
+
json?: boolean;
|
|
15
|
+
data?: string;
|
|
16
|
+
'data-file'?: string;
|
|
17
|
+
'dry-run'?: boolean;
|
|
18
|
+
yes?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface RunRequestOptions<T = unknown> {
|
|
21
|
+
method: string;
|
|
22
|
+
path: string;
|
|
23
|
+
body?: unknown;
|
|
24
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
25
|
+
requiresConfirmation?: boolean;
|
|
26
|
+
confirmationHint?: string;
|
|
27
|
+
human?: (data: T, context: {
|
|
28
|
+
options: PlatformApiOptions;
|
|
29
|
+
result: PlatformApiResult<T>;
|
|
30
|
+
}) => string | undefined;
|
|
31
|
+
jsonData?: (data: T, context: {
|
|
32
|
+
options: PlatformApiOptions;
|
|
33
|
+
result: PlatformApiResult<T>;
|
|
34
|
+
}) => unknown;
|
|
35
|
+
}
|
|
36
|
+
export declare function requestAndOutput<T = unknown>(command: Command, flags: RequestFlags, request: RunRequestOptions<T>): Promise<void>;
|
|
37
|
+
export declare function output(command: Command, flags: {
|
|
38
|
+
json?: boolean;
|
|
39
|
+
}, data: unknown, ok?: boolean): void;
|
|
40
|
+
export declare function buildBody(flags: RequestFlags, defaults: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
41
|
+
export declare function readStdinText(): Promise<string>;
|
|
42
|
+
export declare function parseCsv(value?: string): string[] | undefined;
|
|
43
|
+
export declare function parseNumberFlag(value?: string): number | undefined;
|
|
44
|
+
export declare function encodePathSegment(value: string): string;
|
|
45
|
+
export declare function encodeFilePath(value: string): string;
|
|
46
|
+
export declare function extractItems(value: unknown): Array<Record<string, unknown>>;
|
|
47
|
+
export declare function pickText(row: Record<string, unknown>, keys: string[]): string;
|
|
48
|
+
export declare function dropUndefined<T extends Record<string, unknown>>(obj: T): T;
|
|
49
|
+
export declare function redactSensitive(value: unknown): unknown;
|
|
50
|
+
export declare function ensureObject(value: unknown, source: string): Record<string, unknown>;
|
|
51
|
+
//# sourceMappingURL=platform-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-command.d.ts","sourceRoot":"","sources":["../../src/command-utils/platform-command.ts"],"names":[],"mappings":"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"}
|