@ytinnovation/harness-cli 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @ytinnovation/harness-cli
2
+
3
+ Harness Kit 的命令行入口,安装后提供 `harness` 命令。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install -g @ytinnovation/harness-cli
9
+ ```
10
+
11
+ ## 常用命令
12
+
13
+ ```bash
14
+ harness version
15
+ harness init --mode template-match --dry-run
16
+ harness dashboard serve --port 4242
17
+ ```
18
+
19
+ `harness dashboard serve` 会从依赖的 `@ytinnovation/harness-core` 包内读取 dashboard 静态资源,不需要用户额外构建前端。
package/dist/env.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export interface ApplyHarnessCliEnvDefaultsOptions {
2
+ readonly env?: NodeJS.ProcessEnv;
3
+ readonly envPath?: string;
4
+ }
5
+ export declare function applyHarnessCliEnvDefaults(options?: ApplyHarnessCliEnvDefaultsOptions): void;
6
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,iCAAsC,GAAG,IAAI,CAWhG"}
package/dist/env.js ADDED
@@ -0,0 +1,47 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const DEFAULT_CLI_ENV_PATH = resolve(dirname(fileURLToPath(import.meta.url)), '../src/.env');
5
+ export function applyHarnessCliEnvDefaults(options = {}) {
6
+ const env = options.env ?? process.env;
7
+ if (env.HARNESS_SERVICE_URL?.trim()) {
8
+ return;
9
+ }
10
+ const defaultServiceUrl = env.HARNESS_DEFAULT_SERVICE_URL?.trim() || readHarnessDefaultServiceUrl(options.envPath ?? DEFAULT_CLI_ENV_PATH);
11
+ if (defaultServiceUrl) {
12
+ env.HARNESS_SERVICE_URL = defaultServiceUrl;
13
+ }
14
+ }
15
+ function readHarnessDefaultServiceUrl(envPath) {
16
+ try {
17
+ return parseHarnessDefaultServiceUrl(readFileSync(envPath, 'utf8'));
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ function parseHarnessDefaultServiceUrl(raw) {
24
+ for (const line of raw.split(/\r?\n/)) {
25
+ const trimmed = line.trim();
26
+ if (!trimmed || trimmed.startsWith('#')) {
27
+ continue;
28
+ }
29
+ const match = /^HARNESS_DEFAULT_SERVICE_URL\s*=\s*(.*)$/.exec(trimmed);
30
+ if (!match) {
31
+ continue;
32
+ }
33
+ return stripOptionalQuotes(match[1]?.trim() ?? '') || null;
34
+ }
35
+ return null;
36
+ }
37
+ function stripOptionalQuotes(value) {
38
+ if (value.length >= 2) {
39
+ const first = value[0];
40
+ const last = value[value.length - 1];
41
+ if ((first === '"' && last === '"') || (first === "'" && last === "'")) {
42
+ return value.slice(1, -1).trim();
43
+ }
44
+ }
45
+ return value;
46
+ }
47
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAOzC,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AAE7F,MAAM,UAAU,0BAA0B,CAAC,UAA6C,EAAE;IACxF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,IAAI,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,GACrB,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,IAAI,4BAA4B,CAAC,OAAO,CAAC,OAAO,IAAI,oBAAoB,CAAC,CAAC;IACnH,IAAI,iBAAiB,EAAE,CAAC;QACtB,GAAG,CAAC,mBAAmB,GAAG,iBAAiB,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,OAAO,6BAA6B,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAW;IAChD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
package/dist/main.js ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import { createHarnessTelemetryEvent, createKernel, reportHarnessTelemetryEvents } from '@ytinnovation/harness-core';
3
+ import { applyHarnessCliEnvDefaults } from './env.js';
4
+ try {
5
+ applyHarnessCliEnvDefaults();
6
+ const kernel = createKernel();
7
+ kernel.router.register('version', () => {
8
+ console.log(kernel.version);
9
+ return 0;
10
+ });
11
+ const commandArgs = process.argv.slice(2);
12
+ const startedAt = Date.now();
13
+ const result = await kernel.router.dispatch(commandArgs);
14
+ const durationMs = Date.now() - startedAt;
15
+ if (result.message) {
16
+ if (result.exitCode === 0) {
17
+ console.log(result.message);
18
+ }
19
+ else {
20
+ console.error(result.message);
21
+ }
22
+ }
23
+ reportHarnessTelemetryEvents([
24
+ createHarnessTelemetryEvent(result.exitCode === 0 ? 'cli.command.completed' : 'cli.command.failed', {
25
+ source: 'cli',
26
+ command: commandArgs.join(' ').trim() || '__root__',
27
+ success: result.exitCode === 0,
28
+ duration_ms: durationMs,
29
+ error_code: result.exitCode === 0 ? undefined : 'CLI_COMMAND_FAILED',
30
+ payload: {
31
+ argv: commandArgs,
32
+ },
33
+ }),
34
+ ]);
35
+ process.exitCode = result.exitCode;
36
+ }
37
+ catch (err) {
38
+ reportHarnessTelemetryEvents([
39
+ createHarnessTelemetryEvent('cli.command.failed', {
40
+ source: 'cli',
41
+ command: process.argv.slice(2).join(' ').trim() || '__root__',
42
+ success: false,
43
+ error_code: 'CLI_FATAL_ERROR',
44
+ payload: {
45
+ message: err instanceof Error ? err.message : String(err),
46
+ },
47
+ }),
48
+ ]);
49
+ console.error('致命错误:', err instanceof Error ? err.message : err);
50
+ process.exitCode = 1;
51
+ }
52
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,2BAA2B,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AACrH,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAEtD,IAAI,CAAC;IACH,0BAA0B,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,4BAA4B,CAAC;QAC3B,2BAA2B,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,EAAE;YAClG,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,UAAU;YACnD,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC;YAC9B,WAAW,EAAE,UAAU;YACvB,UAAU,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB;YACpE,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;aAClB;SACF,CAAC;KACH,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACrC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,4BAA4B,CAAC;QAC3B,2BAA2B,CAAC,oBAAoB,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,UAAU;YAC7D,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,iBAAiB;YAC7B,OAAO,EAAE;gBACP,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1D;SACF,CAAC;KACH,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@ytinnovation/harness-cli",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "description": "Command line interface for Harness Kit.",
6
+ "bin": {
7
+ "harness": "./dist/main.js"
8
+ },
9
+ "dependencies": {
10
+ "@ytinnovation/harness-core": "0.0.0"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc -p tsconfig.json",
14
+ "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
15
+ "typecheck": "tsc -p tsconfig.json --noEmit"
16
+ },
17
+ "files": [
18
+ "dist/**/*",
19
+ "README.md"
20
+ ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^22.10.0",
26
+ "typescript": "~5.7.2"
27
+ }
28
+ }