@ytinnovation/harness-core 0.0.2 → 0.1.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/dist/assets/publish.d.ts +86 -0
- package/dist/assets/publish.d.ts.map +1 -0
- package/dist/assets/publish.js +305 -0
- package/dist/assets/publish.js.map +1 -0
- package/dist/cli-version/command.d.ts +12 -0
- package/dist/cli-version/command.d.ts.map +1 -0
- package/dist/cli-version/command.js +142 -0
- package/dist/cli-version/command.js.map +1 -0
- package/dist/cli-version/compare-versions.d.ts +6 -0
- package/dist/cli-version/compare-versions.d.ts.map +1 -0
- package/dist/cli-version/compare-versions.js +29 -0
- package/dist/cli-version/compare-versions.js.map +1 -0
- package/dist/cli-version/detect-install-context.d.ts +9 -0
- package/dist/cli-version/detect-install-context.d.ts.map +1 -0
- package/dist/cli-version/detect-install-context.js +37 -0
- package/dist/cli-version/detect-install-context.js.map +1 -0
- package/dist/cli-version/fetch-npm-latest.d.ts +6 -0
- package/dist/cli-version/fetch-npm-latest.d.ts.map +1 -0
- package/dist/cli-version/fetch-npm-latest.js +43 -0
- package/dist/cli-version/fetch-npm-latest.js.map +1 -0
- package/dist/cli-version/maybe-check-cli-update.d.ts +26 -0
- package/dist/cli-version/maybe-check-cli-update.d.ts.map +1 -0
- package/dist/cli-version/maybe-check-cli-update.js +80 -0
- package/dist/cli-version/maybe-check-cli-update.js.map +1 -0
- package/dist/cli-version/prompt.d.ts +13 -0
- package/dist/cli-version/prompt.d.ts.map +1 -0
- package/dist/cli-version/prompt.js +45 -0
- package/dist/cli-version/prompt.js.map +1 -0
- package/dist/cli-version/read-installed-version.d.ts +2 -0
- package/dist/cli-version/read-installed-version.d.ts.map +1 -0
- package/dist/cli-version/read-installed-version.js +16 -0
- package/dist/cli-version/read-installed-version.js.map +1 -0
- package/dist/cli-version/resolve-npm-registry.d.ts +2 -0
- package/dist/cli-version/resolve-npm-registry.d.ts.map +1 -0
- package/dist/cli-version/resolve-npm-registry.js +15 -0
- package/dist/cli-version/resolve-npm-registry.js.map +1 -0
- package/dist/cli-version/self-update.d.ts +12 -0
- package/dist/cli-version/self-update.d.ts.map +1 -0
- package/dist/cli-version/self-update.js +33 -0
- package/dist/cli-version/self-update.js.map +1 -0
- package/dist/config/command.d.ts +2 -0
- package/dist/config/command.d.ts.map +1 -1
- package/dist/config/command.js +57 -46
- package/dist/config/command.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/kernel/create.d.ts.map +1 -1
- package/dist/kernel/create.js +4 -1
- package/dist/kernel/create.js.map +1 -1
- package/dist/mcp/command.d.ts +6 -0
- package/dist/mcp/command.d.ts.map +1 -1
- package/dist/mcp/command.js +17 -0
- package/dist/mcp/command.js.map +1 -1
- package/dist/mcp/publish-config.d.ts +5 -0
- package/dist/mcp/publish-config.d.ts.map +1 -0
- package/dist/mcp/publish-config.js +38 -0
- package/dist/mcp/publish-config.js.map +1 -0
- package/dist/rule/command.d.ts +6 -0
- package/dist/rule/command.d.ts.map +1 -1
- package/dist/rule/command.js +17 -0
- package/dist/rule/command.js.map +1 -1
- package/dist/rule/publish-config.d.ts +5 -0
- package/dist/rule/publish-config.d.ts.map +1 -0
- package/dist/rule/publish-config.js +33 -0
- package/dist/rule/publish-config.js.map +1 -0
- package/dist/skills/command.d.ts +9 -5
- package/dist/skills/command.d.ts.map +1 -1
- package/dist/skills/command.js +27 -287
- package/dist/skills/command.js.map +1 -1
- package/dist/skills/publish-config.d.ts +5 -0
- package/dist/skills/publish-config.d.ts.map +1 -0
- package/dist/skills/publish-config.js +33 -0
- package/dist/skills/publish-config.js.map +1 -0
- package/dist/skills/publish.d.ts +1 -1
- package/dist/skills/publish.d.ts.map +1 -1
- package/dist/skills/publish.js +3 -21
- package/dist/skills/publish.js.map +1 -1
- package/dist/skills/types.d.ts +0 -55
- package/dist/skills/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { realpathSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
const require = createRequire(import.meta.url);
|
|
4
|
+
function normalizePath(p) {
|
|
5
|
+
return p.replace(/\\/g, '/');
|
|
6
|
+
}
|
|
7
|
+
function isNpxMainScript(mainScript) {
|
|
8
|
+
const n = normalizePath(mainScript);
|
|
9
|
+
return n.includes('/_npx/') || n.includes('/.npm/_npx/');
|
|
10
|
+
}
|
|
11
|
+
function isDevCheckoutPackagePath(resolvedPkgDir) {
|
|
12
|
+
const n = normalizePath(resolvedPkgDir);
|
|
13
|
+
return n.includes('/harness-kit/apps/harness-cli');
|
|
14
|
+
}
|
|
15
|
+
function resolveHarnessCliPackageDir() {
|
|
16
|
+
try {
|
|
17
|
+
const pkgJson = require.resolve('@ytinnovation/harness-cli/package.json');
|
|
18
|
+
return realpathSync(pkgJson.replace(/[/\\]package\.json$/, ''));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 判断当前 harness 进程的安装形态,用于决定是否尝试 `npm install -g` 自更新。
|
|
26
|
+
*/
|
|
27
|
+
export function detectCliInstallContext(argv1 = process.argv[1]) {
|
|
28
|
+
if (argv1 && isNpxMainScript(argv1)) {
|
|
29
|
+
return { kind: 'npx' };
|
|
30
|
+
}
|
|
31
|
+
const pkgDir = resolveHarnessCliPackageDir();
|
|
32
|
+
if (pkgDir && isDevCheckoutPackagePath(pkgDir)) {
|
|
33
|
+
return { kind: 'dev-checkout' };
|
|
34
|
+
}
|
|
35
|
+
return { kind: 'global' };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=detect-install-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-install-context.js","sourceRoot":"","sources":["../../src/cli-version/detect-install-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAQ/C,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB;IACzC,MAAM,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,wBAAwB,CAAC,cAAsB;IACtD,MAAM,CAAC,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,2BAA2B;IAClC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAC1E,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAA4B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3C,IAAI,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,2BAA2B,EAAE,CAAC;IAC7C,IAAI,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-npm-latest.d.ts","sourceRoot":"","sources":["../../src/cli-version/fetch-npm-latest.ts"],"names":[],"mappings":"AAOA,wBAAsB,4BAA4B,CAChD,OAAO,GAAE;IACP,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC1B,GACL,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCxB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { resolveNpmRegistry } from './resolve-npm-registry.js';
|
|
2
|
+
const HARNESS_CLI_PACKAGE = '@ytinnovation/harness-cli';
|
|
3
|
+
const LATEST_PATH = `/${encodeURIComponent(HARNESS_CLI_PACKAGE)}/latest`;
|
|
4
|
+
const FETCH_TIMEOUT_MS = 3000;
|
|
5
|
+
export async function fetchHarnessCliLatestVersion(options = {}) {
|
|
6
|
+
const env = options.env ?? process.env;
|
|
7
|
+
const fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
8
|
+
if (typeof fetchImpl !== 'function') {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
const base = resolveNpmRegistry(env);
|
|
12
|
+
const url = `${base}${LATEST_PATH}`;
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
15
|
+
if (options.signal) {
|
|
16
|
+
if (options.signal.aborted) {
|
|
17
|
+
clearTimeout(timeout);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const onAbort = () => controller.abort();
|
|
21
|
+
options.signal.addEventListener('abort', onAbort, { once: true });
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetchImpl(url, {
|
|
25
|
+
method: 'GET',
|
|
26
|
+
headers: { accept: 'application/json' },
|
|
27
|
+
signal: controller.signal,
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const body = (await response.json());
|
|
33
|
+
const v = body.version?.trim();
|
|
34
|
+
return v && v.length > 0 ? v : null;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
clearTimeout(timeout);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=fetch-npm-latest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-npm-latest.js","sourceRoot":"","sources":["../../src/cli-version/fetch-npm-latest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,CAAC;AAEzE,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,UAII,EAAE;IAEN,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;IACxD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;IAEpC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { loadCliConfig } from '../config/command.js';
|
|
2
|
+
import { detectCliInstallContext } from './detect-install-context.js';
|
|
3
|
+
import { fetchHarnessCliLatestVersion } from './fetch-npm-latest.js';
|
|
4
|
+
import type { CliVersionPromptAdapter } from './prompt.js';
|
|
5
|
+
import { runHarnessCliSelfUpdateSync } from './self-update.js';
|
|
6
|
+
export type MaybeCheckCliUpdateResult = {
|
|
7
|
+
readonly action: 'continue';
|
|
8
|
+
} | {
|
|
9
|
+
readonly action: 'reexec';
|
|
10
|
+
readonly argv: string[];
|
|
11
|
+
};
|
|
12
|
+
export interface MaybeCheckCliUpdateOptions {
|
|
13
|
+
readonly argv: readonly string[];
|
|
14
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
15
|
+
readonly stdin?: NodeJS.ReadStream;
|
|
16
|
+
readonly stdout?: NodeJS.WriteStream;
|
|
17
|
+
readonly stderr?: NodeJS.WriteStream;
|
|
18
|
+
readonly homeDir?: string;
|
|
19
|
+
readonly loadCliConfigImpl?: typeof loadCliConfig;
|
|
20
|
+
readonly fetchLatestImpl?: typeof fetchHarnessCliLatestVersion;
|
|
21
|
+
readonly detectInstallContextImpl?: typeof detectCliInstallContext;
|
|
22
|
+
readonly promptAdapter?: CliVersionPromptAdapter;
|
|
23
|
+
readonly runSelfUpdateSyncImpl?: typeof runHarnessCliSelfUpdateSync;
|
|
24
|
+
}
|
|
25
|
+
export declare function maybeCheckCliUpdate(options: MaybeCheckCliUpdateOptions): Promise<MaybeCheckCliUpdateResult>;
|
|
26
|
+
//# sourceMappingURL=maybe-check-cli-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe-check-cli-update.d.ts","sourceRoot":"","sources":["../../src/cli-version/maybe-check-cli-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAI/D,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,aAAa,CAAC;IAClD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,4BAA4B,CAAC;IAC/D,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,uBAAuB,CAAC;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACjD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,2BAA2B,CAAC;CACrE;AAkCD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CA2DpC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { stderr as processStderr, stdin as processStdin, stdout as processStdout } from 'node:process';
|
|
2
|
+
import { loadCliConfig } from '../config/command.js';
|
|
3
|
+
import { detectCliInstallContext } from './detect-install-context.js';
|
|
4
|
+
import { fetchHarnessCliLatestVersion } from './fetch-npm-latest.js';
|
|
5
|
+
import { isNewerSemver3 } from './compare-versions.js';
|
|
6
|
+
import { readInstalledCliVersion } from './read-installed-version.js';
|
|
7
|
+
import { createCliVersionPromptAdapter } from './prompt.js';
|
|
8
|
+
import { runHarnessCliSelfUpdateSync } from './self-update.js';
|
|
9
|
+
const MANUAL_UPDATE_CMD = 'npm install -g @ytinnovation/harness-cli@latest';
|
|
10
|
+
function shouldSkipFromEnv(env) {
|
|
11
|
+
return env.HARNESS_SKIP_VERSION_CHECK?.trim() === '1';
|
|
12
|
+
}
|
|
13
|
+
function shouldSkipFromArgv(argv) {
|
|
14
|
+
if (argv.length === 0) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
const head = argv[0];
|
|
18
|
+
if (head === '--help' || head === '-h') {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (head === 'version') {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
function isCliUpdateCheckEnabled(config) {
|
|
27
|
+
return config.checkCliUpdates !== false;
|
|
28
|
+
}
|
|
29
|
+
function writeUpdateHint(stream, current, latest, extra) {
|
|
30
|
+
const suffix = extra ? ` ${extra}` : '';
|
|
31
|
+
stream.write(`[harness] CLI 有新版本:${current} → ${latest}。${MANUAL_UPDATE_CMD}${suffix}\n`);
|
|
32
|
+
}
|
|
33
|
+
export async function maybeCheckCliUpdate(options) {
|
|
34
|
+
const env = options.env ?? process.env;
|
|
35
|
+
const argv = options.argv;
|
|
36
|
+
const stderr = options.stderr ?? processStderr;
|
|
37
|
+
if (shouldSkipFromEnv(env) || shouldSkipFromArgv(argv)) {
|
|
38
|
+
return { action: 'continue' };
|
|
39
|
+
}
|
|
40
|
+
const loadCfg = options.loadCliConfigImpl ?? loadCliConfig;
|
|
41
|
+
const cfg = await loadCfg({ homeDir: options.homeDir });
|
|
42
|
+
if (!isCliUpdateCheckEnabled(cfg)) {
|
|
43
|
+
return { action: 'continue' };
|
|
44
|
+
}
|
|
45
|
+
const detectCtx = options.detectInstallContextImpl ?? detectCliInstallContext;
|
|
46
|
+
const ctx = detectCtx(process.argv[1]);
|
|
47
|
+
if (ctx.kind === 'dev-checkout') {
|
|
48
|
+
return { action: 'continue' };
|
|
49
|
+
}
|
|
50
|
+
const fetchLatest = options.fetchLatestImpl ?? fetchHarnessCliLatestVersion;
|
|
51
|
+
const current = readInstalledCliVersion();
|
|
52
|
+
const latest = await fetchLatest({ env });
|
|
53
|
+
if (!latest || !isNewerSemver3(latest, current)) {
|
|
54
|
+
return { action: 'continue' };
|
|
55
|
+
}
|
|
56
|
+
if (ctx.kind === 'npx') {
|
|
57
|
+
writeUpdateHint(stderr, current, latest, '(npx 运行请改用全局安装后再更新。)');
|
|
58
|
+
return { action: 'continue' };
|
|
59
|
+
}
|
|
60
|
+
const stdin = options.stdin ?? processStdin;
|
|
61
|
+
const stdout = options.stdout ?? processStdout;
|
|
62
|
+
const promptAdapter = options.promptAdapter ??
|
|
63
|
+
createCliVersionPromptAdapter({ input: stdin, output: stdout });
|
|
64
|
+
const runSelfUpdate = options.runSelfUpdateSyncImpl ?? runHarnessCliSelfUpdateSync;
|
|
65
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
66
|
+
writeUpdateHint(stderr, current, latest);
|
|
67
|
+
return { action: 'continue' };
|
|
68
|
+
}
|
|
69
|
+
const confirmed = await promptAdapter.confirmCliSelfUpdate({ current, latest });
|
|
70
|
+
if (!confirmed) {
|
|
71
|
+
return { action: 'continue' };
|
|
72
|
+
}
|
|
73
|
+
const code = runSelfUpdate({ env });
|
|
74
|
+
if (code !== 0) {
|
|
75
|
+
stderr.write(`[harness] CLI 自更新失败(退出码 ${code}),将继续执行当前命令。\n`);
|
|
76
|
+
return { action: 'continue' };
|
|
77
|
+
}
|
|
78
|
+
return { action: 'reexec', argv: [...argv] };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=maybe-check-cli-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe-check-cli-update.js","sourceRoot":"","sources":["../../src/cli-version/maybe-check-cli-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CliVersionUpdateConfirmation {
|
|
2
|
+
readonly current: string;
|
|
3
|
+
readonly latest: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CliVersionPromptAdapter {
|
|
6
|
+
confirmCliSelfUpdate(input: CliVersionUpdateConfirmation): Promise<boolean>;
|
|
7
|
+
}
|
|
8
|
+
export interface CreateCliVersionPromptAdapterOptions {
|
|
9
|
+
readonly input?: NodeJS.ReadStream;
|
|
10
|
+
readonly output?: NodeJS.WriteStream;
|
|
11
|
+
}
|
|
12
|
+
export declare function createCliVersionPromptAdapter(options?: CreateCliVersionPromptAdapterOptions): CliVersionPromptAdapter;
|
|
13
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/cli-version/prompt.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,oCAAoC;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;CACtC;AAgBD,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,oCAAyC,GACjD,uBAAuB,CAkCzB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { stdin as processStdin, stdout as processStdout } from 'node:process';
|
|
2
|
+
import { createInterface } from 'node:readline/promises';
|
|
3
|
+
function parseYesNo(input, options) {
|
|
4
|
+
const normalized = input.trim().toLowerCase();
|
|
5
|
+
if (normalized === 'y' || normalized === 'yes') {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
if (normalized === 'n' || normalized === 'no') {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (normalized.length === 0 && options?.defaultYes) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
export function createCliVersionPromptAdapter(options = {}) {
|
|
17
|
+
const streamInput = options.input ?? processStdin;
|
|
18
|
+
const streamOutput = options.output ?? processStdout;
|
|
19
|
+
return {
|
|
20
|
+
async confirmCliSelfUpdate(input) {
|
|
21
|
+
if (!streamInput.isTTY || !streamOutput.isTTY) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const rl = createInterface({
|
|
25
|
+
input: streamInput,
|
|
26
|
+
output: streamOutput,
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
streamOutput.write(`\n检测到 CLI 新版本:${input.current} → ${input.latest}\n`);
|
|
30
|
+
while (true) {
|
|
31
|
+
const answer = await rl.question('是否立即通过 npm 全局更新? [y]es / [n]o(回车默认不更新)\n> ');
|
|
32
|
+
const confirmed = parseYesNo(answer, { defaultYes: false });
|
|
33
|
+
if (confirmed !== null) {
|
|
34
|
+
return confirmed;
|
|
35
|
+
}
|
|
36
|
+
streamOutput.write('请输入 y 或 n。\n');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
rl.close();
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/cli-version/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAgBzD,SAAS,UAAU,CAAC,KAAa,EAAE,OAAkC;IACnE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,UAAgD,EAAE;IAElD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAErD,OAAO;QACL,KAAK,CAAC,oBAAoB,CAAC,KAAK;YAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBAC9C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,EAAE,GAAG,eAAe,CAAC;gBACzB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,YAAY,CAAC,KAAK,CAChB,iBAAiB,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,MAAM,IAAI,CACrD,CAAC;gBACF,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,4CAA4C,CAC7C,CAAC;oBACF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;wBACvB,OAAO,SAAS,CAAC;oBACnB,CAAC;oBACD,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-installed-version.d.ts","sourceRoot":"","sources":["../../src/cli-version/read-installed-version.ts"],"names":[],"mappings":"AAKA,wBAAgB,uBAAuB,IAAI,MAAM,CAUhD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
const require = createRequire(import.meta.url);
|
|
4
|
+
export function readInstalledCliVersion() {
|
|
5
|
+
try {
|
|
6
|
+
const pkgPath = require.resolve('@ytinnovation/harness-cli/package.json');
|
|
7
|
+
const raw = readFileSync(pkgPath, 'utf8');
|
|
8
|
+
const pkg = JSON.parse(raw);
|
|
9
|
+
const v = pkg.version?.trim();
|
|
10
|
+
return v && v.length > 0 ? v : '0.0.0';
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return '0.0.0';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=read-installed-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-installed-version.js","sourceRoot":"","sources":["../../src/cli-version/read-installed-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACpD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-npm-registry.d.ts","sourceRoot":"","sources":["../../src/cli-version/resolve-npm-registry.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAU/E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function resolveNpmRegistry(env = process.env) {
|
|
2
|
+
const fromHarness = env.HARNESS_NPM_REGISTRY?.trim();
|
|
3
|
+
if (fromHarness) {
|
|
4
|
+
return stripTrailingSlash(fromHarness);
|
|
5
|
+
}
|
|
6
|
+
const fromNpm = env.npm_config_registry?.trim();
|
|
7
|
+
if (fromNpm) {
|
|
8
|
+
return stripTrailingSlash(fromNpm);
|
|
9
|
+
}
|
|
10
|
+
return 'https://registry.npmjs.org';
|
|
11
|
+
}
|
|
12
|
+
function stripTrailingSlash(url) {
|
|
13
|
+
return url.replace(/\/+$/, '');
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=resolve-npm-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-npm-registry.js","sourceRoot":"","sources":["../../src/cli-version/resolve-npm-registry.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,4BAA4B,CAAC;AACtC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface RunHarnessCliSelfUpdateOptions {
|
|
2
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
3
|
+
}
|
|
4
|
+
/** 同步执行 `npm install -g`,继承 stdio。返回子进程退出码(失败时为非 0)。 */
|
|
5
|
+
export declare function runHarnessCliSelfUpdateSync(options?: RunHarnessCliSelfUpdateOptions): number;
|
|
6
|
+
export interface ReexecHarnessOptions {
|
|
7
|
+
readonly argv: readonly string[];
|
|
8
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
9
|
+
}
|
|
10
|
+
/** 用当前 Node 重新执行 harness 入口脚本与原始参数。 */
|
|
11
|
+
export declare function reexecHarnessSync(options: ReexecHarnessOptions): number;
|
|
12
|
+
//# sourceMappingURL=self-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/cli-version/self-update.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,wDAAwD;AACxD,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,8BAAmC,GAAG,MAAM,CAWhG;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAevE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
const PACKAGE_SPEC = '@ytinnovation/harness-cli@latest';
|
|
3
|
+
/** 同步执行 `npm install -g`,继承 stdio。返回子进程退出码(失败时为非 0)。 */
|
|
4
|
+
export function runHarnessCliSelfUpdateSync(options = {}) {
|
|
5
|
+
const env = options.env ?? process.env;
|
|
6
|
+
const result = spawnSync('npm', ['install', '-g', PACKAGE_SPEC], {
|
|
7
|
+
stdio: 'inherit',
|
|
8
|
+
shell: false,
|
|
9
|
+
env,
|
|
10
|
+
});
|
|
11
|
+
if (result.status === null) {
|
|
12
|
+
return 1;
|
|
13
|
+
}
|
|
14
|
+
return result.status;
|
|
15
|
+
}
|
|
16
|
+
/** 用当前 Node 重新执行 harness 入口脚本与原始参数。 */
|
|
17
|
+
export function reexecHarnessSync(options) {
|
|
18
|
+
const scriptPath = process.argv[1];
|
|
19
|
+
if (!scriptPath) {
|
|
20
|
+
return 1;
|
|
21
|
+
}
|
|
22
|
+
const env = options.env ?? process.env;
|
|
23
|
+
const result = spawnSync(process.execPath, [scriptPath, ...options.argv], {
|
|
24
|
+
stdio: 'inherit',
|
|
25
|
+
shell: false,
|
|
26
|
+
env,
|
|
27
|
+
});
|
|
28
|
+
if (result.status === null) {
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
return result.status;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=self-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/cli-version/self-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAMxD,wDAAwD;AACxD,MAAM,UAAU,2BAA2B,CAAC,UAA0C,EAAE;IACtF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE;QAC/D,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,KAAK;QACZ,GAAG;KACJ,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAOD,uCAAuC;AACvC,MAAM,UAAU,iBAAiB,CAAC,OAA6B;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE;QACxE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,KAAK;QACZ,GAAG;KACJ,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
|
package/dist/config/command.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { CommandRouter } from '../kernel/router.js';
|
|
2
2
|
export interface HarnessCliConfig {
|
|
3
3
|
serviceUrl?: string;
|
|
4
|
+
/** 为 `false` 时关闭启动时的 npm 最新版检测;缺省或未设置视为开启。 */
|
|
5
|
+
checkCliUpdates?: boolean;
|
|
4
6
|
}
|
|
5
7
|
export declare function resolveCliConfigDir(options?: ConfigCommandOptions): string;
|
|
6
8
|
export declare function resolveCliConfigPath(options?: ConfigCommandOptions): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/config/command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/config/command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAKD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,CAE/E;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQjG;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/G;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,iBAAS,gBAAgB,CAAC,WAAW,SAAY,GAAG,MAAM,CAkBzD;AA8CD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2E1G;AAcD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEjE;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/config/command.js
CHANGED
|
@@ -34,20 +34,25 @@ function renderConfigHelp(programName = 'harness') {
|
|
|
34
34
|
` ${programName} config 查看当前配置`,
|
|
35
35
|
` ${programName} config --service <url> 设置后端服务地址`,
|
|
36
36
|
` ${programName} config --unset-service 清除已设置的服务地址`,
|
|
37
|
+
` ${programName} config --cli-updates 恢复启动时检测 CLI 更新(默认)`,
|
|
38
|
+
` ${programName} config --no-cli-updates 关闭启动时检测 CLI 更新`,
|
|
37
39
|
'',
|
|
38
40
|
'选项:',
|
|
39
41
|
' --service <url> 设置 HARNESS_SERVICE_URL',
|
|
40
42
|
' --unset-service 清除已配置的 serviceUrl,回退到默认或环境变量',
|
|
43
|
+
' --cli-updates 启用启动时 npm 最新版检测(清除配置中的关闭项)',
|
|
44
|
+
' --no-cli-updates 关闭启动时 npm 最新版检测',
|
|
41
45
|
' -h, --help 查看帮助。',
|
|
42
46
|
].join('\n');
|
|
43
47
|
}
|
|
44
48
|
function parseConfigArgs(args) {
|
|
45
49
|
let serviceUrl = null;
|
|
46
50
|
let unsetService = false;
|
|
51
|
+
let checkCliUpdates = null;
|
|
47
52
|
for (let index = 0; index < args.length; index += 1) {
|
|
48
53
|
const arg = args[index];
|
|
49
54
|
if (arg === '--help' || arg === '-h') {
|
|
50
|
-
return { showHelp: true, serviceUrl: null, unsetService: false };
|
|
55
|
+
return { showHelp: true, serviceUrl: null, unsetService: false, checkCliUpdates: null };
|
|
51
56
|
}
|
|
52
57
|
if (arg === '--service') {
|
|
53
58
|
const value = args[index + 1];
|
|
@@ -62,9 +67,17 @@ function parseConfigArgs(args) {
|
|
|
62
67
|
unsetService = true;
|
|
63
68
|
continue;
|
|
64
69
|
}
|
|
70
|
+
if (arg === '--cli-updates') {
|
|
71
|
+
checkCliUpdates = true;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (arg === '--no-cli-updates') {
|
|
75
|
+
checkCliUpdates = false;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
65
78
|
throw new HarnessError('CONFIG_INVALID_ARGS', `未知的 config 选项: ${arg}`);
|
|
66
79
|
}
|
|
67
|
-
return { showHelp: false, serviceUrl, unsetService };
|
|
80
|
+
return { showHelp: false, serviceUrl, unsetService, checkCliUpdates };
|
|
68
81
|
}
|
|
69
82
|
export async function runConfigCommand(args, options = {}) {
|
|
70
83
|
if (args.length === 0) {
|
|
@@ -90,13 +103,51 @@ export async function runConfigCommand(args, options = {}) {
|
|
|
90
103
|
console.log(renderConfigHelp());
|
|
91
104
|
return 0;
|
|
92
105
|
}
|
|
106
|
+
const hasMutation = parsed.unsetService || parsed.serviceUrl !== null || parsed.checkCliUpdates !== null;
|
|
107
|
+
if (!hasMutation) {
|
|
108
|
+
return showConfig(options);
|
|
109
|
+
}
|
|
110
|
+
if (parsed.serviceUrl !== null) {
|
|
111
|
+
try {
|
|
112
|
+
new URL(parsed.serviceUrl);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
console.error(renderErrorBlock({
|
|
116
|
+
title: 'URL 格式无效',
|
|
117
|
+
message: `提供的 URL "${parsed.serviceUrl}" 不是有效的地址。`,
|
|
118
|
+
code: 'CONFIG_INVALID_URL',
|
|
119
|
+
suggestions: ['请使用完整的 URL,例如 http://localhost:3100 或 https://api.example.com'],
|
|
120
|
+
}));
|
|
121
|
+
return 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const config = await loadCliConfig(options);
|
|
93
125
|
if (parsed.unsetService) {
|
|
94
|
-
|
|
126
|
+
delete config.serviceUrl;
|
|
95
127
|
}
|
|
96
128
|
if (parsed.serviceUrl !== null) {
|
|
97
|
-
|
|
129
|
+
config.serviceUrl = parsed.serviceUrl;
|
|
130
|
+
}
|
|
131
|
+
if (parsed.checkCliUpdates !== null) {
|
|
132
|
+
if (parsed.checkCliUpdates) {
|
|
133
|
+
delete config.checkCliUpdates;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
config.checkCliUpdates = false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
await saveCliConfig(config, options);
|
|
140
|
+
const summaryRows = [];
|
|
141
|
+
if (parsed.unsetService || parsed.serviceUrl !== null) {
|
|
142
|
+
summaryRows.push(['serviceUrl', config.serviceUrl ?? null]);
|
|
98
143
|
}
|
|
99
|
-
|
|
144
|
+
if (parsed.checkCliUpdates !== null) {
|
|
145
|
+
summaryRows.push(['checkCliUpdates', config.checkCliUpdates === false ? '否' : '是']);
|
|
146
|
+
}
|
|
147
|
+
console.log(renderSuccessBlock('配置已更新', summaryRows, [
|
|
148
|
+
`配置已保存到 ${resolveCliConfigPath(options)}`,
|
|
149
|
+
]));
|
|
150
|
+
return 0;
|
|
100
151
|
}
|
|
101
152
|
async function showConfig(options) {
|
|
102
153
|
const config = await loadCliConfig(options);
|
|
@@ -104,51 +155,11 @@ async function showConfig(options) {
|
|
|
104
155
|
const rows = [
|
|
105
156
|
['配置文件', configPath],
|
|
106
157
|
['serviceUrl', config.serviceUrl ?? null],
|
|
158
|
+
['checkCliUpdates', config.checkCliUpdates === false ? '否' : '是'],
|
|
107
159
|
];
|
|
108
160
|
console.log(renderKeyValueBlock('Harness CLI 配置', rows));
|
|
109
161
|
return 0;
|
|
110
162
|
}
|
|
111
|
-
async function setServiceUrl(url, options) {
|
|
112
|
-
try {
|
|
113
|
-
new URL(url);
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
console.error(renderErrorBlock({
|
|
117
|
-
title: 'URL 格式无效',
|
|
118
|
-
message: `提供的 URL "${url}" 不是有效的地址。`,
|
|
119
|
-
code: 'CONFIG_INVALID_URL',
|
|
120
|
-
suggestions: ['请使用完整的 URL,例如 http://localhost:3100 或 https://api.example.com'],
|
|
121
|
-
}));
|
|
122
|
-
return 1;
|
|
123
|
-
}
|
|
124
|
-
const config = await loadCliConfig(options);
|
|
125
|
-
config.serviceUrl = url;
|
|
126
|
-
await saveCliConfig(config, options);
|
|
127
|
-
console.log(renderSuccessBlock('配置已更新', [
|
|
128
|
-
['serviceUrl', url],
|
|
129
|
-
], [
|
|
130
|
-
`配置已保存到 ${resolveCliConfigPath(options)}`,
|
|
131
|
-
'下次运行 harness 命令时将自动使用新地址。',
|
|
132
|
-
]));
|
|
133
|
-
return 0;
|
|
134
|
-
}
|
|
135
|
-
async function unsetConfig(key, options) {
|
|
136
|
-
const config = await loadCliConfig(options);
|
|
137
|
-
if (!config[key]) {
|
|
138
|
-
console.log(renderKeyValueBlock('Harness CLI 配置', [
|
|
139
|
-
[key, null],
|
|
140
|
-
]));
|
|
141
|
-
return 0;
|
|
142
|
-
}
|
|
143
|
-
delete config[key];
|
|
144
|
-
await saveCliConfig(config, options);
|
|
145
|
-
console.log(renderSuccessBlock('配置已清除', [
|
|
146
|
-
[key, null],
|
|
147
|
-
], [
|
|
148
|
-
`配置已保存到 ${resolveCliConfigPath(options)}`,
|
|
149
|
-
]));
|
|
150
|
-
return 0;
|
|
151
|
-
}
|
|
152
163
|
export function registerConfigCommand(router) {
|
|
153
164
|
router.register('config', runConfigCommand);
|
|
154
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/config/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/config/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAQvG,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAC1C,MAAM,2BAA2B,GAAG,UAAU,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAAC,UAAgC,EAAE;IACpE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAgC,EAAE;IACrE,OAAO,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,2BAA2B,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAgC,EAAE;IACpE,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAwB,EAAE,UAAgC,EAAE;IAC9F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAMD,SAAS,gBAAgB,CAAC,WAAW,GAAG,SAAS;IAC/C,OAAO;QACL,uBAAuB;QACvB,EAAE;QACF,KAAK;QACL,KAAK,WAAW,yCAAyC;QACzD,KAAK,WAAW,4CAA4C;QAC5D,KAAK,WAAW,+CAA+C;QAC/D,KAAK,WAAW,uDAAuD;QACvE,KAAK,WAAW,mDAAmD;QACnE,EAAE;QACF,KAAK;QACL,iDAAiD;QACjD,uDAAuD;QACvD,qDAAqD;QACrD,0CAA0C;QAC1C,gCAAgC;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AASD,SAAS,eAAe,CAAC,IAAc;IACrC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,eAAe,GAAmB,IAAI,CAAC;IAE3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QAC1F,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,0DAA0D,CAAC,CAAC;YAC5G,CAAC;YACD,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,eAAe,GAAG,IAAI,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YAC/B,eAAe,GAAG,KAAK,CAAC;YACxB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,kBAAkB,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc,EAAE,UAAgC,EAAE;IACvF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,MAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBAC7B,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,WAAW,EAAE,CAAC,kCAAkC,CAAC;aAClD,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GACf,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC;IACvF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBAC7B,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,YAAY,MAAM,CAAC,UAAU,YAAY;gBAClD,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,CAAC,+DAA+D,CAAC;aAC/E,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,UAAU,CAAC;IAC3B,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,eAAe,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErC,MAAM,WAAW,GAA8B,EAAE,CAAC;IAClD,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACtD,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QACpC,WAAW,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE;QACnD,UAAU,oBAAoB,CAAC,OAAO,CAAC,EAAE;KAC1C,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAA6B;IACrD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,IAAI,GAAkD;QAC1D,CAAC,MAAM,EAAE,UAAU,CAAC;QACpB,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;QACzC,CAAC,iBAAiB,EAAE,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;KAClE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAC9C,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|