tuyoo-devflow 0.1.6 → 0.1.9

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/CHANGELOG.md CHANGED
@@ -6,6 +6,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.1.9] - 2026-04-22
10
+
11
+ ### Changed
12
+
13
+ - `agent doctor` 生成白名单失败 OA 报告时,外网 IP 会优先通过 `curl ip.sb` 自动获取,拿不到时再回落为 `待补充`。
14
+
15
+ ## [0.1.7] - 2026-04-22
16
+
17
+ ### Changed
18
+
19
+ - `agent doctor` 在网络白名单检查失败时,会额外生成仅包含失败项的 OA 申请报告,并写入 `~/.tuyoo-devflow/reports/doctor-whitelist-failures.txt`。
20
+
9
21
  ## [0.1.6] - 2026-04-13
10
22
 
11
23
  ### Added
package/README.md CHANGED
@@ -57,6 +57,7 @@ tdf agent doctor
57
57
 
58
58
  - 先展示当前系统信息
59
59
  - 再执行 doctor 检查并输出结果
60
+ - 若网络白名单存在未通过项,会额外输出一份 OA 申请格式报告,并写入 `~/.tuyoo-devflow/reports/doctor-whitelist-failures.txt`
60
61
  - 若存在缺失工具,提供可勾选的自动安装项
61
62
 
62
63
  安装模式:
@@ -7,7 +7,7 @@ import { checkRequiredTools } from "../../core/precheck/tools.js";
7
7
  import { collectSystemInfoResults } from "../../core/precheck/systemInfo.js";
8
8
  import { CheckReport } from "../../ui/CheckReport.js";
9
9
  import { renderOnce } from "../../ui/renderOnce.js";
10
- import { getFailedToolChecks, hasLinuxOrNetworkFailure, printCheckSummary, runDoctorChecks, } from "./shared.js";
10
+ import { getFailedToolChecks, hasLinuxOrNetworkFailure, printCheckSummary, printFailedWhitelistReport, runDoctorChecks, } from "./shared.js";
11
11
  export function registerDoctorCommand(agentCommand) {
12
12
  agentCommand
13
13
  .command("doctor")
@@ -33,6 +33,7 @@ export function registerDoctorCommand(agentCommand) {
33
33
  let checks = await runDoctorChecks(platform, jenkinsUrl);
34
34
  await printCheckSummary(checks);
35
35
  if (hasLinuxOrNetworkFailure(checks)) {
36
+ await printFailedWhitelistReport(checks);
36
37
  process.exitCode = 1;
37
38
  console.error("系统/网络前置检查未通过,请修复后重试。");
38
39
  return;
@@ -55,6 +56,7 @@ export function registerDoctorCommand(agentCommand) {
55
56
  checks = await runDoctorChecks(platform, jenkinsUrl);
56
57
  }
57
58
  if (hasLinuxOrNetworkFailure(checks)) {
59
+ await printFailedWhitelistReport(checks);
58
60
  process.exitCode = 1;
59
61
  console.error("复检发现系统/网络检查失败,请修复后重试。");
60
62
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/agent/doctor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/agent/doctor.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
- import { CheckResult, SupportedPlatform } from "../../types.js";
1
+ import { CheckResult, NetworkCheckResult, SupportedPlatform } from "../../types.js";
2
2
  export interface DoctorCheckResult {
3
3
  linuxResults: CheckResult[];
4
- networkResults: CheckResult[];
4
+ networkResults: NetworkCheckResult[];
5
5
  toolResults: CheckResult[];
6
6
  }
7
7
  export declare function runDoctorChecks(platform: SupportedPlatform, jenkinsBaseUrl: string): Promise<DoctorCheckResult>;
8
8
  export declare function hasBlockingFailure(checks: DoctorCheckResult): boolean;
9
9
  export declare function hasLinuxOrNetworkFailure(checks: DoctorCheckResult): boolean;
10
10
  export declare function getFailedToolChecks(checks: DoctorCheckResult): CheckResult[];
11
+ export declare function getFailedNetworkChecks(checks: DoctorCheckResult): NetworkCheckResult[];
11
12
  export declare function printCheckSummary(checks: DoctorCheckResult): Promise<void>;
13
+ export declare function printFailedWhitelistReport(checks: DoctorCheckResult): Promise<string | null>;
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { checkLinuxGuards } from "../../core/precheck/linuxGuard.js";
3
3
  import { checkWhitelistConnectivity } from "../../core/precheck/network.js";
4
+ import { formatWhitelistFailureReport, saveWhitelistFailureReport, } from "../../core/precheck/networkReport.js";
4
5
  import { checkRequiredTools } from "../../core/precheck/tools.js";
5
6
  import { CheckReport } from "../../ui/CheckReport.js";
6
7
  import { renderOnce } from "../../ui/renderOnce.js";
@@ -23,6 +24,9 @@ export function hasLinuxOrNetworkFailure(checks) {
23
24
  export function getFailedToolChecks(checks) {
24
25
  return checks.toolResults.filter((item) => item.status === "fail");
25
26
  }
27
+ export function getFailedNetworkChecks(checks) {
28
+ return checks.networkResults.filter((item) => item.status === "fail");
29
+ }
26
30
  export async function printCheckSummary(checks) {
27
31
  if (checks.linuxResults.length > 0) {
28
32
  await renderOnce(_jsx(CheckReport, { title: "Linux \u524D\u7F6E\u68C0\u67E5", results: checks.linuxResults }));
@@ -30,4 +34,16 @@ export async function printCheckSummary(checks) {
30
34
  await renderOnce(_jsx(CheckReport, { title: "\u7F51\u7EDC\u767D\u540D\u5355\u68C0\u67E5", results: checks.networkResults }));
31
35
  await renderOnce(_jsx(CheckReport, { title: "\u5DE5\u5177\u4E0E\u7248\u672C\u68C0\u67E5", results: checks.toolResults }));
32
36
  }
37
+ export async function printFailedWhitelistReport(checks) {
38
+ const failedNetworkChecks = getFailedNetworkChecks(checks);
39
+ if (failedNetworkChecks.length === 0) {
40
+ return null;
41
+ }
42
+ const report = await formatWhitelistFailureReport(failedNetworkChecks);
43
+ const reportPath = await saveWhitelistFailureReport(report);
44
+ console.error("\n以下为网络白名单未通过项的 OA 申请报告:");
45
+ console.error(report);
46
+ console.error(`报告已写入: ${reportPath}`);
47
+ return reportPath;
48
+ }
33
49
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/agent/shared.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAQpD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA2B,EAC3B,cAAsB;IAEtB,MAAM,YAAY,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,MAAM,0BAA0B,CAAC,cAAc,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO;QACL,YAAY;QACZ,cAAc;QACd,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAyB;IAC1D,OAAO,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CACnF,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAyB;IAChE,OAAO,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAyB;IAC3D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAyB;IAC/D,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,UAAU,CAAC,KAAC,WAAW,IAAC,KAAK,EAAC,gCAAY,EAAC,OAAO,EAAE,MAAM,CAAC,YAAY,GAAI,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,UAAU,CAAC,KAAC,WAAW,IAAC,KAAK,EAAC,4CAAS,EAAC,OAAO,EAAE,MAAM,CAAC,cAAc,GAAI,CAAC,CAAC;IAClF,MAAM,UAAU,CAAC,KAAC,WAAW,IAAC,KAAK,EAAC,4CAAS,EAAC,OAAO,EAAE,MAAM,CAAC,WAAW,GAAI,CAAC,CAAC;AACjF,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/agent/shared.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { CheckResult } from "../../types.js";
2
- export declare function checkWhitelistConnectivity(jenkinsBaseUrl: string): Promise<CheckResult[]>;
1
+ import { NetworkCheckResult } from "../../types.js";
2
+ export declare function checkWhitelistConnectivity(jenkinsBaseUrl: string): Promise<NetworkCheckResult[]>;
@@ -1,32 +1,49 @@
1
+ import dns from "node:dns/promises";
1
2
  import net from "node:net";
2
3
  import { getWhitelistTargets } from "../../constants/whitelist.js";
4
+ async function resolveTargetAddresses(host) {
5
+ if (net.isIP(host)) {
6
+ return [host];
7
+ }
8
+ try {
9
+ const records = await dns.lookup(host, { all: true });
10
+ return Array.from(new Set(records.map((item) => item.address)));
11
+ }
12
+ catch {
13
+ return [];
14
+ }
15
+ }
3
16
  async function checkTcpTarget(target) {
4
17
  return await new Promise((resolve) => {
5
18
  const socket = new net.Socket();
6
19
  const timeoutMs = target.timeoutMs ?? 4000;
7
20
  let resolved = false;
8
- const finish = (status, detail, hint) => {
21
+ const addressPromise = resolveTargetAddresses(target.host);
22
+ const finish = async (status, detail, hint) => {
9
23
  if (resolved) {
10
24
  return;
11
25
  }
12
26
  resolved = true;
13
27
  socket.destroy();
28
+ const resolvedAddresses = await addressPromise;
14
29
  resolve({
15
30
  name: `网络连通: ${target.name}`,
16
31
  status,
17
32
  detail,
18
33
  hint,
34
+ target,
35
+ resolvedAddresses,
19
36
  });
20
37
  };
21
38
  socket.setTimeout(timeoutMs);
22
39
  socket.on("connect", () => {
23
- finish("pass", `${target.host}:${target.port} 可访问`);
40
+ void finish("pass", `${target.host}:${target.port} 可访问`);
24
41
  });
25
42
  socket.on("timeout", () => {
26
- finish("fail", `${target.host}:${target.port} 连接超时`, "请确认白名单和网络策略。");
43
+ void finish("fail", `${target.host}:${target.port} 连接超时`, "请确认白名单和网络策略。");
27
44
  });
28
45
  socket.on("error", (error) => {
29
- finish("fail", `${target.host}:${target.port} 连接失败 (${error.message})`, "请确认 DNS、防火墙、代理与白名单。");
46
+ void finish("fail", `${target.host}:${target.port} 连接失败 (${error.message})`, "请确认 DNS、防火墙、代理与白名单。");
30
47
  });
31
48
  socket.connect(target.port, target.host);
32
49
  });
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/core/precheck/network.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGnE,KAAK,UAAU,cAAc,CAAC,MAAqB;IACjD,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;QAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,MAAM,GAAG,CAAC,MAA6B,EAAE,MAAc,EAAE,IAAa,EAAE,EAAE;YAC9E,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC;gBACN,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE;gBAC5B,MAAM;gBACN,MAAM;gBACN,IAAI;aACL,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE7B,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,OAAO,EAAE,cAAc,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CACJ,MAAM,EACN,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,GAAG,EACvD,qBAAqB,CACtB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,cAAsB;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/core/precheck/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { NetworkCheckResult } from "../../types.js";
2
+ export interface WhitelistFailureReportOptions {
3
+ machineName?: string;
4
+ internalIp?: string;
5
+ externalIp?: string;
6
+ disableExternalIpLookup?: boolean;
7
+ }
8
+ export declare function formatWhitelistFailureReport(failedResults: NetworkCheckResult[], options?: WhitelistFailureReportOptions): Promise<string>;
9
+ export declare function getWhitelistFailureReportPath(): string;
10
+ export declare function saveWhitelistFailureReport(report: string): Promise<string>;
@@ -0,0 +1,91 @@
1
+ import { execFile } from "node:child_process";
2
+ import fs from "fs-extra";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { getConfigDir } from "../platform.js";
7
+ const execFileAsync = promisify(execFile);
8
+ function unique(items) {
9
+ return Array.from(new Set(items));
10
+ }
11
+ function pickPrimaryInternalIp() {
12
+ const interfaces = os.networkInterfaces();
13
+ for (const entries of Object.values(interfaces)) {
14
+ for (const item of entries ?? []) {
15
+ if (item.family === "IPv4" && !item.internal) {
16
+ return item.address;
17
+ }
18
+ }
19
+ }
20
+ return undefined;
21
+ }
22
+ function resolveMachineName(options) {
23
+ return options.machineName?.trim() || process.env.TDF_MACHINE_NAME || os.hostname();
24
+ }
25
+ function resolveInternalIp(options) {
26
+ return (options.internalIp?.trim() ||
27
+ process.env.TDF_INTERNAL_IP ||
28
+ pickPrimaryInternalIp() ||
29
+ "待补充");
30
+ }
31
+ function normalizeIpCandidate(value) {
32
+ const candidate = value?.trim();
33
+ if (!candidate) {
34
+ return undefined;
35
+ }
36
+ const ipv4Pattern = /^(?:\d{1,3}\.){3}\d{1,3}$/;
37
+ const ipv6Pattern = /^[0-9a-f:]+$/i;
38
+ if (ipv4Pattern.test(candidate) || ipv6Pattern.test(candidate)) {
39
+ return candidate;
40
+ }
41
+ return undefined;
42
+ }
43
+ async function fetchExternalIpViaCurl() {
44
+ try {
45
+ const { stdout } = await execFileAsync("curl", ["-fsSL", "--max-time", "5", "ip.sb"], {
46
+ timeout: 6000,
47
+ });
48
+ return normalizeIpCandidate(stdout);
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ }
54
+ async function resolveExternalIp(options) {
55
+ const explicit = normalizeIpCandidate(options.externalIp) ?? normalizeIpCandidate(process.env.TDF_EXTERNAL_IP);
56
+ if (explicit) {
57
+ return explicit;
58
+ }
59
+ if (options.disableExternalIpLookup) {
60
+ return "待补充";
61
+ }
62
+ return (await fetchExternalIpViaCurl()) ?? "待补充";
63
+ }
64
+ function formatFailureEndpoint(result) {
65
+ const addresses = result.resolvedAddresses.length > 0 ? result.resolvedAddresses : [result.target.host];
66
+ return unique(addresses).map((address) => {
67
+ const hostNote = address === result.target.host ? "" : `, 域名: ${result.target.host}`;
68
+ return `${address}:${result.target.port}(${result.target.name}${hostNote})`;
69
+ });
70
+ }
71
+ export async function formatWhitelistFailureReport(failedResults, options = {}) {
72
+ const machineName = resolveMachineName(options);
73
+ const internalIp = resolveInternalIp(options);
74
+ const externalIp = await resolveExternalIp(options);
75
+ const endpoints = unique(failedResults.flatMap((item) => formatFailureEndpoint(item)));
76
+ const lines = endpoints.map((item, index) => `${index + 1}. ${item}`);
77
+ return [
78
+ `${machineName}(内网IP:${internalIp},外网IP:${externalIp})需要访问以下服务或者端口:`,
79
+ ...lines,
80
+ ].join("\n");
81
+ }
82
+ export function getWhitelistFailureReportPath() {
83
+ return path.join(getConfigDir(), "reports", "doctor-whitelist-failures.txt");
84
+ }
85
+ export async function saveWhitelistFailureReport(report) {
86
+ const filePath = getWhitelistFailureReportPath();
87
+ await fs.ensureDir(path.dirname(filePath));
88
+ await fs.writeFile(filePath, `${report}\n`, "utf8");
89
+ return filePath;
90
+ }
91
+ //# sourceMappingURL=networkReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkReport.js","sourceRoot":"","sources":["../../../src/core/precheck/networkReport.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -12,6 +12,10 @@ export interface NetworkTarget {
12
12
  port: number;
13
13
  timeoutMs?: number;
14
14
  }
15
+ export interface NetworkCheckResult extends CheckResult {
16
+ target: NetworkTarget;
17
+ resolvedAddresses: string[];
18
+ }
15
19
  export interface ParsedAgentCommand {
16
20
  mode: "url" | "jnlpUrl";
17
21
  curlLine: string;
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "tuyoo-devflow",
3
- "version": "0.1.6",
3
+ "version": "0.1.9",
4
4
  "description": "Tuyoo DevFlow CLI for Jenkins and pipeline automation",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "main": "dist/cli.js",
8
8
  "bin": {
9
- "tdf": "./dist/cli.js"
9
+ "tdf": "dist/cli.js"
10
10
  },
11
11
  "files": [
12
12
  "dist",
@@ -23,6 +23,11 @@
23
23
  "typecheck": "tsc -p tsconfig.json --noEmit",
24
24
  "verify": "npm run build && npm test",
25
25
  "pack:dry": "npm pack --dry-run",
26
+ "release:check": "npm run verify && npm run pack:dry",
27
+ "release:patch": "npm run release:check && npm version patch",
28
+ "release:minor": "npm run release:check && npm version minor",
29
+ "release:major": "npm run release:check && npm version major",
30
+ "release:push": "git push origin main --follow-tags",
26
31
  "prepack": "npm run verify",
27
32
  "test": "vitest run",
28
33
  "test:watch": "vitest"