@ytinnovation/harness-core 0.0.3 → 0.1.1

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.
Files changed (89) hide show
  1. package/dist/assets/publish.d.ts +86 -0
  2. package/dist/assets/publish.d.ts.map +1 -0
  3. package/dist/assets/publish.js +305 -0
  4. package/dist/assets/publish.js.map +1 -0
  5. package/dist/cli-version/command.d.ts +12 -0
  6. package/dist/cli-version/command.d.ts.map +1 -0
  7. package/dist/cli-version/command.js +142 -0
  8. package/dist/cli-version/command.js.map +1 -0
  9. package/dist/cli-version/compare-versions.d.ts +6 -0
  10. package/dist/cli-version/compare-versions.d.ts.map +1 -0
  11. package/dist/cli-version/compare-versions.js +29 -0
  12. package/dist/cli-version/compare-versions.js.map +1 -0
  13. package/dist/cli-version/detect-install-context.d.ts +9 -0
  14. package/dist/cli-version/detect-install-context.d.ts.map +1 -0
  15. package/dist/cli-version/detect-install-context.js +37 -0
  16. package/dist/cli-version/detect-install-context.js.map +1 -0
  17. package/dist/cli-version/fetch-npm-latest.d.ts +6 -0
  18. package/dist/cli-version/fetch-npm-latest.d.ts.map +1 -0
  19. package/dist/cli-version/fetch-npm-latest.js +43 -0
  20. package/dist/cli-version/fetch-npm-latest.js.map +1 -0
  21. package/dist/cli-version/maybe-check-cli-update.d.ts +26 -0
  22. package/dist/cli-version/maybe-check-cli-update.d.ts.map +1 -0
  23. package/dist/cli-version/maybe-check-cli-update.js +80 -0
  24. package/dist/cli-version/maybe-check-cli-update.js.map +1 -0
  25. package/dist/cli-version/prompt.d.ts +13 -0
  26. package/dist/cli-version/prompt.d.ts.map +1 -0
  27. package/dist/cli-version/prompt.js +45 -0
  28. package/dist/cli-version/prompt.js.map +1 -0
  29. package/dist/cli-version/read-installed-version.d.ts +2 -0
  30. package/dist/cli-version/read-installed-version.d.ts.map +1 -0
  31. package/dist/cli-version/read-installed-version.js +16 -0
  32. package/dist/cli-version/read-installed-version.js.map +1 -0
  33. package/dist/cli-version/resolve-npm-registry.d.ts +2 -0
  34. package/dist/cli-version/resolve-npm-registry.d.ts.map +1 -0
  35. package/dist/cli-version/resolve-npm-registry.js +15 -0
  36. package/dist/cli-version/resolve-npm-registry.js.map +1 -0
  37. package/dist/cli-version/self-update.d.ts +12 -0
  38. package/dist/cli-version/self-update.d.ts.map +1 -0
  39. package/dist/cli-version/self-update.js +33 -0
  40. package/dist/cli-version/self-update.js.map +1 -0
  41. package/dist/config/command.d.ts +2 -0
  42. package/dist/config/command.d.ts.map +1 -1
  43. package/dist/config/command.js +57 -46
  44. package/dist/config/command.js.map +1 -1
  45. package/dist/index.d.ts +5 -5
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +3 -2
  48. package/dist/index.js.map +1 -1
  49. package/dist/kernel/create.d.ts.map +1 -1
  50. package/dist/kernel/create.js +4 -1
  51. package/dist/kernel/create.js.map +1 -1
  52. package/dist/mcp/command.d.ts +6 -0
  53. package/dist/mcp/command.d.ts.map +1 -1
  54. package/dist/mcp/command.js +17 -0
  55. package/dist/mcp/command.js.map +1 -1
  56. package/dist/mcp/publish-config.d.ts +5 -0
  57. package/dist/mcp/publish-config.d.ts.map +1 -0
  58. package/dist/mcp/publish-config.js +38 -0
  59. package/dist/mcp/publish-config.js.map +1 -0
  60. package/dist/rule/command.d.ts +6 -0
  61. package/dist/rule/command.d.ts.map +1 -1
  62. package/dist/rule/command.js +17 -0
  63. package/dist/rule/command.js.map +1 -1
  64. package/dist/rule/publish-config.d.ts +5 -0
  65. package/dist/rule/publish-config.d.ts.map +1 -0
  66. package/dist/rule/publish-config.js +33 -0
  67. package/dist/rule/publish-config.js.map +1 -0
  68. package/dist/skills/command.d.ts +8 -5
  69. package/dist/skills/command.d.ts.map +1 -1
  70. package/dist/skills/command.js +47 -333
  71. package/dist/skills/command.js.map +1 -1
  72. package/dist/skills/install.d.ts +3 -0
  73. package/dist/skills/install.d.ts.map +1 -1
  74. package/dist/skills/install.js +16 -3
  75. package/dist/skills/install.js.map +1 -1
  76. package/dist/skills/providers/harness-service.d.ts.map +1 -1
  77. package/dist/skills/providers/harness-service.js +12 -3
  78. package/dist/skills/providers/harness-service.js.map +1 -1
  79. package/dist/skills/publish-config.d.ts +5 -0
  80. package/dist/skills/publish-config.d.ts.map +1 -0
  81. package/dist/skills/publish-config.js +33 -0
  82. package/dist/skills/publish-config.js.map +1 -0
  83. package/dist/skills/publish.d.ts +1 -1
  84. package/dist/skills/publish.d.ts.map +1 -1
  85. package/dist/skills/publish.js +3 -21
  86. package/dist/skills/publish.js.map +1 -1
  87. package/dist/skills/types.d.ts +3 -55
  88. package/dist/skills/types.d.ts.map +1 -1
  89. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ export interface AssetPublishManifest {
2
+ name: string;
3
+ version: string;
4
+ description: string;
5
+ entrypoint: string;
6
+ tags: string[];
7
+ author?: string;
8
+ repository?: string;
9
+ managedBy?: string;
10
+ }
11
+ export interface AssetPublishArgs {
12
+ manifestPath: string;
13
+ }
14
+ export interface GitIdentity {
15
+ name: string | null;
16
+ email: string | null;
17
+ }
18
+ export type HarnessServiceAssetType = 'skill' | 'rule' | 'mcp_config';
19
+ export interface PublishContentInput {
20
+ manifestRaw: string;
21
+ entryRaw: string;
22
+ manifest: AssetPublishManifest;
23
+ }
24
+ export interface AssetPublishHelpConfig {
25
+ assetLabel: string;
26
+ commandName: string;
27
+ defaultTargetDir: string;
28
+ entrypointExample: string;
29
+ directoryExample: string[];
30
+ extraNotes?: string[];
31
+ }
32
+ export interface ServiceManifestPublishConfig {
33
+ assetType: HarnessServiceAssetType;
34
+ assetLabel: string;
35
+ metadataSource: string;
36
+ targetPath: (name: string) => string;
37
+ buildContent: (input: PublishContentInput) => string;
38
+ validateEntry?: (entryRaw: string) => void | Promise<void>;
39
+ errorCodes: {
40
+ invalidArgs: string;
41
+ missingGitIdentity: string;
42
+ missingServiceUrl: string;
43
+ serviceFailed: string;
44
+ };
45
+ renderHelp: (programName?: string) => string;
46
+ successTitle: string;
47
+ invalidArgsTitle: string;
48
+ failureTitle: string;
49
+ }
50
+ export interface RunServiceManifestPublishOptions {
51
+ publishTail: string[];
52
+ workspaceRoot?: string;
53
+ json?: boolean;
54
+ resolveGitIdentity?: (cwd: string) => Promise<GitIdentity>;
55
+ fetchImpl?: typeof fetch;
56
+ baseUrl?: string;
57
+ config: ServiceManifestPublishConfig;
58
+ }
59
+ export declare function resolveLocalGitIdentity(cwd: string): Promise<GitIdentity>;
60
+ export declare function normalizeAssetPublishManifest(candidate: unknown): AssetPublishManifest | null;
61
+ export declare function readAssetPublishManifest(manifestPath: string, assetLabel: string): Promise<AssetPublishManifest>;
62
+ export declare function parseAssetPublishArgs(args: string[]): AssetPublishArgs | null;
63
+ export declare function resolveEntrypointPath(manifestPath: string, entrypoint: string): string;
64
+ export declare function readManifestEntrypointFiles(manifestPath: string, manifest: AssetPublishManifest): Promise<PublishContentInput>;
65
+ export declare function buildSkillPublishContent(input: PublishContentInput): string;
66
+ export declare function buildRawEntrypointContent(input: PublishContentInput): string;
67
+ export declare function publishAssetToHarnessService(args: {
68
+ baseUrl: string;
69
+ assetType: HarnessServiceAssetType;
70
+ manifest: AssetPublishManifest;
71
+ content: string;
72
+ authorName: string;
73
+ authorEmail: string;
74
+ metadata: {
75
+ source: string;
76
+ targetPath: string;
77
+ manifest: AssetPublishManifest;
78
+ };
79
+ fetchImpl?: typeof fetch;
80
+ serviceFailedCode?: string;
81
+ assetLabel?: string;
82
+ }): Promise<unknown>;
83
+ export declare function renderAssetPublishHelp(programName: string, config: AssetPublishHelpConfig): string;
84
+ export declare function renderGitIdentitySuggestions(): string[];
85
+ export declare function runServiceManifestPublish(options: RunServiceManifestPublishOptions): Promise<number>;
86
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/assets/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, join } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { HarnessError } from '../contracts/errors.js';
6
+ import { resolveHarnessServiceBaseUrl } from '../cloud/harness-service-url.js';
7
+ import { renderErrorBlock, renderJson, renderSuccessBlock, renderWarningBlock } from '../cli-output/renderers.js';
8
+ const execFileAsync = promisify(execFile);
9
+ async function readGitConfigValue(cwd, key, scope) {
10
+ const args = scope === '--local'
11
+ ? ['-C', cwd, 'config', '--local', '--get', key]
12
+ : ['-C', cwd, 'config', '--get', key];
13
+ try {
14
+ const { stdout } = await execFileAsync('git', args, {
15
+ timeout: 2_000,
16
+ });
17
+ const value = stdout.trim();
18
+ return value.length > 0 ? value : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ export async function resolveLocalGitIdentity(cwd) {
25
+ const [localName, localEmail] = await Promise.all([
26
+ readGitConfigValue(cwd, 'user.name', '--local'),
27
+ readGitConfigValue(cwd, 'user.email', '--local'),
28
+ ]);
29
+ const [name, email] = await Promise.all([
30
+ localName === null ? readGitConfigValue(cwd, 'user.name', 'effective') : Promise.resolve(localName),
31
+ localEmail === null ? readGitConfigValue(cwd, 'user.email', 'effective') : Promise.resolve(localEmail),
32
+ ]);
33
+ return { name, email };
34
+ }
35
+ export function normalizeAssetPublishManifest(candidate) {
36
+ if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
37
+ return null;
38
+ }
39
+ const value = candidate;
40
+ const name = typeof value.name === 'string' ? value.name.trim() : '';
41
+ const version = typeof value.version === 'string' ? value.version.trim() : '';
42
+ const description = typeof value.description === 'string' ? value.description.trim() : '';
43
+ const entrypoint = typeof value.entrypoint === 'string' ? value.entrypoint.trim() : '';
44
+ const tags = Array.isArray(value.tags) ? value.tags.filter((tag) => typeof tag === 'string') : [];
45
+ if (!name || !version || !description || !entrypoint) {
46
+ return null;
47
+ }
48
+ const manifest = {
49
+ name,
50
+ version,
51
+ description,
52
+ entrypoint,
53
+ tags,
54
+ };
55
+ if (typeof value.author === 'string' && value.author.trim()) {
56
+ manifest.author = value.author.trim();
57
+ }
58
+ if (typeof value.repository === 'string' && value.repository.trim()) {
59
+ manifest.repository = value.repository.trim();
60
+ }
61
+ if (value.managedBy === 'harness') {
62
+ manifest.managedBy = 'harness';
63
+ }
64
+ return manifest;
65
+ }
66
+ export async function readAssetPublishManifest(manifestPath, assetLabel) {
67
+ let raw;
68
+ try {
69
+ raw = await readFile(manifestPath, 'utf8');
70
+ }
71
+ catch (error) {
72
+ if (error.code === 'ENOENT') {
73
+ throw new Error(`Missing ${assetLabel} manifest at ${manifestPath}.`);
74
+ }
75
+ throw error;
76
+ }
77
+ let parsed;
78
+ try {
79
+ parsed = JSON.parse(raw);
80
+ }
81
+ catch {
82
+ throw new Error(`Invalid JSON in ${assetLabel} manifest: ${manifestPath}.`);
83
+ }
84
+ const manifest = normalizeAssetPublishManifest(parsed);
85
+ if (!manifest) {
86
+ throw new Error(`Invalid ${assetLabel} manifest shape at ${manifestPath}.`);
87
+ }
88
+ return manifest;
89
+ }
90
+ export function parseAssetPublishArgs(args) {
91
+ const out = {
92
+ manifestPath: '',
93
+ };
94
+ for (let i = 0; i < args.length; i += 1) {
95
+ const token = args[i];
96
+ const value = args[i + 1];
97
+ if (!token?.startsWith('--') || !value) {
98
+ return null;
99
+ }
100
+ if (token === '--manifest') {
101
+ out.manifestPath = value;
102
+ }
103
+ else {
104
+ return null;
105
+ }
106
+ i += 1;
107
+ }
108
+ if (!out.manifestPath) {
109
+ return null;
110
+ }
111
+ return out;
112
+ }
113
+ export function resolveEntrypointPath(manifestPath, entrypoint) {
114
+ const packageRoot = dirname(manifestPath);
115
+ const normalizedEntrypoint = entrypoint.replace(/\\/g, '/').replace(/^\.\//, '');
116
+ return join(packageRoot, ...normalizedEntrypoint.split('/'));
117
+ }
118
+ export async function readManifestEntrypointFiles(manifestPath, manifest) {
119
+ const entrypointPath = resolveEntrypointPath(manifestPath, manifest.entrypoint);
120
+ const [manifestRaw, entryRaw] = await Promise.all([
121
+ readFile(manifestPath, 'utf8'),
122
+ readFile(entrypointPath, 'utf8'),
123
+ ]);
124
+ return { manifestRaw, entryRaw, manifest };
125
+ }
126
+ export function buildSkillPublishContent(input) {
127
+ return [
128
+ '# Skill Package',
129
+ '',
130
+ '## manifest.json',
131
+ '```json',
132
+ input.manifestRaw.trim(),
133
+ '```',
134
+ '',
135
+ `## ${input.manifest.entrypoint}`,
136
+ '```markdown',
137
+ input.entryRaw.trim(),
138
+ '```',
139
+ ].join('\n');
140
+ }
141
+ export function buildRawEntrypointContent(input) {
142
+ return input.entryRaw.trim();
143
+ }
144
+ export async function publishAssetToHarnessService(args) {
145
+ const fetchImpl = args.fetchImpl ?? fetch;
146
+ const response = await fetchImpl(`${args.baseUrl}/assets`, {
147
+ method: 'POST',
148
+ headers: { 'content-type': 'application/json' },
149
+ body: JSON.stringify({
150
+ type: args.assetType,
151
+ name: args.manifest.name,
152
+ version: args.manifest.version,
153
+ content: args.content,
154
+ description: args.manifest.description,
155
+ tags: args.manifest.tags,
156
+ createdBy: `${args.authorName} <${args.authorEmail}>`,
157
+ metadata: args.metadata,
158
+ }),
159
+ });
160
+ const text = await response.text();
161
+ const body = text ? JSON.parse(text) : null;
162
+ if (!response.ok) {
163
+ throw new HarnessError(args.serviceFailedCode ?? 'ASSET_PUBLISH_SERVICE_FAILED', `harness-service ${args.assetLabel ?? args.assetType} publish failed with HTTP ${response.status}: ${text || response.statusText}`);
164
+ }
165
+ return body;
166
+ }
167
+ export function renderAssetPublishHelp(programName, config) {
168
+ const lines = [
169
+ `发布 ${config.assetLabel} 到企业资产库,进入审核流程。`,
170
+ '',
171
+ '用法:',
172
+ ` ${programName} ${config.commandName} publish --manifest <path> [--json]`,
173
+ '',
174
+ '参数:',
175
+ ' --manifest <path> 资产清单 JSON 路径(必填)',
176
+ ' --json 机器可读 JSON 输出',
177
+ '',
178
+ '发布前准备:',
179
+ ' 1. manifest.json 与 entrypoint 文件放在同一目录',
180
+ ' 2. 配置 Git 身份:git config --global user.name / user.email(或当前仓库 --local)',
181
+ '',
182
+ 'manifest.json 格式:',
183
+ ' {',
184
+ ' "name": "example-name",',
185
+ ' "version": "1.0.0",',
186
+ ' "description": "资产简介",',
187
+ ` "entrypoint": "${config.entrypointExample}",`,
188
+ ' "tags": ["tag-a"]',
189
+ ' }',
190
+ '',
191
+ ' 必填字段:name、version、description、entrypoint、tags',
192
+ ' 可选字段:author、repository、managedBy',
193
+ '',
194
+ '目录示例:',
195
+ ...config.directoryExample.map((line) => ` ${line}`),
196
+ '',
197
+ '企业发布:',
198
+ ' 配置 HARNESS_SERVICE_URL 后上传到 harness-service,由 Admin Console 审核。',
199
+ ` 默认安装路径:${config.defaultTargetDir}`,
200
+ ];
201
+ if (config.extraNotes?.length) {
202
+ lines.push('', ...config.extraNotes);
203
+ }
204
+ return lines.join('\n');
205
+ }
206
+ export function renderGitIdentitySuggestions() {
207
+ return [
208
+ 'git config --global user.name "Your Name"',
209
+ 'git config --global user.email "you@example.com"',
210
+ '或在当前仓库设置:git config --local user.name / user.email',
211
+ ];
212
+ }
213
+ export async function runServiceManifestPublish(options) {
214
+ const { publishTail, config } = options;
215
+ const json = options.json ?? false;
216
+ const workspaceRoot = options.workspaceRoot ?? process.cwd();
217
+ if (publishTail.length === 0
218
+ || publishTail.includes('--help')
219
+ || publishTail.includes('-h')) {
220
+ console.log(config.renderHelp());
221
+ return 0;
222
+ }
223
+ const publishArgs = parseAssetPublishArgs(publishTail);
224
+ if (!publishArgs) {
225
+ console.error(renderErrorBlock({
226
+ title: config.invalidArgsTitle,
227
+ message: config.renderHelp(),
228
+ code: config.errorCodes.invalidArgs,
229
+ }));
230
+ return 1;
231
+ }
232
+ const serviceBaseUrl = options.baseUrl ?? resolveHarnessServiceBaseUrl();
233
+ if (!serviceBaseUrl) {
234
+ console.error(renderErrorBlock({
235
+ title: config.failureTitle,
236
+ message: 'HARNESS_SERVICE_URL is not configured.',
237
+ code: config.errorCodes.missingServiceUrl,
238
+ suggestions: ['export HARNESS_SERVICE_URL=https://harness-service.example.com'],
239
+ }));
240
+ return 1;
241
+ }
242
+ try {
243
+ const resolvedManifestPath = isAbsolute(publishArgs.manifestPath)
244
+ ? publishArgs.manifestPath
245
+ : join(workspaceRoot, publishArgs.manifestPath);
246
+ const manifest = await readAssetPublishManifest(resolvedManifestPath, config.assetLabel);
247
+ const gitIdentity = await (options.resolveGitIdentity ?? resolveLocalGitIdentity)(workspaceRoot);
248
+ if (!gitIdentity.name || !gitIdentity.email) {
249
+ throw new HarnessError(config.errorCodes.missingGitIdentity, `Missing Git identity. Configure user.name and user.email (local or global) before publishing a ${config.assetLabel}.`);
250
+ }
251
+ const entryFiles = await readManifestEntrypointFiles(resolvedManifestPath, manifest);
252
+ if (config.validateEntry) {
253
+ await config.validateEntry(entryFiles.entryRaw);
254
+ }
255
+ const serviceResult = await publishAssetToHarnessService({
256
+ baseUrl: serviceBaseUrl,
257
+ assetType: config.assetType,
258
+ manifest,
259
+ content: config.buildContent(entryFiles),
260
+ authorName: gitIdentity.name,
261
+ authorEmail: gitIdentity.email,
262
+ metadata: {
263
+ source: config.metadataSource,
264
+ targetPath: config.targetPath(manifest.name),
265
+ manifest,
266
+ },
267
+ fetchImpl: options.fetchImpl,
268
+ serviceFailedCode: config.errorCodes.serviceFailed,
269
+ assetLabel: config.assetLabel,
270
+ });
271
+ const payload = {
272
+ status: 'uploaded',
273
+ serviceUrl: serviceBaseUrl,
274
+ review: 'admin-console',
275
+ result: serviceResult,
276
+ };
277
+ console.log(json ? renderJson(payload) : renderSuccessBlock(config.successTitle, [
278
+ ['服务地址', serviceBaseUrl],
279
+ ['审核入口', 'Admin Console'],
280
+ ['结果', JSON.stringify(serviceResult)],
281
+ ]));
282
+ return 0;
283
+ }
284
+ catch (error) {
285
+ if (error instanceof HarnessError) {
286
+ console.error(renderErrorBlock({ title: config.failureTitle, message: error.message, code: error.code }));
287
+ if (error.code === config.errorCodes.missingGitIdentity) {
288
+ console.error(renderWarningBlock('需要配置 Git 身份', [], renderGitIdentitySuggestions()));
289
+ }
290
+ return 1;
291
+ }
292
+ const message = error instanceof Error ? error.message : String(error);
293
+ if (message.includes('Missing Git identity')) {
294
+ console.error(renderErrorBlock({
295
+ title: config.failureTitle,
296
+ message,
297
+ suggestions: renderGitIdentitySuggestions(),
298
+ }));
299
+ return 1;
300
+ }
301
+ console.error(renderErrorBlock({ title: config.failureTitle, message }));
302
+ return 1;
303
+ }
304
+ }
305
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/assets/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CommandRouter } from '../kernel/router.js';
2
+ import { fetchHarnessCliLatestVersion } from './fetch-npm-latest.js';
3
+ import { detectCliInstallContext } from './detect-install-context.js';
4
+ import { runHarnessCliSelfUpdateSync } from './self-update.js';
5
+ export interface VersionCommandOptions {
6
+ readonly fetchLatestImpl?: typeof fetchHarnessCliLatestVersion;
7
+ readonly detectInstallContextImpl?: typeof detectCliInstallContext;
8
+ readonly runSelfUpdateSyncImpl?: typeof runHarnessCliSelfUpdateSync;
9
+ }
10
+ export declare function runVersionCommand(args: string[], options?: VersionCommandOptions): Promise<number>;
11
+ export declare function registerVersionCommand(router: CommandRouter): void;
12
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/cli-version/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,4BAA4B,CAAC;IAC/D,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,uBAAuB,CAAC;IACnE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,2BAA2B,CAAC;CACrE;AAwDD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CA0GjB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAElE"}
@@ -0,0 +1,142 @@
1
+ import { HarnessError } from '../contracts/errors.js';
2
+ import { renderErrorBlock, renderJson } from '../cli-output/renderers.js';
3
+ import { readInstalledCliVersion } from './read-installed-version.js';
4
+ import { fetchHarnessCliLatestVersion } from './fetch-npm-latest.js';
5
+ import { isNewerSemver3 } from './compare-versions.js';
6
+ import { detectCliInstallContext } from './detect-install-context.js';
7
+ import { runHarnessCliSelfUpdateSync } from './self-update.js';
8
+ function parseVersionArgs(args) {
9
+ let showHelp = false;
10
+ let check = false;
11
+ let upgrade = false;
12
+ let json = false;
13
+ for (const arg of args) {
14
+ if (arg === '--help' || arg === '-h') {
15
+ showHelp = true;
16
+ continue;
17
+ }
18
+ if (arg === '--check') {
19
+ check = true;
20
+ continue;
21
+ }
22
+ if (arg === '--upgrade') {
23
+ upgrade = true;
24
+ continue;
25
+ }
26
+ if (arg === '--json') {
27
+ json = true;
28
+ continue;
29
+ }
30
+ throw new HarnessError('VERSION_INVALID_ARGS', `未知的 version 选项: ${arg}`);
31
+ }
32
+ return { showHelp, check, upgrade, json };
33
+ }
34
+ function renderVersionHelp(programName = 'harness') {
35
+ return [
36
+ '查看 CLI 版本或检查 npm 上的最新版本。',
37
+ '',
38
+ '用法:',
39
+ ` ${programName} version`,
40
+ ` ${programName} version --check`,
41
+ ` ${programName} version --check --json`,
42
+ ` ${programName} version --upgrade`,
43
+ '',
44
+ '选项:',
45
+ ' --check 查询 registry 上的 latest 并与当前安装版本比较',
46
+ ' --upgrade 跳过确认,直接执行 npm 全局安装最新 CLI',
47
+ ' --json 与 --check 联用,输出 JSON',
48
+ ' -h, --help 查看帮助',
49
+ ].join('\n');
50
+ }
51
+ export async function runVersionCommand(args, options = {}) {
52
+ if (args.length === 0) {
53
+ console.log(readInstalledCliVersion());
54
+ return 0;
55
+ }
56
+ let parsed;
57
+ try {
58
+ parsed = parseVersionArgs(args);
59
+ }
60
+ catch (err) {
61
+ if (err instanceof HarnessError) {
62
+ console.error(renderErrorBlock({
63
+ title: 'version 参数错误',
64
+ message: err.message,
65
+ code: err.code,
66
+ suggestions: ['运行 harness version --help 查看可用选项。'],
67
+ }));
68
+ return 1;
69
+ }
70
+ throw err;
71
+ }
72
+ if (parsed.showHelp) {
73
+ console.log(renderVersionHelp());
74
+ return 0;
75
+ }
76
+ if (parsed.json && !parsed.check) {
77
+ console.error(renderErrorBlock({
78
+ title: 'version 参数错误',
79
+ message: '--json 仅能与 --check 一起使用。',
80
+ code: 'VERSION_INVALID_ARGS',
81
+ suggestions: ['例如:harness version --check --json'],
82
+ }));
83
+ return 1;
84
+ }
85
+ if (parsed.upgrade && parsed.check) {
86
+ console.error(renderErrorBlock({
87
+ title: 'version 参数错误',
88
+ message: '--upgrade 不能与 --check 同时使用。',
89
+ code: 'VERSION_INVALID_ARGS',
90
+ suggestions: ['分别执行 harness version --upgrade 或 harness version --check。'],
91
+ }));
92
+ return 1;
93
+ }
94
+ const fetchLatest = options.fetchLatestImpl ?? fetchHarnessCliLatestVersion;
95
+ const detectCtx = options.detectInstallContextImpl ?? detectCliInstallContext;
96
+ const runSelfUpdate = options.runSelfUpdateSyncImpl ?? runHarnessCliSelfUpdateSync;
97
+ if (parsed.upgrade) {
98
+ const ctx = detectCtx(process.argv[1]);
99
+ if (ctx.kind === 'dev-checkout') {
100
+ console.error(renderErrorBlock({
101
+ title: '无法自更新',
102
+ message: '当前为仓库内开发安装,不支持 harness version --upgrade。',
103
+ code: 'VERSION_SELF_UPDATE_UNSUPPORTED',
104
+ suggestions: ['在发布环境使用 npm 全局安装后再执行 --upgrade。'],
105
+ }));
106
+ return 1;
107
+ }
108
+ if (ctx.kind === 'npx') {
109
+ console.error(renderErrorBlock({
110
+ title: '无法自更新',
111
+ message: '当前通过 npx 运行,不支持 harness version --upgrade。',
112
+ code: 'VERSION_SELF_UPDATE_UNSUPPORTED',
113
+ suggestions: ['请先执行 npm install -g @ytinnovation/harness-cli@latest'],
114
+ }));
115
+ return 1;
116
+ }
117
+ const code = runSelfUpdate();
118
+ return code === 0 ? 0 : 1;
119
+ }
120
+ if (parsed.check) {
121
+ const current = readInstalledCliVersion();
122
+ const latest = await fetchLatest({});
123
+ const updateAvailable = Boolean(latest && isNewerSemver3(latest, current));
124
+ if (parsed.json) {
125
+ console.log(renderJson({
126
+ current,
127
+ latest: latest ?? null,
128
+ updateAvailable,
129
+ }));
130
+ return 0;
131
+ }
132
+ console.log(`当前版本:${current}`);
133
+ console.log(`registry latest:${latest ?? '(查询失败或超时)'}`);
134
+ console.log(`可更新:${updateAvailable ? '是' : '否'}`);
135
+ return 0;
136
+ }
137
+ return 0;
138
+ }
139
+ export function registerVersionCommand(router) {
140
+ router.register('version', (argv) => runVersionCommand(argv));
141
+ }
142
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/cli-version/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** 与发布脚本一致的 `major.minor.patch` 三元组比较(不含 prerelease)。 */
2
+ export declare function parseSemver3(version: string): readonly [number, number, number] | null;
3
+ /** 负数表示 a < b,0 相等,正数 a > b;任一方无法解析时返回 0(视为不可比较)。 */
4
+ export declare function compareSemver3(a: string, b: string): number;
5
+ export declare function isNewerSemver3(latest: string, installed: string): boolean;
6
+ //# sourceMappingURL=compare-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-versions.d.ts","sourceRoot":"","sources":["../../src/cli-version/compare-versions.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAMtF;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAe3D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzE"}
@@ -0,0 +1,29 @@
1
+ /** 与发布脚本一致的 `major.minor.patch` 三元组比较(不含 prerelease)。 */
2
+ export function parseSemver3(version) {
3
+ const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(version.trim());
4
+ if (!match) {
5
+ return null;
6
+ }
7
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
8
+ }
9
+ /** 负数表示 a < b,0 相等,正数 a > b;任一方无法解析时返回 0(视为不可比较)。 */
10
+ export function compareSemver3(a, b) {
11
+ const pa = parseSemver3(a);
12
+ const pb = parseSemver3(b);
13
+ if (!pa || !pb) {
14
+ return 0;
15
+ }
16
+ for (let i = 0; i < 3; i += 1) {
17
+ if (pa[i] < pb[i]) {
18
+ return -1;
19
+ }
20
+ if (pa[i] > pb[i]) {
21
+ return 1;
22
+ }
23
+ }
24
+ return 0;
25
+ }
26
+ export function isNewerSemver3(latest, installed) {
27
+ return compareSemver3(latest, installed) > 0;
28
+ }
29
+ //# sourceMappingURL=compare-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-versions.js","sourceRoot":"","sources":["../../src/cli-version/compare-versions.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC;QACD,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,SAAiB;IAC9D,OAAO,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type CliInstallKind = 'global' | 'npx' | 'dev-checkout';
2
+ export interface CliInstallContext {
3
+ readonly kind: CliInstallKind;
4
+ }
5
+ /**
6
+ * 判断当前 harness 进程的安装形态,用于决定是否尝试 `npm install -g` 自更新。
7
+ */
8
+ export declare function detectCliInstallContext(argv1?: string | undefined): CliInstallContext;
9
+ //# sourceMappingURL=detect-install-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-install-context.d.ts","sourceRoot":"","sources":["../../src/cli-version/detect-install-context.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,KAAK,GAAG,cAAc,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAyBD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,GAAE,MAAM,GAAG,SAA2B,GAC1C,iBAAiB,CAWnB"}