@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 +19 -0
- package/dist/env.d.ts +6 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +47 -0
- package/dist/env.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +52 -0
- package/dist/main.js.map +1 -0
- package/package.json +28 -0
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 @@
|
|
|
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
|
package/dist/env.js.map
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/main.js.map
ADDED
|
@@ -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
|
+
}
|