@inf-monkeys-tech/monkeys-cli 0.10.3 → 0.10.5
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 +23 -0
- package/README.zh.md +23 -0
- package/bin/run.js +39 -6
- package/bin/update-cache.js +7 -0
- package/dist/api/operation-policy.d.ts +1 -1
- package/dist/api/operation-policy.d.ts.map +1 -1
- package/dist/api/operation-policy.js.map +1 -1
- package/dist/commands/auth/login.d.ts +6 -1
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +26 -9
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/profile/add.d.ts.map +1 -1
- package/dist/commands/profile/add.js +1 -1
- package/dist/commands/profile/add.js.map +1 -1
- package/dist/commands/profile/update.d.ts.map +1 -1
- package/dist/commands/profile/update.js +1 -1
- package/dist/commands/profile/update.js.map +1 -1
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +110 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/workflow/create.js +1 -1
- package/dist/commands/workflow/create.js.map +1 -1
- package/dist/commands/workflow/delete.js +1 -1
- package/dist/commands/workflow/delete.js.map +1 -1
- package/dist/commands/workflow/import.js +1 -1
- package/dist/commands/workflow/import.js.map +1 -1
- package/dist/commands/workflow/update.js +1 -1
- package/dist/commands/workflow/update.js.map +1 -1
- package/dist/config/registry.d.ts +2 -2
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js.map +1 -1
- package/dist/config/schema.d.ts +13 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +2 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/context/resolver.d.ts +2 -3
- package/dist/context/resolver.d.ts.map +1 -1
- package/dist/context/resolver.js.map +1 -1
- package/dist/contracts/result.d.ts +6 -0
- package/dist/contracts/result.d.ts.map +1 -1
- package/dist/contracts/result.js +7 -2
- package/dist/contracts/result.js.map +1 -1
- package/dist/credential/auth-service.d.ts +1 -2
- package/dist/credential/auth-service.d.ts.map +1 -1
- package/dist/credential/auth-service.js +4 -6
- package/dist/credential/auth-service.js.map +1 -1
- package/dist/credential/runtime.d.ts +1 -1
- package/dist/credential/runtime.d.ts.map +1 -1
- package/dist/credential/runtime.js +1 -1
- package/dist/credential/runtime.js.map +1 -1
- package/dist/data/command.d.ts +1 -1
- package/dist/openapi/types.d.ts +8 -8
- package/dist/openapi/types.d.ts.map +1 -1
- package/dist/openapi/types.js +1 -1
- package/dist/openapi/types.js.map +1 -1
- package/dist/output/render.d.ts.map +1 -1
- package/dist/output/render.js +7 -2
- package/dist/output/render.js.map +1 -1
- package/dist/transport/types.d.ts +1 -1
- package/dist/transport/types.d.ts.map +1 -1
- package/dist/update/notifier.d.ts +43 -0
- package/dist/update/notifier.d.ts.map +1 -0
- package/dist/update/notifier.js +242 -0
- package/dist/update/notifier.js.map +1 -0
- package/dist/update/updater.d.ts +26 -0
- package/dist/update/updater.d.ts.map +1 -0
- package/dist/update/updater.js +91 -0
- package/dist/update/updater.js.map +1 -0
- package/oclif.manifest.json +62 -5
- package/package.json +5 -4
- package/skills/monkeys/SKILL.md +1 -1
- package/skills/monkeys/references/compatibility.md +2 -0
- package/skills/monkeys/references/data-governance.md +1 -1
- package/skills/monkeys/references/workflow-execution-files.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/output/render.ts"],"names":[],"mappings":"AAIA,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,MAAwB,EAAE,MAAoB;IAC5E,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/E,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/output/render.ts"],"names":[],"mappings":"AAIA,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,MAAwB,EAAE,MAAoB;IAC5E,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACxG,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;IACtC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,yBAAyB,MAAM,CAAC,OAAO,MAAM,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;AACpI,CAAC"}
|
|
@@ -2,7 +2,7 @@ import type { Dispatcher } from 'undici';
|
|
|
2
2
|
import type { Readable } from 'node:stream';
|
|
3
3
|
export type HttpMethod = 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT';
|
|
4
4
|
export interface TransportContext {
|
|
5
|
-
authSurface: 'kernel' | '
|
|
5
|
+
authSurface: 'kernel' | 'studio';
|
|
6
6
|
baseUrl: string;
|
|
7
7
|
caPath?: string;
|
|
8
8
|
proxyUrl?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1F,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1F,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;IACjG,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG;QAAE,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,CAAC;IACnE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const UPDATE_CHECK_TTL_MS: number;
|
|
2
|
+
export declare const UPDATE_FETCH_TIMEOUT_MS = 15000;
|
|
3
|
+
export declare const UPDATE_NOTIFIER_DISABLE_ENV = "MONKEYS_CLI_NO_UPDATE_NOTIFIER";
|
|
4
|
+
export declare const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/@inf-monkeys-tech%2Fmonkeys-cli/latest";
|
|
5
|
+
export interface UpdateNotice {
|
|
6
|
+
command: 'monkeys update';
|
|
7
|
+
current: string;
|
|
8
|
+
latest: string;
|
|
9
|
+
message: string;
|
|
10
|
+
}
|
|
11
|
+
export interface UpdateState {
|
|
12
|
+
checkedAt: number;
|
|
13
|
+
latestVersion: string;
|
|
14
|
+
}
|
|
15
|
+
export interface FetchLatestOptions {
|
|
16
|
+
fetchImpl?: typeof fetch;
|
|
17
|
+
registryUrl?: string;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface UpdateCacheOptions extends FetchLatestOptions {
|
|
21
|
+
env?: NodeJS.ProcessEnv;
|
|
22
|
+
nowMs?: number;
|
|
23
|
+
statePath?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface InitializeUpdateNotifierOptions extends UpdateCacheOptions {
|
|
26
|
+
scheduleRefresh?: (currentVersion: string) => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function compareVersions(left: string, right: string): number | undefined;
|
|
29
|
+
export declare function isNewerVersion(candidate: string, current: string): boolean;
|
|
30
|
+
export declare function isReleaseVersion(version: string): boolean;
|
|
31
|
+
export declare function isCiEnvironment(env?: NodeJS.ProcessEnv): boolean;
|
|
32
|
+
export declare function shouldSkipUpdateNotifier(currentVersion: string, env?: NodeJS.ProcessEnv): boolean;
|
|
33
|
+
export declare function updateStatePath(env?: NodeJS.ProcessEnv): string;
|
|
34
|
+
export declare function createUpdateNotice(current: string, latest: string): UpdateNotice;
|
|
35
|
+
export declare function getPendingUpdateNotice(): UpdateNotice | undefined;
|
|
36
|
+
export declare function clearPendingUpdateNotice(): void;
|
|
37
|
+
export declare function setPendingUpdateNotice(notice: UpdateNotice | undefined): void;
|
|
38
|
+
export declare function readUpdateState(path?: string): Promise<UpdateState | undefined>;
|
|
39
|
+
export declare function fetchLatestVersion(options?: FetchLatestOptions): Promise<string>;
|
|
40
|
+
export declare function refreshUpdateCache(currentVersion: string, options?: UpdateCacheOptions): Promise<boolean>;
|
|
41
|
+
export declare function scheduleUpdateCacheRefresh(currentVersion: string): void;
|
|
42
|
+
export declare function initializeUpdateNotifier(currentVersion: string, options?: InitializeUpdateNotifierOptions): Promise<UpdateNotice | undefined>;
|
|
43
|
+
//# sourceMappingURL=notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/update/notifier.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,mBAAmB,QAAuB,CAAC;AACxD,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,2BAA2B,mCAAmC,CAAC;AAC5E,eAAO,MAAM,mBAAmB,sEAAsE,CAAC;AAWvG,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,+BAAgC,SAAQ,kBAAkB;IACzE,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAmCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS/E;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE7E;AAED,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE9G;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAOhF;AAED,wBAAgB,sBAAsB,IAAI,YAAY,GAAG,SAAS,CAEjE;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAE7E;AAUD,wBAAsB,eAAe,CAAC,IAAI,SAAoB,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAMhG;AAqCD,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAY1F;AAqBD,wBAAsB,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBnH;AAED,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAavE;AAED,wBAAsB,wBAAwB,CAC5C,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAenC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { open, mkdir, readFile, rename, rm, stat } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { configDirectory, resolveConfigPath } from '../config/paths.js';
|
|
6
|
+
export const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1_000;
|
|
7
|
+
export const UPDATE_FETCH_TIMEOUT_MS = 15_000;
|
|
8
|
+
export const UPDATE_NOTIFIER_DISABLE_ENV = 'MONKEYS_CLI_NO_UPDATE_NOTIFIER';
|
|
9
|
+
export const UPDATE_REGISTRY_URL = 'https://registry.npmjs.org/@inf-monkeys-tech%2Fmonkeys-cli/latest';
|
|
10
|
+
const MAX_RESPONSE_BYTES = 256 * 1_024;
|
|
11
|
+
const REFRESH_LOCK_STALE_MS = UPDATE_FETCH_TIMEOUT_MS * 2;
|
|
12
|
+
const UPDATE_STATE_FILE = 'update-state.json';
|
|
13
|
+
let pendingUpdateNotice;
|
|
14
|
+
function isNodeError(error, code) {
|
|
15
|
+
return error instanceof Error && 'code' in error && error.code === code;
|
|
16
|
+
}
|
|
17
|
+
function parseVersion(value) {
|
|
18
|
+
const match = /^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/.exec(value.trim());
|
|
19
|
+
if (!match)
|
|
20
|
+
return undefined;
|
|
21
|
+
const core = [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
22
|
+
if (!core.every(Number.isSafeInteger))
|
|
23
|
+
return undefined;
|
|
24
|
+
return { core, prerelease: match[4]?.split('.') ?? [] };
|
|
25
|
+
}
|
|
26
|
+
function comparePrerelease(left, right) {
|
|
27
|
+
if (left.length === 0 || right.length === 0)
|
|
28
|
+
return left.length === right.length ? 0 : left.length === 0 ? 1 : -1;
|
|
29
|
+
const length = Math.max(left.length, right.length);
|
|
30
|
+
for (let index = 0; index < length; index += 1) {
|
|
31
|
+
const leftValue = left[index];
|
|
32
|
+
const rightValue = right[index];
|
|
33
|
+
if (leftValue === undefined || rightValue === undefined)
|
|
34
|
+
return leftValue === rightValue ? 0 : leftValue === undefined ? -1 : 1;
|
|
35
|
+
if (leftValue === rightValue)
|
|
36
|
+
continue;
|
|
37
|
+
const leftNumeric = /^\d+$/.test(leftValue);
|
|
38
|
+
const rightNumeric = /^\d+$/.test(rightValue);
|
|
39
|
+
if (leftNumeric && rightNumeric)
|
|
40
|
+
return Number(leftValue) - Number(rightValue);
|
|
41
|
+
if (leftNumeric !== rightNumeric)
|
|
42
|
+
return leftNumeric ? -1 : 1;
|
|
43
|
+
return leftValue.localeCompare(rightValue);
|
|
44
|
+
}
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
export function compareVersions(left, right) {
|
|
48
|
+
const parsedLeft = parseVersion(left);
|
|
49
|
+
const parsedRight = parseVersion(right);
|
|
50
|
+
if (!parsedLeft || !parsedRight)
|
|
51
|
+
return undefined;
|
|
52
|
+
for (let index = 0; index < parsedLeft.core.length; index += 1) {
|
|
53
|
+
const difference = parsedLeft.core[index] - parsedRight.core[index];
|
|
54
|
+
if (difference !== 0)
|
|
55
|
+
return difference;
|
|
56
|
+
}
|
|
57
|
+
return comparePrerelease(parsedLeft.prerelease, parsedRight.prerelease);
|
|
58
|
+
}
|
|
59
|
+
export function isNewerVersion(candidate, current) {
|
|
60
|
+
return (compareVersions(candidate, current) ?? 0) > 0;
|
|
61
|
+
}
|
|
62
|
+
export function isReleaseVersion(version) {
|
|
63
|
+
return parseVersion(version) !== undefined;
|
|
64
|
+
}
|
|
65
|
+
export function isCiEnvironment(env = process.env) {
|
|
66
|
+
return ['CI', 'BUILD_NUMBER', 'RUN_ID'].some((key) => Boolean(env[key]));
|
|
67
|
+
}
|
|
68
|
+
export function shouldSkipUpdateNotifier(currentVersion, env = process.env) {
|
|
69
|
+
return Boolean(env[UPDATE_NOTIFIER_DISABLE_ENV]) || isCiEnvironment(env) || !isReleaseVersion(currentVersion);
|
|
70
|
+
}
|
|
71
|
+
export function updateStatePath(env = process.env) {
|
|
72
|
+
return join(configDirectory(resolveConfigPath(env)), UPDATE_STATE_FILE);
|
|
73
|
+
}
|
|
74
|
+
export function createUpdateNotice(current, latest) {
|
|
75
|
+
return {
|
|
76
|
+
command: 'monkeys update',
|
|
77
|
+
current,
|
|
78
|
+
latest,
|
|
79
|
+
message: `monkeys ${latest} available, current ${current}, run: monkeys update`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function getPendingUpdateNotice() {
|
|
83
|
+
return pendingUpdateNotice;
|
|
84
|
+
}
|
|
85
|
+
export function clearPendingUpdateNotice() {
|
|
86
|
+
pendingUpdateNotice = undefined;
|
|
87
|
+
}
|
|
88
|
+
export function setPendingUpdateNotice(notice) {
|
|
89
|
+
pendingUpdateNotice = notice;
|
|
90
|
+
}
|
|
91
|
+
function parseUpdateState(value) {
|
|
92
|
+
if (typeof value !== 'object' || value === null)
|
|
93
|
+
return undefined;
|
|
94
|
+
const candidate = value;
|
|
95
|
+
if (!Number.isSafeInteger(candidate.checkedAt) || typeof candidate.latestVersion !== 'string')
|
|
96
|
+
return undefined;
|
|
97
|
+
if (!isReleaseVersion(candidate.latestVersion))
|
|
98
|
+
return undefined;
|
|
99
|
+
return { checkedAt: candidate.checkedAt, latestVersion: candidate.latestVersion };
|
|
100
|
+
}
|
|
101
|
+
export async function readUpdateState(path = updateStatePath()) {
|
|
102
|
+
try {
|
|
103
|
+
return parseUpdateState(JSON.parse(await readFile(path, 'utf8')));
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function atomicWrite(path, content) {
|
|
110
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
111
|
+
const temporary = `${path}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
112
|
+
let handle;
|
|
113
|
+
try {
|
|
114
|
+
handle = await open(temporary, 'wx', 0o600);
|
|
115
|
+
await handle.writeFile(content, 'utf8');
|
|
116
|
+
await handle.sync();
|
|
117
|
+
await handle.close();
|
|
118
|
+
handle = undefined;
|
|
119
|
+
await rename(temporary, path);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
if (handle !== undefined)
|
|
123
|
+
await handle.close();
|
|
124
|
+
await rm(temporary, { force: true });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function readLimitedBody(response) {
|
|
128
|
+
if (!response.body)
|
|
129
|
+
return '';
|
|
130
|
+
const reader = response.body.getReader();
|
|
131
|
+
const chunks = [];
|
|
132
|
+
let total = 0;
|
|
133
|
+
for (;;) {
|
|
134
|
+
const { done, value } = await reader.read();
|
|
135
|
+
if (done)
|
|
136
|
+
break;
|
|
137
|
+
total += value.byteLength;
|
|
138
|
+
if (total > MAX_RESPONSE_BYTES) {
|
|
139
|
+
await reader.cancel();
|
|
140
|
+
throw new Error('npm registry response exceeds the maximum allowed size');
|
|
141
|
+
}
|
|
142
|
+
chunks.push(value);
|
|
143
|
+
}
|
|
144
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
145
|
+
}
|
|
146
|
+
export async function fetchLatestVersion(options = {}) {
|
|
147
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
148
|
+
const response = await fetchImpl(options.registryUrl ?? UPDATE_REGISTRY_URL, {
|
|
149
|
+
headers: { accept: 'application/json' },
|
|
150
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? UPDATE_FETCH_TIMEOUT_MS),
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok)
|
|
153
|
+
throw new Error(`npm registry returned HTTP ${response.status}`);
|
|
154
|
+
const body = JSON.parse(await readLimitedBody(response));
|
|
155
|
+
if (typeof body.version !== 'string' || !isReleaseVersion(body.version)) {
|
|
156
|
+
throw new Error('npm registry returned an invalid package version');
|
|
157
|
+
}
|
|
158
|
+
return body.version;
|
|
159
|
+
}
|
|
160
|
+
async function acquireRefreshLock(path, nowMs) {
|
|
161
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
162
|
+
try {
|
|
163
|
+
const handle = await open(path, 'wx', 0o600);
|
|
164
|
+
await handle.writeFile(JSON.stringify({ createdAt: nowMs, pid: process.pid }));
|
|
165
|
+
return handle;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (!isNodeError(error, 'EEXIST'))
|
|
169
|
+
return undefined;
|
|
170
|
+
const existing = await stat(path).catch(() => undefined);
|
|
171
|
+
if (!existing || nowMs - existing.mtimeMs <= REFRESH_LOCK_STALE_MS)
|
|
172
|
+
return undefined;
|
|
173
|
+
await rm(path, { force: true });
|
|
174
|
+
try {
|
|
175
|
+
return await open(path, 'wx', 0o600);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
export async function refreshUpdateCache(currentVersion, options = {}) {
|
|
183
|
+
const env = options.env ?? process.env;
|
|
184
|
+
if (shouldSkipUpdateNotifier(currentVersion, env))
|
|
185
|
+
return false;
|
|
186
|
+
const path = options.statePath ?? updateStatePath(env);
|
|
187
|
+
const nowMs = options.nowMs ?? Date.now();
|
|
188
|
+
const cached = await readUpdateState(path);
|
|
189
|
+
if (cached && nowMs - cached.checkedAt < UPDATE_CHECK_TTL_MS)
|
|
190
|
+
return false;
|
|
191
|
+
const lockPath = `${path}.lock`;
|
|
192
|
+
const lock = await acquireRefreshLock(lockPath, nowMs);
|
|
193
|
+
if (!lock)
|
|
194
|
+
return false;
|
|
195
|
+
try {
|
|
196
|
+
const latestState = await readUpdateState(path);
|
|
197
|
+
if (latestState && nowMs - latestState.checkedAt < UPDATE_CHECK_TTL_MS)
|
|
198
|
+
return false;
|
|
199
|
+
const latestVersion = await fetchLatestVersion(options);
|
|
200
|
+
await atomicWrite(path, `${JSON.stringify({ checkedAt: nowMs, latestVersion })}\n`);
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
await lock.close().catch(() => undefined);
|
|
208
|
+
await rm(lockPath, { force: true }).catch(() => undefined);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export function scheduleUpdateCacheRefresh(currentVersion) {
|
|
212
|
+
try {
|
|
213
|
+
const worker = fileURLToPath(new URL('../../bin/update-cache.js', import.meta.url));
|
|
214
|
+
const child = spawn(process.execPath, [worker, currentVersion], {
|
|
215
|
+
detached: true,
|
|
216
|
+
env: process.env,
|
|
217
|
+
stdio: 'ignore',
|
|
218
|
+
windowsHide: true,
|
|
219
|
+
});
|
|
220
|
+
child.unref();
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Update discovery must never affect the requested command.
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export async function initializeUpdateNotifier(currentVersion, options = {}) {
|
|
227
|
+
clearPendingUpdateNotice();
|
|
228
|
+
const env = options.env ?? process.env;
|
|
229
|
+
if (shouldSkipUpdateNotifier(currentVersion, env))
|
|
230
|
+
return undefined;
|
|
231
|
+
const path = options.statePath ?? updateStatePath(env);
|
|
232
|
+
const nowMs = options.nowMs ?? Date.now();
|
|
233
|
+
const state = await readUpdateState(path);
|
|
234
|
+
if (state && isNewerVersion(state.latestVersion, currentVersion)) {
|
|
235
|
+
setPendingUpdateNotice(createUpdateNotice(currentVersion, state.latestVersion));
|
|
236
|
+
}
|
|
237
|
+
if (!state || nowMs - state.checkedAt >= UPDATE_CHECK_TTL_MS) {
|
|
238
|
+
(options.scheduleRefresh ?? scheduleUpdateCacheRefresh)(currentVersion);
|
|
239
|
+
}
|
|
240
|
+
return getPendingUpdateNotice();
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/update/notifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const MONKEYS_NPM_PACKAGE = "@inf-monkeys-tech/monkeys-cli";
|
|
2
|
+
export interface ProcessResult {
|
|
3
|
+
error?: Error;
|
|
4
|
+
status: number | null;
|
|
5
|
+
stderr: string;
|
|
6
|
+
stdout: string;
|
|
7
|
+
}
|
|
8
|
+
export type ProcessRunner = (command: string, args: string[]) => ProcessResult;
|
|
9
|
+
export interface InstallUpdateOptions {
|
|
10
|
+
packageName?: string;
|
|
11
|
+
runner?: ProcessRunner;
|
|
12
|
+
}
|
|
13
|
+
export interface InstallUpdateResult {
|
|
14
|
+
currentVersion: string;
|
|
15
|
+
packageRoot: string;
|
|
16
|
+
skillsAction: 'failed' | 'synced';
|
|
17
|
+
skillsWarning?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class UpdateProcessError extends Error {
|
|
20
|
+
readonly command: string;
|
|
21
|
+
readonly detail: string;
|
|
22
|
+
constructor(message: string, command: string, detail: string);
|
|
23
|
+
}
|
|
24
|
+
export declare function runUpdateProcess(command: string, args: string[]): ProcessResult;
|
|
25
|
+
export declare function installCliAndSkill(latestVersion: string, options?: InstallUpdateOptions): Promise<InstallUpdateResult>;
|
|
26
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/update/updater.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB,kCAAkC,CAAC;AAInE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,aAAa,CAAC;AAE/E,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAK3D;CACF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAe/E;AAuBD,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoDhI"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { isAbsolute, join } from 'node:path';
|
|
4
|
+
export const MONKEYS_NPM_PACKAGE = '@inf-monkeys-tech/monkeys-cli';
|
|
5
|
+
const UPDATE_PROCESS_TIMEOUT_MS = 120_000;
|
|
6
|
+
const MAX_PROCESS_DETAIL = 2_000;
|
|
7
|
+
export class UpdateProcessError extends Error {
|
|
8
|
+
command;
|
|
9
|
+
detail;
|
|
10
|
+
constructor(message, command, detail) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'UpdateProcessError';
|
|
13
|
+
this.command = command;
|
|
14
|
+
this.detail = detail;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function runUpdateProcess(command, args) {
|
|
18
|
+
const windows = process.platform === 'win32';
|
|
19
|
+
const executable = windows ? (process.env.ComSpec ?? 'cmd.exe') : command;
|
|
20
|
+
const commandArgs = windows ? ['/d', '/s', '/c', command, ...args] : args;
|
|
21
|
+
const result = spawnSync(executable, commandArgs, {
|
|
22
|
+
encoding: 'utf8',
|
|
23
|
+
timeout: UPDATE_PROCESS_TIMEOUT_MS,
|
|
24
|
+
windowsHide: true,
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
...(result.error ? { error: result.error } : {}),
|
|
28
|
+
status: result.status,
|
|
29
|
+
stderr: result.stderr ?? '',
|
|
30
|
+
stdout: result.stdout ?? '',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function processDetail(result) {
|
|
34
|
+
return `${result.stdout}\n${result.stderr}`.trim().slice(0, MAX_PROCESS_DETAIL);
|
|
35
|
+
}
|
|
36
|
+
function requireSuccess(result, command, message) {
|
|
37
|
+
if (!result.error && result.status === 0)
|
|
38
|
+
return;
|
|
39
|
+
throw new UpdateProcessError(message, command, processDetail(result) || result.error?.message || 'unknown failure');
|
|
40
|
+
}
|
|
41
|
+
function parseGlobalRoot(result) {
|
|
42
|
+
requireSuccess(result, 'npm root --global', '无法确定 npm 全局安装目录。');
|
|
43
|
+
const lines = result.stdout
|
|
44
|
+
.split(/\r?\n/)
|
|
45
|
+
.map((line) => line.trim())
|
|
46
|
+
.filter(Boolean);
|
|
47
|
+
if (lines.length !== 1 || !isAbsolute(lines[0])) {
|
|
48
|
+
throw new UpdateProcessError('npm 返回了无效的全局安装目录。', 'npm root --global', processDetail(result));
|
|
49
|
+
}
|
|
50
|
+
return lines[0];
|
|
51
|
+
}
|
|
52
|
+
export async function installCliAndSkill(latestVersion, options = {}) {
|
|
53
|
+
const packageName = options.packageName ?? MONKEYS_NPM_PACKAGE;
|
|
54
|
+
const runner = options.runner ?? runUpdateProcess;
|
|
55
|
+
const installResult = runner('npm', ['install', '--global', `${packageName}@${latestVersion}`]);
|
|
56
|
+
requireSuccess(installResult, `npm install --global ${packageName}@${latestVersion}`, 'npm 全局升级失败。');
|
|
57
|
+
const globalRoot = parseGlobalRoot(runner('npm', ['root', '--global']));
|
|
58
|
+
const packageRoot = join(globalRoot, ...packageName.split('/'));
|
|
59
|
+
let manifest;
|
|
60
|
+
try {
|
|
61
|
+
manifest = JSON.parse(await readFile(join(packageRoot, 'package.json'), 'utf8'));
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new UpdateProcessError('无法验证升级后的 npm 包。', `read ${join(packageRoot, 'package.json')}`, error instanceof Error ? error.message : String(error));
|
|
65
|
+
}
|
|
66
|
+
if (manifest.name !== packageName || manifest.version !== latestVersion) {
|
|
67
|
+
throw new UpdateProcessError('升级后的 npm 包版本与目标版本不一致。', `read ${join(packageRoot, 'package.json')}`, JSON.stringify({
|
|
68
|
+
actualName: manifest.name,
|
|
69
|
+
actualVersion: manifest.version,
|
|
70
|
+
expectedName: packageName,
|
|
71
|
+
expectedVersion: latestVersion,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await readFile(join(packageRoot, 'skills', 'monkeys', 'SKILL.md'), 'utf8');
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new UpdateProcessError('升级后的 npm 包缺少 monkeys Skill。', `read ${join(packageRoot, 'skills', 'monkeys', 'SKILL.md')}`, error instanceof Error ? error.message : String(error));
|
|
79
|
+
}
|
|
80
|
+
const skillsResult = runner('npx', ['-y', 'skills', 'add', join(packageRoot, 'skills'), '-y', '-g', '--copy']);
|
|
81
|
+
if (skillsResult.error || skillsResult.status !== 0) {
|
|
82
|
+
return {
|
|
83
|
+
currentVersion: latestVersion,
|
|
84
|
+
packageRoot,
|
|
85
|
+
skillsAction: 'failed',
|
|
86
|
+
skillsWarning: `CLI 已升级,但 Skill 同步失败:${processDetail(skillsResult) || skillsResult.error?.message || 'unknown failure'}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return { currentVersion: latestVersion, packageRoot, skillsAction: 'synced' };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/update/updater.ts"],"names":[],"mappings":"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"}
|
package/oclif.manifest.json
CHANGED
|
@@ -8790,6 +8790,10 @@
|
|
|
8790
8790
|
"hasDynamicHelp": false,
|
|
8791
8791
|
"multiple": true,
|
|
8792
8792
|
"name": "expected-surface",
|
|
8793
|
+
"options": [
|
|
8794
|
+
"studio",
|
|
8795
|
+
"kernel"
|
|
8796
|
+
],
|
|
8793
8797
|
"summary": "预期认证 Surface,可重复",
|
|
8794
8798
|
"type": "option"
|
|
8795
8799
|
},
|
|
@@ -9112,6 +9116,10 @@
|
|
|
9112
9116
|
"hasDynamicHelp": false,
|
|
9113
9117
|
"multiple": true,
|
|
9114
9118
|
"name": "expected-surface",
|
|
9119
|
+
"options": [
|
|
9120
|
+
"studio",
|
|
9121
|
+
"kernel"
|
|
9122
|
+
],
|
|
9115
9123
|
"summary": "新的预期认证 Surface,可重复",
|
|
9116
9124
|
"type": "option"
|
|
9117
9125
|
},
|
|
@@ -9206,6 +9214,55 @@
|
|
|
9206
9214
|
],
|
|
9207
9215
|
"strict": true
|
|
9208
9216
|
},
|
|
9217
|
+
"update": {
|
|
9218
|
+
"aliases": [],
|
|
9219
|
+
"args": {},
|
|
9220
|
+
"description": "检查或安装最新版本的 monkeys CLI,并同步同版本 Skill。",
|
|
9221
|
+
"enableJsonFlag": false,
|
|
9222
|
+
"examples": [
|
|
9223
|
+
"<%= config.bin %> update --check --output json",
|
|
9224
|
+
"<%= config.bin %> update"
|
|
9225
|
+
],
|
|
9226
|
+
"flags": {
|
|
9227
|
+
"check": {
|
|
9228
|
+
"allowNo": false,
|
|
9229
|
+
"name": "check",
|
|
9230
|
+
"summary": "只检查更新,不执行安装",
|
|
9231
|
+
"type": "boolean"
|
|
9232
|
+
},
|
|
9233
|
+
"force": {
|
|
9234
|
+
"allowNo": false,
|
|
9235
|
+
"name": "force",
|
|
9236
|
+
"summary": "即使已是最新版本也重新安装 CLI 与 Skill",
|
|
9237
|
+
"type": "boolean"
|
|
9238
|
+
},
|
|
9239
|
+
"output": {
|
|
9240
|
+
"default": "text",
|
|
9241
|
+
"hasDynamicHelp": false,
|
|
9242
|
+
"multiple": false,
|
|
9243
|
+
"name": "output",
|
|
9244
|
+
"options": [
|
|
9245
|
+
"json",
|
|
9246
|
+
"text"
|
|
9247
|
+
],
|
|
9248
|
+
"summary": "输出格式",
|
|
9249
|
+
"type": "option"
|
|
9250
|
+
}
|
|
9251
|
+
},
|
|
9252
|
+
"hasDynamicHelp": false,
|
|
9253
|
+
"hiddenAliases": [],
|
|
9254
|
+
"id": "update",
|
|
9255
|
+
"isESM": true,
|
|
9256
|
+
"pluginAlias": "@inf-monkeys-tech/monkeys-cli",
|
|
9257
|
+
"pluginName": "@inf-monkeys-tech/monkeys-cli",
|
|
9258
|
+
"pluginType": "core",
|
|
9259
|
+
"relativePath": [
|
|
9260
|
+
"dist",
|
|
9261
|
+
"commands",
|
|
9262
|
+
"update.js"
|
|
9263
|
+
],
|
|
9264
|
+
"strict": true
|
|
9265
|
+
},
|
|
9209
9266
|
"version:check": {
|
|
9210
9267
|
"aliases": [],
|
|
9211
9268
|
"args": {},
|
|
@@ -9322,7 +9379,7 @@
|
|
|
9322
9379
|
"multiple": false,
|
|
9323
9380
|
"name": "profile",
|
|
9324
9381
|
"required": true,
|
|
9325
|
-
"summary": "
|
|
9382
|
+
"summary": "Studio Profile 名称",
|
|
9326
9383
|
"type": "option"
|
|
9327
9384
|
},
|
|
9328
9385
|
"refresh": {
|
|
@@ -9402,7 +9459,7 @@
|
|
|
9402
9459
|
"multiple": false,
|
|
9403
9460
|
"name": "profile",
|
|
9404
9461
|
"required": true,
|
|
9405
|
-
"summary": "
|
|
9462
|
+
"summary": "Studio Profile 名称",
|
|
9406
9463
|
"type": "option"
|
|
9407
9464
|
},
|
|
9408
9465
|
"refresh": {
|
|
@@ -9568,7 +9625,7 @@
|
|
|
9568
9625
|
"multiple": false,
|
|
9569
9626
|
"name": "profile",
|
|
9570
9627
|
"required": true,
|
|
9571
|
-
"summary": "
|
|
9628
|
+
"summary": "Studio Profile 名称",
|
|
9572
9629
|
"type": "option"
|
|
9573
9630
|
},
|
|
9574
9631
|
"refresh": {
|
|
@@ -9825,7 +9882,7 @@
|
|
|
9825
9882
|
"multiple": false,
|
|
9826
9883
|
"name": "profile",
|
|
9827
9884
|
"required": true,
|
|
9828
|
-
"summary": "
|
|
9885
|
+
"summary": "Studio Profile 名称",
|
|
9829
9886
|
"type": "option"
|
|
9830
9887
|
},
|
|
9831
9888
|
"refresh": {
|
|
@@ -9876,5 +9933,5 @@
|
|
|
9876
9933
|
"strict": true
|
|
9877
9934
|
}
|
|
9878
9935
|
},
|
|
9879
|
-
"version": "0.10.
|
|
9936
|
+
"version": "0.10.5"
|
|
9880
9937
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inf-monkeys-tech/monkeys-cli",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.5",
|
|
4
4
|
"packageManager": "bun@1.3.14",
|
|
5
5
|
"description": "面向 AI Agent、自动化和人工操作的 Monkeys 命令行客户端",
|
|
6
6
|
"type": "module",
|
|
@@ -37,10 +37,11 @@
|
|
|
37
37
|
"smoke:installer": "node ./scripts/install-wizard-smoke.mjs",
|
|
38
38
|
"smoke:npm": "node ./scripts/npm-install-smoke.mjs",
|
|
39
39
|
"smoke:standalone": "node ./scripts/standalone-smoke.mjs",
|
|
40
|
+
"smoke:update": "node ./scripts/update-notifier-smoke.mjs",
|
|
40
41
|
"test": "vitest run",
|
|
41
42
|
"test:watch": "vitest",
|
|
42
|
-
"verify": "bun run format:check && bun run lint && bun run test && bun run build && bun run version:smoke && bun run smoke:installer && bun run smoke:npm && bun run benchmark",
|
|
43
|
-
"version:smoke": "node ./
|
|
43
|
+
"verify": "bun run format:check && bun run lint && bun run test && bun run build && bun run version:smoke && bun run smoke:update && bun run smoke:installer && bun run smoke:npm && bun run benchmark",
|
|
44
|
+
"version:smoke": "node ./scripts/version-smoke.mjs"
|
|
44
45
|
},
|
|
45
46
|
"oclif": {
|
|
46
47
|
"bin": "monkeys",
|
|
@@ -86,5 +87,5 @@
|
|
|
86
87
|
"publishConfig": {
|
|
87
88
|
"access": "public"
|
|
88
89
|
},
|
|
89
|
-
"monkeysReleaseCommit": "
|
|
90
|
+
"monkeysReleaseCommit": "a1493b22df5e75a9a728f068a703b513dd968b95"
|
|
90
91
|
}
|
package/skills/monkeys/SKILL.md
CHANGED
|
@@ -9,7 +9,7 @@ description: 理解并通过 monkeys CLI 安全操作 Monkeys 平台的多租户
|
|
|
9
9
|
|
|
10
10
|
## 执行流程
|
|
11
11
|
|
|
12
|
-
1. 运行 `monkeys version show --output json`,确认 CLI 可用和命令 Schema
|
|
12
|
+
1. 运行 `monkeys version show --output json`,确认 CLI 可用和命令 Schema 兼容。若输出包含 `_notice.update`,向用户报告新版本和 `monkeys update`;只有用户明确同意升级后才执行该全局安装命令。
|
|
13
13
|
2. 选择明确的 `--profile`。Data 任务按[Data 视角路由](references/data-perspective.md)选择显式 `--perspective`:Kernel 全局读取默认不传 `--team`,只有用户明确筛选时才传;Field、View、Feature Value、Advanced Search 和 Asset Export 等需要数据资源定位时传已确认的 `--resource-team`。Studio 使用明确的 Team 上下文。不要在任务中途隐式切换上下文。
|
|
14
14
|
3. 在第一次使用命令或参数不确定时运行 `monkeys <命令> --help`。以 CLI 帮助为参数真相,不凭记忆补参数。
|
|
15
15
|
4. 优先调用 Workflow、Execution、Agent Work、File、Data、System Config 等语义命令,并使用 `--output json`。解析结构化结果和退出码,不解析面向人的 Text 文案。
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
- 本 Skill 面向命令 Schema Major `1`,最低 CLI 版本 `0.10.0`。
|
|
4
4
|
- 开始任务时运行 `monkeys version show --output json`。
|
|
5
|
+
- 任意结构化输出中的 `_notice.update` 表示 npm `latest` 高于当前 CLI;报告 `current`、`latest` 与 `command`。可用 `monkeys update --check --output json` 实时复核,只有用户明确授权后才运行 `monkeys update` 或 `monkeys update --force`。
|
|
6
|
+
- `monkeys update` 升级全局 npm 包后,从新包的全局安装目录同步同版本 `monkeys` Skill;若 CLI 已升级但 `skillsAction=failed`,报告警告并在用户同意后用 `monkeys update --force` 重试,不回滚或猜测 Skill 路径。
|
|
5
7
|
- CLI Major、命令 Schema Major 或 Skill 声明不兼容时停止写操作,升级匹配版本后再继续。
|
|
6
8
|
- OpenAPI Snapshot 可动态刷新,但语义命令合同不会因刷新而被静默改写。
|
|
7
9
|
- Data 合同由 Deployment 的 `data_contract=auto|ontology-v1|bucket-v1` 决定;`auto` 依次采用精确 OpenAPI、同一上下文缓存和有界只读探测。只有 Ontology 路由明确返回 404 时才探测旧 Bucket 路由。
|