@nocobase/app-cli-client 0.0.0-stage → 0.1.0-beta.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 +24 -2
- package/dist/brand.d.ts +52 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +61 -0
- package/dist/brand.js.map +1 -0
- package/dist/commands.d.ts +9 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +30 -0
- package/dist/commands.js.map +1 -0
- package/dist/completion.d.ts +13 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +157 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +100 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +43 -0
- package/dist/config.js.map +1 -0
- package/dist/docs.d.ts +9 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +146 -0
- package/dist/docs.js.map +1 -0
- package/dist/dynamic/execute.d.ts +24 -0
- package/dist/dynamic/execute.d.ts.map +1 -0
- package/dist/dynamic/execute.js +125 -0
- package/dist/dynamic/execute.js.map +1 -0
- package/dist/dynamic/files.d.ts +21 -0
- package/dist/dynamic/files.d.ts.map +1 -0
- package/dist/dynamic/files.js +79 -0
- package/dist/dynamic/files.js.map +1 -0
- package/dist/dynamic/help.d.ts +6 -0
- package/dist/dynamic/help.d.ts.map +1 -0
- package/dist/dynamic/help.js +42 -0
- package/dist/dynamic/help.js.map +1 -0
- package/dist/dynamic/index.d.ts +34 -0
- package/dist/dynamic/index.d.ts.map +1 -0
- package/dist/dynamic/index.js +197 -0
- package/dist/dynamic/index.js.map +1 -0
- package/dist/dynamic/manifest.d.ts +21 -0
- package/dist/dynamic/manifest.d.ts.map +1 -0
- package/dist/dynamic/manifest.js +175 -0
- package/dist/dynamic/manifest.js.map +1 -0
- package/dist/dynamic/output.d.ts +14 -0
- package/dist/dynamic/output.d.ts.map +1 -0
- package/dist/dynamic/output.js +103 -0
- package/dist/dynamic/output.js.map +1 -0
- package/dist/dynamic/parse.d.ts +3 -0
- package/dist/dynamic/parse.d.ts.map +1 -0
- package/dist/dynamic/parse.js +13 -0
- package/dist/dynamic/parse.js.map +1 -0
- package/dist/dynamic/rest.d.ts +29 -0
- package/dist/dynamic/rest.d.ts.map +1 -0
- package/dist/dynamic/rest.js +212 -0
- package/dist/dynamic/rest.js.map +1 -0
- package/dist/dynamic/session.d.ts +20 -0
- package/dist/dynamic/session.d.ts.map +1 -0
- package/dist/dynamic/session.js +70 -0
- package/dist/dynamic/session.js.map +1 -0
- package/dist/dynamic/ticket.d.ts +13 -0
- package/dist/dynamic/ticket.d.ts.map +1 -0
- package/dist/dynamic/ticket.js +40 -0
- package/dist/dynamic/ticket.js.map +1 -0
- package/dist/hooks/command-not-found.d.ts +4 -0
- package/dist/hooks/command-not-found.d.ts.map +1 -0
- package/dist/hooks/command-not-found.js +6 -0
- package/dist/hooks/command-not-found.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +72 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +148 -0
- package/dist/install.js.map +1 -0
- package/dist/lib/command.d.ts +35 -0
- package/dist/lib/command.d.ts.map +1 -0
- package/dist/lib/command.js +97 -0
- package/dist/lib/command.js.map +1 -0
- package/dist/lib/credentials.d.ts +110 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +330 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/device.d.ts +48 -0
- package/dist/lib/device.d.ts.map +1 -0
- package/dist/lib/device.js +189 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/envelope.d.ts +21 -0
- package/dist/lib/envelope.d.ts.map +1 -0
- package/dist/lib/envelope.js +87 -0
- package/dist/lib/envelope.js.map +1 -0
- package/dist/lib/files.d.ts +4 -0
- package/dist/lib/files.d.ts.map +1 -0
- package/dist/lib/files.js +23 -0
- package/dist/lib/files.js.map +1 -0
- package/dist/lib/globals.d.ts +25 -0
- package/dist/lib/globals.d.ts.map +1 -0
- package/dist/lib/globals.js +77 -0
- package/dist/lib/globals.js.map +1 -0
- package/dist/lib/http.d.ts +45 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +141 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/mime.d.ts +3 -0
- package/dist/lib/mime.d.ts.map +1 -0
- package/dist/lib/mime.js +38 -0
- package/dist/lib/mime.js.map +1 -0
- package/dist/lib/secrets/index.d.ts +18 -0
- package/dist/lib/secrets/index.d.ts.map +1 -0
- package/dist/lib/secrets/index.js +55 -0
- package/dist/lib/secrets/index.js.map +1 -0
- package/dist/lib/secrets/macos.d.ts +13 -0
- package/dist/lib/secrets/macos.d.ts.map +1 -0
- package/dist/lib/secrets/macos.js +61 -0
- package/dist/lib/secrets/macos.js.map +1 -0
- package/dist/lib/secrets/secret-service.d.ts +17 -0
- package/dist/lib/secrets/secret-service.d.ts.map +1 -0
- package/dist/lib/secrets/secret-service.js +81 -0
- package/dist/lib/secrets/secret-service.js.map +1 -0
- package/dist/lib/secrets/store.d.ts +28 -0
- package/dist/lib/secrets/store.d.ts.map +1 -0
- package/dist/lib/secrets/store.js +41 -0
- package/dist/lib/secrets/store.js.map +1 -0
- package/dist/lib/secrets/windows.d.ts +20 -0
- package/dist/lib/secrets/windows.d.ts.map +1 -0
- package/dist/lib/secrets/windows.js +155 -0
- package/dist/lib/secrets/windows.js.map +1 -0
- package/dist/lib/update-hint.d.ts +5 -0
- package/dist/lib/update-hint.d.ts.map +1 -0
- package/dist/lib/update-hint.js +26 -0
- package/dist/lib/update-hint.js.map +1 -0
- package/dist/login.d.ts +15 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +232 -0
- package/dist/login.js.map +1 -0
- package/dist/logout.d.ts +13 -0
- package/dist/logout.d.ts.map +1 -0
- package/dist/logout.js +56 -0
- package/dist/logout.js.map +1 -0
- package/dist/parse/arguments.d.ts +84 -0
- package/dist/parse/arguments.d.ts.map +1 -0
- package/dist/parse/arguments.js +460 -0
- package/dist/parse/arguments.js.map +1 -0
- package/dist/parse/exit.d.ts +7 -0
- package/dist/parse/exit.d.ts.map +1 -0
- package/dist/parse/exit.js +24 -0
- package/dist/parse/exit.js.map +1 -0
- package/dist/parse/help.d.ts +22 -0
- package/dist/parse/help.d.ts.map +1 -0
- package/dist/parse/help.js +151 -0
- package/dist/parse/help.js.map +1 -0
- package/dist/parse/index.d.ts +5 -0
- package/dist/parse/index.d.ts.map +1 -0
- package/dist/parse/index.js +7 -0
- package/dist/parse/index.js.map +1 -0
- package/dist/parse/manifest.d.ts +97 -0
- package/dist/parse/manifest.d.ts.map +1 -0
- package/dist/parse/manifest.js +4 -0
- package/dist/parse/manifest.js.map +1 -0
- package/dist/profile.d.ts +4 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +80 -0
- package/dist/profile.js.map +1 -0
- package/dist/request.d.ts +25 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +35 -0
- package/dist/request.js.map +1 -0
- package/dist/run.d.ts +17 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +88 -0
- package/dist/run.js.map +1 -0
- package/dist/update.d.ts +45 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +177 -0
- package/dist/update.js.map +1 -0
- package/dist/whoami.d.ts +31 -0
- package/dist/whoami.d.ts.map +1 -0
- package/dist/whoami.js +118 -0
- package/dist/whoami.js.map +1 -0
- package/package.json +67 -3
package/dist/update.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Command } from '@oclif/core';
|
|
2
|
+
import { type AppCliConfig, type AppCliSession } from './config.ts';
|
|
3
|
+
import { type Installation } from './install.ts';
|
|
4
|
+
/** How often the hint asks the server. */
|
|
5
|
+
export declare const HINT_INTERVAL_MS: number;
|
|
6
|
+
/** How long the hint waits for the server. */
|
|
7
|
+
export declare const HINT_TIMEOUT_MS: number;
|
|
8
|
+
/** Who updates this installation: `<bin> update` (`cli`), the runner (`runner`), or nobody (`none`). */
|
|
9
|
+
export type UpdatedBy = 'cli' | 'runner' | 'none';
|
|
10
|
+
export interface UpdateEnvironment {
|
|
11
|
+
/** The command name, such as `acme`. */
|
|
12
|
+
readonly bin: string;
|
|
13
|
+
/** The product the application serves the CLI as; `bin` by default. */
|
|
14
|
+
readonly product?: string;
|
|
15
|
+
/** The running version. */
|
|
16
|
+
readonly running: string;
|
|
17
|
+
readonly installation?: Installation | undefined;
|
|
18
|
+
readonly target?: string;
|
|
19
|
+
/** Where the hint remembers what it found; `<state dir>/cache/update.json` by default. */
|
|
20
|
+
readonly cacheFile?: string;
|
|
21
|
+
readonly now?: () => number;
|
|
22
|
+
readonly fetch?: typeof fetch;
|
|
23
|
+
}
|
|
24
|
+
/** Who updates the installation `environment` describes. */
|
|
25
|
+
export declare function updatedBy(environment: UpdateEnvironment): UpdatedBy;
|
|
26
|
+
/** The hint line when the server serves a newer CLI for a CLI installed alone; undefined otherwise. */
|
|
27
|
+
export declare function updateHint(session: AppCliSession, environment: UpdateEnvironment): Promise<string | undefined>;
|
|
28
|
+
/** What `<bin> update` answers. */
|
|
29
|
+
export interface CliUpdateResult {
|
|
30
|
+
readonly current: string;
|
|
31
|
+
readonly latest: string;
|
|
32
|
+
readonly updated: boolean;
|
|
33
|
+
/** The version it replaced, kept beside the new one for a rollback. */
|
|
34
|
+
readonly previous?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Updates a CLI installed alone to the newest version the session's server serves for this platform. */
|
|
37
|
+
export declare function updateCli(session: AppCliSession, environment: UpdateEnvironment, options: {
|
|
38
|
+
readonly check?: boolean;
|
|
39
|
+
readonly log?: (line: string) => void;
|
|
40
|
+
}): Promise<CliUpdateResult>;
|
|
41
|
+
/** The environment of the running CLI `config` describes; undefined when it does not update itself. */
|
|
42
|
+
export declare function updateEnvironment(config: AppCliConfig): UpdateEnvironment | undefined;
|
|
43
|
+
/** `<bin> update`, for a CLI whose configuration names `selfUpdate`. */
|
|
44
|
+
export declare function updateCommand(app: AppCliConfig): Command.Class;
|
|
45
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAcA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAQlD,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAGtB,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,EAAE,MAAyB,CAAC;AACzD,8CAA8C;AAC9C,eAAO,MAAM,eAAe,EAAE,MAAa,CAAC;AAE5C,wGAAwG;AACxG,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0FAA0F;IAC1F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,WAAW,EAAE,iBAAiB,GAAG,SAAS,CAInE;AA4CD,uGAAuG;AACvG,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgC7B;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,yGAAyG;AACzG,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAC3E,OAAO,CAAC,eAAe,CAAC,CAuD1B;AAYD,uGAAuG;AACvG,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,GACnB,iBAAiB,GAAG,SAAS,CAS/B;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAsC9D"}
|
package/dist/update.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// `<bin> update`, and the hint that a newer CLI is served, for a CLI whose configuration names `selfUpdate`.
|
|
2
|
+
//
|
|
3
|
+
// A CLI installed alone by the install script (`install.json` says `mode: cli`) updates itself from the server the
|
|
4
|
+
// person is signed in to, with their key: it resolves the newest version the server serves for this platform, downloads
|
|
5
|
+
// it, checks its SHA-256, unpacks it beside the running version and switches `current`, keeping the previous version
|
|
6
|
+
// for a rollback (`install.ts`). An installation the script made for a runner (`mode: runner`) is the runner's, which
|
|
7
|
+
// updates itself.
|
|
8
|
+
//
|
|
9
|
+
// The hint asks at most every `HINT_INTERVAL_MS` per server and remembers the answer in `<state dir>/cache/update.json`,
|
|
10
|
+
// so a command waits for the network at most once in that time, and never longer than `HINT_TIMEOUT_MS`.
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { Flags } from '@oclif/core';
|
|
15
|
+
import { currentTarget, EXIT_CODES, } from '@nocobase/agent-protocol';
|
|
16
|
+
import { appCliHome } from "./config.js";
|
|
17
|
+
import { currentSession } from "./dynamic/session.js";
|
|
18
|
+
import { applyUpdate, detectInstallation, isNewer, latestArtifact, } from "./install.js";
|
|
19
|
+
import { AppCommand, UsageError } from "./lib/command.js";
|
|
20
|
+
import { ApiClient } from "./lib/http.js";
|
|
21
|
+
/** How often the hint asks the server. */
|
|
22
|
+
export const HINT_INTERVAL_MS = 12 * 60 * 60_000;
|
|
23
|
+
/** How long the hint waits for the server. */
|
|
24
|
+
export const HINT_TIMEOUT_MS = 3000;
|
|
25
|
+
/** Who updates the installation `environment` describes. */
|
|
26
|
+
export function updatedBy(environment) {
|
|
27
|
+
const { installation } = environment;
|
|
28
|
+
if (installation === undefined)
|
|
29
|
+
return 'none';
|
|
30
|
+
return installation.mode === 'runner' ? 'runner' : 'cli';
|
|
31
|
+
}
|
|
32
|
+
function clientOf(session, environment, timeoutMs) {
|
|
33
|
+
return new ApiClient({
|
|
34
|
+
server: session.server,
|
|
35
|
+
headers: { ...session.headers },
|
|
36
|
+
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
37
|
+
...(environment.fetch === undefined ? {} : { fetch: environment.fetch }),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async function readCache(file) {
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function writeCache(file, value) {
|
|
49
|
+
await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
50
|
+
const temporary = `${file}.${process.pid}.${Date.now()}.tmp`;
|
|
51
|
+
await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, {
|
|
52
|
+
mode: 0o600,
|
|
53
|
+
});
|
|
54
|
+
await rename(temporary, file);
|
|
55
|
+
}
|
|
56
|
+
function cacheFileOf(environment) {
|
|
57
|
+
return (environment.cacheFile ?? path.join(appCliHome(), 'cache', 'update.json'));
|
|
58
|
+
}
|
|
59
|
+
/** The hint line when the server serves a newer CLI for a CLI installed alone; undefined otherwise. */
|
|
60
|
+
export async function updateHint(session, environment) {
|
|
61
|
+
if (updatedBy(environment) !== 'cli')
|
|
62
|
+
return undefined;
|
|
63
|
+
const now = (environment.now ?? Date.now)();
|
|
64
|
+
const cacheFile = cacheFileOf(environment);
|
|
65
|
+
const cached = await readCache(cacheFile);
|
|
66
|
+
let latest;
|
|
67
|
+
if (cached?.server === session.server &&
|
|
68
|
+
now - cached.checkedAt < HINT_INTERVAL_MS)
|
|
69
|
+
latest = cached.latest;
|
|
70
|
+
else {
|
|
71
|
+
try {
|
|
72
|
+
latest = (await latestArtifact(clientOf(session, environment, HINT_TIMEOUT_MS), environment.product ?? environment.bin, environment.target ?? currentTarget())).version;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
latest = null;
|
|
76
|
+
}
|
|
77
|
+
await writeCache(cacheFile, {
|
|
78
|
+
server: session.server,
|
|
79
|
+
checkedAt: now,
|
|
80
|
+
latest,
|
|
81
|
+
}).catch(() => undefined);
|
|
82
|
+
}
|
|
83
|
+
return latest !== null && isNewer(latest, environment.running)
|
|
84
|
+
? `A newer ${environment.bin} (${latest}) is available; run \`${environment.bin} update\`.`
|
|
85
|
+
: undefined;
|
|
86
|
+
}
|
|
87
|
+
/** Updates a CLI installed alone to the newest version the session's server serves for this platform. */
|
|
88
|
+
export async function updateCli(session, environment, options) {
|
|
89
|
+
const { bin } = environment;
|
|
90
|
+
const by = updatedBy(environment);
|
|
91
|
+
if (by === 'none')
|
|
92
|
+
throw new UsageError(`This ${bin} was not installed by the install script, so it cannot replace itself. Install it again with the ` +
|
|
93
|
+
'install command, or update it the way it was installed.');
|
|
94
|
+
if (by === 'runner')
|
|
95
|
+
throw new UsageError(`This ${bin} was installed for a runner, which keeps it up to date itself.`);
|
|
96
|
+
const client = clientOf(session, environment);
|
|
97
|
+
const latest = await latestArtifact(client, environment.product ?? bin, environment.target ?? currentTarget());
|
|
98
|
+
const result = {
|
|
99
|
+
current: environment.running,
|
|
100
|
+
latest: latest.version,
|
|
101
|
+
updated: false,
|
|
102
|
+
};
|
|
103
|
+
if (!isNewer(latest.version, environment.running)) {
|
|
104
|
+
options.log?.(`${bin} ${environment.running} is up to date (${session.server} serves ${latest.version}).`);
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
if (options.check) {
|
|
108
|
+
options.log?.(`${bin} ${latest.version} is available (this is ${environment.running}). Run \`${bin} update\`.`);
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
const installation = environment.installation;
|
|
112
|
+
const { previous } = await applyUpdate({
|
|
113
|
+
installation,
|
|
114
|
+
bin,
|
|
115
|
+
client,
|
|
116
|
+
update: {
|
|
117
|
+
version: latest.version,
|
|
118
|
+
url: latest.url,
|
|
119
|
+
sha256: latest.sha256,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
options.log?.(`Updated ${bin} ${environment.running} → ${latest.version}; ${previous ?? 'the previous version'} stays in ` +
|
|
123
|
+
`${path.join(installation.prefix, 'versions')}.`);
|
|
124
|
+
return {
|
|
125
|
+
...result,
|
|
126
|
+
updated: true,
|
|
127
|
+
...(previous === undefined ? {} : { previous }),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// src/update.ts and dist/update.js both sit one level below the package root.
|
|
131
|
+
const OWN_VERSION = JSON.parse(readFileSync(path.resolve(import.meta.dirname, '..', 'package.json'), 'utf8')).version;
|
|
132
|
+
/** The environment of the running CLI `config` describes; undefined when it does not update itself. */
|
|
133
|
+
export function updateEnvironment(config) {
|
|
134
|
+
const own = config.selfUpdate;
|
|
135
|
+
if (own === undefined)
|
|
136
|
+
return undefined;
|
|
137
|
+
return {
|
|
138
|
+
bin: config.bin,
|
|
139
|
+
running: config.version ?? OWN_VERSION,
|
|
140
|
+
installation: detectInstallation(own.packageRoot),
|
|
141
|
+
...(own.product === undefined ? {} : { product: own.product }),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** `<bin> update`, for a CLI whose configuration names `selfUpdate`. */
|
|
145
|
+
export function updateCommand(app) {
|
|
146
|
+
return class Update extends AppCommand {
|
|
147
|
+
static summary = `Update ${app.bin} to the newest version the server serves.`;
|
|
148
|
+
static description = `Asks the server you are signed in to for the newest ${app.bin} it serves for this platform, downloads it, ` +
|
|
149
|
+
`checks its SHA-256 and switches to it, keeping the previous version beside it. For ${app.bin} installed alone ` +
|
|
150
|
+
'by the install script.';
|
|
151
|
+
static examples = [
|
|
152
|
+
'<%= config.bin %> update',
|
|
153
|
+
'<%= config.bin %> update --check',
|
|
154
|
+
];
|
|
155
|
+
static flags = {
|
|
156
|
+
check: Flags.boolean({
|
|
157
|
+
description: 'Only say whether a newer version is served.',
|
|
158
|
+
}),
|
|
159
|
+
};
|
|
160
|
+
async run() {
|
|
161
|
+
const { flags } = await this.parse(Update);
|
|
162
|
+
const environment = updateEnvironment(app);
|
|
163
|
+
if (environment === undefined)
|
|
164
|
+
throw new UsageError(`${app.bin} does not update itself.`);
|
|
165
|
+
const session = await currentSession();
|
|
166
|
+
if (session === undefined)
|
|
167
|
+
throw new UsageError(`Sign in first: \`${app.bin} login --server <url>\`.`, EXIT_CODES.auth);
|
|
168
|
+
if (session.kind === 'run')
|
|
169
|
+
throw new UsageError(`This ${app.bin} belongs to an agent's run; the runner keeps it up to date.`);
|
|
170
|
+
return updateCli(session, environment, {
|
|
171
|
+
check: flags.check === true,
|
|
172
|
+
log: (line) => this.log(line),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
package/dist/whoami.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Command } from '@oclif/core';
|
|
2
|
+
import { type AppCliConfig } from './config.ts';
|
|
3
|
+
/** What `whoami` answers. */
|
|
4
|
+
export interface WhoamiResult {
|
|
5
|
+
readonly server: string;
|
|
6
|
+
readonly kind: 'person' | 'run';
|
|
7
|
+
readonly userId: string;
|
|
8
|
+
readonly displayName: string;
|
|
9
|
+
readonly runId?: string;
|
|
10
|
+
/** Where the credential comes from: a run's file, the environment, or a profile. */
|
|
11
|
+
readonly source: 'run' | 'env' | 'profile';
|
|
12
|
+
readonly profile?: string;
|
|
13
|
+
/** What the profile holds: the session a browser sign-in received, or an API key. */
|
|
14
|
+
readonly credential?: 'session' | 'apiKey';
|
|
15
|
+
/** For a session, when it expires unless used again; the server renews it while the CLI is in use. */
|
|
16
|
+
readonly expiresAt?: string;
|
|
17
|
+
readonly key?: {
|
|
18
|
+
readonly id?: string;
|
|
19
|
+
readonly name?: string;
|
|
20
|
+
};
|
|
21
|
+
readonly actions: readonly string[];
|
|
22
|
+
readonly commands: number;
|
|
23
|
+
/** The commands that need an action the caller does not hold, with that action. */
|
|
24
|
+
readonly missing: readonly {
|
|
25
|
+
readonly command: string;
|
|
26
|
+
readonly action: string;
|
|
27
|
+
}[];
|
|
28
|
+
}
|
|
29
|
+
/** `<bin> whoami`: the identity the CLI acts as, as the server sees it, and what it may and may not do. */
|
|
30
|
+
export declare function whoamiCommand(app: AppCliConfig): Command.Class;
|
|
31
|
+
//# sourceMappingURL=whoami.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAMlD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAO7D,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,qFAAqF;IACrF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3C,sGAAsG;IACtG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,EAAE,CAAC;CACL;AASD,2GAA2G;AAC3G,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CA0H9D"}
|
package/dist/whoami.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { EXIT_CODES } from '@nocobase/agent-protocol';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { authRouteOf } from "./config.js";
|
|
5
|
+
import { loadManifest } from "./dynamic/manifest.js";
|
|
6
|
+
import { currentSession, serverPath } from "./dynamic/session.js";
|
|
7
|
+
import { AppCommand, UsageError } from "./lib/command.js";
|
|
8
|
+
import { readUserConfig, userClient } from "./lib/credentials.js";
|
|
9
|
+
import { globalFlags } from "./lib/globals.js";
|
|
10
|
+
/** Better Auth's `GET /get-session`, as far as `whoami` reads it. */
|
|
11
|
+
const BetterAuthSessionSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
session: z.object({ expiresAt: z.union([z.string(), z.date()]) }),
|
|
14
|
+
})
|
|
15
|
+
.nullable();
|
|
16
|
+
/** `<bin> whoami`: the identity the CLI acts as, as the server sees it, and what it may and may not do. */
|
|
17
|
+
export function whoamiCommand(app) {
|
|
18
|
+
return class Whoami extends AppCommand {
|
|
19
|
+
static summary = 'Show who the CLI acts as, and what it may do.';
|
|
20
|
+
static description = "Inside a run's working directory the CLI acts as the run, with the token from the run's credentials file; " +
|
|
21
|
+
(app.envPrefix === undefined
|
|
22
|
+
? ''
|
|
23
|
+
: `with ${app.envPrefix}_API_KEY set it acts with that key; `) +
|
|
24
|
+
`anywhere else it acts as the profile \`${app.bin} login\` signed in. Shows the server, the user, when the ` +
|
|
25
|
+
"session expires (or the key's name), the business actions held, and how many commands need an action you " +
|
|
26
|
+
'lack (--missing lists them).';
|
|
27
|
+
static flags = {
|
|
28
|
+
missing: Flags.boolean({
|
|
29
|
+
description: 'List the commands that need an action you do not hold, by that action.',
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
async run() {
|
|
33
|
+
const { flags } = await this.parse(Whoami);
|
|
34
|
+
const session = await currentSession();
|
|
35
|
+
if (!session)
|
|
36
|
+
throw new UsageError(`Not signed in. Run \`${app.bin} login\` first${app.envPrefix ? `, or set ${app.envPrefix}_SERVER and ${app.envPrefix}_API_KEY` : ''}.`, EXIT_CODES.auth);
|
|
37
|
+
const manifest = await loadManifest(session);
|
|
38
|
+
const { identity } = manifest;
|
|
39
|
+
const user = session.kind === 'user'
|
|
40
|
+
? await readUserConfig({
|
|
41
|
+
paths: this.paths,
|
|
42
|
+
config: app,
|
|
43
|
+
profile: globalFlags().profile,
|
|
44
|
+
})
|
|
45
|
+
: undefined;
|
|
46
|
+
let expiresAt;
|
|
47
|
+
if (user?.kind === 'session')
|
|
48
|
+
expiresAt = await userClient(user)
|
|
49
|
+
.request('GET', serverPath(user.server, authRouteOf(app.auth, '/get-session')), undefined)
|
|
50
|
+
.then((answer) => {
|
|
51
|
+
const at = BetterAuthSessionSchema.parse(answer)?.session.expiresAt;
|
|
52
|
+
return at === undefined ? undefined : new Date(at).toISOString();
|
|
53
|
+
})
|
|
54
|
+
.catch(() => undefined);
|
|
55
|
+
const keyName = user?.keyName;
|
|
56
|
+
const missing = (manifest.withheld ?? [])
|
|
57
|
+
.filter((command) => command.reason === 'action' && command.action)
|
|
58
|
+
.map((command) => ({
|
|
59
|
+
command: command.id.split(':').join(' '),
|
|
60
|
+
action: command.action,
|
|
61
|
+
}));
|
|
62
|
+
const actions = identity.actions ?? [];
|
|
63
|
+
const source = session.kind === 'run'
|
|
64
|
+
? 'run'
|
|
65
|
+
: user?.storage === 'env'
|
|
66
|
+
? 'env'
|
|
67
|
+
: 'profile';
|
|
68
|
+
this.log(identity.kind === 'run'
|
|
69
|
+
? `Run ${identity.runId ?? ''} acting for ${identity.displayName} (${identity.userId}) on ${session.server}`
|
|
70
|
+
: `${identity.displayName} (${identity.userId}) on ${session.server}`);
|
|
71
|
+
if (source === 'env')
|
|
72
|
+
this.log(`Key from ${app.envPrefix}_API_KEY`);
|
|
73
|
+
if (source === 'profile')
|
|
74
|
+
this.log(`Profile ${user?.profile ?? ''}` +
|
|
75
|
+
(user?.kind === 'session'
|
|
76
|
+
? `, signed in through the browser${expiresAt ? `, session expires ${expiresAt}` : ''}`
|
|
77
|
+
: `, API key${keyName ? ` "${keyName}"` : ''}`));
|
|
78
|
+
this.log(`Actions ${actions.length === 0 ? '(none)' : actions.join(', ')}`);
|
|
79
|
+
this.log(`Commands ${manifest.commands.length} offered` +
|
|
80
|
+
(missing.length > 0
|
|
81
|
+
? `; ${missing.length} need an action you do not hold${flags.missing ? ':' : ` (\`${app.bin} whoami --missing\` lists them)`}`
|
|
82
|
+
: ''));
|
|
83
|
+
if (flags.missing) {
|
|
84
|
+
const byAction = new Map();
|
|
85
|
+
for (const entry of missing)
|
|
86
|
+
byAction.set(entry.action, [
|
|
87
|
+
...(byAction.get(entry.action) ?? []),
|
|
88
|
+
entry.command,
|
|
89
|
+
]);
|
|
90
|
+
for (const [action, commands] of [...byAction].sort(([a], [b]) => a.localeCompare(b)))
|
|
91
|
+
this.log(` ${action}: ${commands.join(', ')}`);
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
server: session.server,
|
|
95
|
+
kind: identity.kind,
|
|
96
|
+
userId: identity.userId,
|
|
97
|
+
displayName: identity.displayName,
|
|
98
|
+
...(identity.runId ? { runId: identity.runId } : {}),
|
|
99
|
+
source,
|
|
100
|
+
...(user?.profile ? { profile: user.profile } : {}),
|
|
101
|
+
...(user && source === 'profile' ? { credential: user.kind } : {}),
|
|
102
|
+
...(expiresAt ? { expiresAt } : {}),
|
|
103
|
+
...(keyName || user?.keyId
|
|
104
|
+
? {
|
|
105
|
+
key: {
|
|
106
|
+
...(user?.keyId ? { id: user.keyId } : {}),
|
|
107
|
+
...(keyName ? { name: keyName } : {}),
|
|
108
|
+
},
|
|
109
|
+
}
|
|
110
|
+
: {}),
|
|
111
|
+
actions,
|
|
112
|
+
commands: manifest.commands.length,
|
|
113
|
+
missing,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../src/whoami.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,70 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/app-cli-client",
|
|
3
|
-
"version": "0.0.0
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0-beta.0",
|
|
4
|
+
"description": "A branded command line for a NocoBase application: signs in, and runs the business commands the application's command manifest publishes over its API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"prettier": "@nocobase/dev-config/prettier",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=24.0.0"
|
|
10
|
+
},
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./request": {
|
|
19
|
+
"types": "./dist/request.d.ts",
|
|
20
|
+
"import": "./dist/request.js"
|
|
21
|
+
},
|
|
22
|
+
"./install": {
|
|
23
|
+
"types": "./dist/install.d.ts",
|
|
24
|
+
"import": "./dist/install.js"
|
|
25
|
+
},
|
|
26
|
+
"./parse": {
|
|
27
|
+
"types": "./dist/parse/index.d.ts",
|
|
28
|
+
"import": "./dist/parse/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./package.json": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist"
|
|
37
|
+
],
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@oclif/core": "^4.14.0",
|
|
40
|
+
"zod": "^4.6.5",
|
|
41
|
+
"@nocobase/agent-protocol": "^0.1.0-beta.1",
|
|
42
|
+
"@nocobase/cli-envelope": "^0.1.0-beta.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@hono/node-server": "^2.1.1",
|
|
46
|
+
"@types/node": "^24.0.0",
|
|
47
|
+
"eslint": "^10.0.0",
|
|
48
|
+
"hono": "^4.13.2",
|
|
49
|
+
"prettier": "^3.9.6",
|
|
50
|
+
"typescript": "^6.0.3",
|
|
51
|
+
"vitest": "^4.1.10",
|
|
52
|
+
"@nocobase/dev-config": "0.1.0-beta.19"
|
|
53
|
+
},
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "git+https://github.com/nocobase/nocobase3.git",
|
|
57
|
+
"directory": "packages/app/app-cli-client"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "tsc -p tsconfig.json",
|
|
61
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
62
|
+
"test": "vitest run",
|
|
63
|
+
"lint": "eslint . --max-warnings 0",
|
|
64
|
+
"lint:fix": "eslint . --fix --max-warnings 0",
|
|
65
|
+
"format": "prettier . --write",
|
|
66
|
+
"format:check": "prettier . --check",
|
|
67
|
+
"check": "pnpm lint && pnpm format:check && pnpm typecheck && pnpm test && pnpm build",
|
|
68
|
+
"fix": "pnpm lint:fix && pnpm format"
|
|
69
|
+
}
|
|
6
70
|
}
|