tuyoo-devflow 0.1.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.
Files changed (97) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +21 -0
  3. package/README.md +150 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +21 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/agent/doctor.d.ts +2 -0
  8. package/dist/commands/agent/doctor.js +70 -0
  9. package/dist/commands/agent/doctor.js.map +1 -0
  10. package/dist/commands/agent/index.d.ts +2 -0
  11. package/dist/commands/agent/index.js +8 -0
  12. package/dist/commands/agent/index.js.map +1 -0
  13. package/dist/commands/agent/install.d.ts +2 -0
  14. package/dist/commands/agent/install.js +300 -0
  15. package/dist/commands/agent/install.js.map +1 -0
  16. package/dist/commands/agent/shared.d.ts +11 -0
  17. package/dist/commands/agent/shared.js +33 -0
  18. package/dist/commands/agent/shared.js.map +1 -0
  19. package/dist/commands/agent/start.d.ts +3 -0
  20. package/dist/commands/agent/start.js +85 -0
  21. package/dist/commands/agent/start.js.map +1 -0
  22. package/dist/constants/versionPolicy.d.ts +12 -0
  23. package/dist/constants/versionPolicy.js +13 -0
  24. package/dist/constants/versionPolicy.js.map +1 -0
  25. package/dist/constants/whitelist.d.ts +3 -0
  26. package/dist/constants/whitelist.js +43 -0
  27. package/dist/constants/whitelist.js.map +1 -0
  28. package/dist/core/generator/linuxSystemd.d.ts +15 -0
  29. package/dist/core/generator/linuxSystemd.js +64 -0
  30. package/dist/core/generator/linuxSystemd.js.map +1 -0
  31. package/dist/core/generator/macLaunchd.d.ts +15 -0
  32. package/dist/core/generator/macLaunchd.js +104 -0
  33. package/dist/core/generator/macLaunchd.js.map +1 -0
  34. package/dist/core/generator/macScript.d.ts +2 -0
  35. package/dist/core/generator/macScript.js +20 -0
  36. package/dist/core/generator/macScript.js.map +1 -0
  37. package/dist/core/generator/winBat.d.ts +2 -0
  38. package/dist/core/generator/winBat.js +20 -0
  39. package/dist/core/generator/winBat.js.map +1 -0
  40. package/dist/core/jenkins/directLaunch.d.ts +2 -0
  41. package/dist/core/jenkins/directLaunch.js +22 -0
  42. package/dist/core/jenkins/directLaunch.js.map +1 -0
  43. package/dist/core/jenkins/downloadAgentJar.d.ts +1 -0
  44. package/dist/core/jenkins/downloadAgentJar.js +13 -0
  45. package/dist/core/jenkins/downloadAgentJar.js.map +1 -0
  46. package/dist/core/jenkins/launchArgs.d.ts +2 -0
  47. package/dist/core/jenkins/launchArgs.js +22 -0
  48. package/dist/core/jenkins/launchArgs.js.map +1 -0
  49. package/dist/core/jenkins/parseAgentCommand.d.ts +7 -0
  50. package/dist/core/jenkins/parseAgentCommand.js +108 -0
  51. package/dist/core/jenkins/parseAgentCommand.js.map +1 -0
  52. package/dist/core/log/redact.d.ts +2 -0
  53. package/dist/core/log/redact.js +26 -0
  54. package/dist/core/log/redact.js.map +1 -0
  55. package/dist/core/pipeline/setupPytuyooPipeline.d.ts +30 -0
  56. package/dist/core/pipeline/setupPytuyooPipeline.js +254 -0
  57. package/dist/core/pipeline/setupPytuyooPipeline.js.map +1 -0
  58. package/dist/core/platform.d.ts +5 -0
  59. package/dist/core/platform.js +27 -0
  60. package/dist/core/platform.js.map +1 -0
  61. package/dist/core/precheck/autoInstall.d.ts +9 -0
  62. package/dist/core/precheck/autoInstall.js +249 -0
  63. package/dist/core/precheck/autoInstall.js.map +1 -0
  64. package/dist/core/precheck/linuxGuard.d.ts +2 -0
  65. package/dist/core/precheck/linuxGuard.js +48 -0
  66. package/dist/core/precheck/linuxGuard.js.map +1 -0
  67. package/dist/core/precheck/network.d.ts +2 -0
  68. package/dist/core/precheck/network.js +42 -0
  69. package/dist/core/precheck/network.js.map +1 -0
  70. package/dist/core/precheck/systemInfo.d.ts +2 -0
  71. package/dist/core/precheck/systemInfo.js +37 -0
  72. package/dist/core/precheck/systemInfo.js.map +1 -0
  73. package/dist/core/precheck/tools.d.ts +12 -0
  74. package/dist/core/precheck/tools.js +135 -0
  75. package/dist/core/precheck/tools.js.map +1 -0
  76. package/dist/core/security/secretStore.d.ts +5 -0
  77. package/dist/core/security/secretStore.js +310 -0
  78. package/dist/core/security/secretStore.js.map +1 -0
  79. package/dist/core/shell/commandRunner.d.ts +17 -0
  80. package/dist/core/shell/commandRunner.js +94 -0
  81. package/dist/core/shell/commandRunner.js.map +1 -0
  82. package/dist/core/store/installCommandCache.d.ts +9 -0
  83. package/dist/core/store/installCommandCache.js +66 -0
  84. package/dist/core/store/installCommandCache.js.map +1 -0
  85. package/dist/core/store/profileStore.d.ts +4 -0
  86. package/dist/core/store/profileStore.js +43 -0
  87. package/dist/core/store/profileStore.js.map +1 -0
  88. package/dist/types.d.ts +41 -0
  89. package/dist/types.js +2 -0
  90. package/dist/types.js.map +1 -0
  91. package/dist/ui/CheckReport.d.ts +5 -0
  92. package/dist/ui/CheckReport.js +24 -0
  93. package/dist/ui/CheckReport.js.map +1 -0
  94. package/dist/ui/renderOnce.d.ts +2 -0
  95. package/dist/ui/renderOnce.js +9 -0
  96. package/dist/ui/renderOnce.js.map +1 -0
  97. package/package.json +63 -0
@@ -0,0 +1,108 @@
1
+ import { parseArgsStringToArgv } from "string-argv";
2
+ function normalizeUrl(url) {
3
+ const parsed = new URL(url);
4
+ if (!parsed.pathname || parsed.pathname === "") {
5
+ parsed.pathname = "/";
6
+ }
7
+ return parsed.toString();
8
+ }
9
+ function extractCurlUrl(curlLine) {
10
+ const tokens = parseArgsStringToArgv(curlLine);
11
+ const urlToken = tokens.find((item) => /^https?:\/\/.+agent\.jar/i.test(item));
12
+ if (!urlToken) {
13
+ throw new Error("无法从 curl 命令中解析 agent.jar 下载地址。");
14
+ }
15
+ return urlToken;
16
+ }
17
+ function takeOption(tokens, flag) {
18
+ const index = tokens.findIndex((item) => item === flag);
19
+ if (index === -1) {
20
+ return undefined;
21
+ }
22
+ const value = tokens[index + 1];
23
+ if (!value || value.startsWith("-")) {
24
+ throw new Error(`参数 ${flag} 缺少取值。`);
25
+ }
26
+ return value;
27
+ }
28
+ export function parseAgentCommand(input) {
29
+ const curlLine = input.curlLine.trim();
30
+ const javaLine = input.javaLine.trim();
31
+ if (!curlLine || !javaLine) {
32
+ throw new Error("必须同时提供 curl 和 java 启动命令。");
33
+ }
34
+ const jarDownloadUrl = extractCurlUrl(curlLine);
35
+ const javaTokens = parseArgsStringToArgv(javaLine);
36
+ if (!javaTokens.includes("java")) {
37
+ throw new Error("java 启动命令格式不正确。");
38
+ }
39
+ const url = takeOption(javaTokens, "-url");
40
+ const jnlpUrl = takeOption(javaTokens, "-jnlpUrl");
41
+ const secret = takeOption(javaTokens, "-secret");
42
+ const nodeName = takeOption(javaTokens, "-name");
43
+ const workDir = takeOption(javaTokens, "-workDir");
44
+ if (!secret) {
45
+ throw new Error("缺少 -secret 参数。");
46
+ }
47
+ if (!workDir) {
48
+ throw new Error("缺少 -workDir 参数。");
49
+ }
50
+ if (!url && !jnlpUrl) {
51
+ throw new Error("缺少 -url 或 -jnlpUrl 参数。");
52
+ }
53
+ const knownFlags = new Set(["-url", "-jnlpUrl", "-secret", "-name", "-workDir", "-jar"]);
54
+ const additionalArgs = [];
55
+ for (let i = 0; i < javaTokens.length; i += 1) {
56
+ const token = javaTokens[i];
57
+ if (token === "java") {
58
+ continue;
59
+ }
60
+ if (!token.startsWith("-")) {
61
+ if (token !== "agent.jar") {
62
+ additionalArgs.push(token);
63
+ }
64
+ continue;
65
+ }
66
+ if (!knownFlags.has(token)) {
67
+ additionalArgs.push(token);
68
+ const next = javaTokens[i + 1];
69
+ if (next && !next.startsWith("-")) {
70
+ additionalArgs.push(next);
71
+ i += 1;
72
+ }
73
+ continue;
74
+ }
75
+ if (token === "-jar") {
76
+ i += 1;
77
+ continue;
78
+ }
79
+ i += 1;
80
+ }
81
+ if (url) {
82
+ return {
83
+ mode: "url",
84
+ curlLine,
85
+ javaLine,
86
+ jarDownloadUrl: normalizeUrl(jarDownloadUrl),
87
+ jenkinsBaseUrl: normalizeUrl(url),
88
+ secret,
89
+ nodeName,
90
+ workDir,
91
+ additionalArgs,
92
+ };
93
+ }
94
+ const parsedJnlp = new URL(jnlpUrl);
95
+ return {
96
+ mode: "jnlpUrl",
97
+ curlLine,
98
+ javaLine,
99
+ jarDownloadUrl: normalizeUrl(jarDownloadUrl),
100
+ jenkinsBaseUrl: `${parsedJnlp.origin}/`,
101
+ jnlpUrl: normalizeUrl(jnlpUrl),
102
+ secret,
103
+ nodeName,
104
+ workDir,
105
+ additionalArgs,
106
+ };
107
+ }
108
+ //# sourceMappingURL=parseAgentCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAgentCommand.js","sourceRoot":"","sources":["../../../src/core/jenkins/parseAgentCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function redactText(text: string, secrets?: string[]): string;
2
+ export declare function safeErrorMessage(error: unknown, secrets?: string[]): string;
@@ -0,0 +1,26 @@
1
+ const SENSITIVE_KEYS = ["secret", "token", "password", "passwd", "authorization"];
2
+ export function redactText(text, secrets = []) {
3
+ if (!text) {
4
+ return text;
5
+ }
6
+ let output = text;
7
+ for (const secret of secrets) {
8
+ if (!secret) {
9
+ continue;
10
+ }
11
+ output = output.split(secret).join("***");
12
+ }
13
+ output = output.replace(/(https?:\/\/[^:\s]+:)([^@\s]+)(@)/gi, (_match, start, _middle, end) => `${start}***${end}`);
14
+ for (const key of SENSITIVE_KEYS) {
15
+ const regexp = new RegExp(`(${key}\\s*[=:]\\s*)([^\\s]+)`, "gi");
16
+ output = output.replace(regexp, (_match, prefix) => `${prefix}***`);
17
+ }
18
+ return output;
19
+ }
20
+ export function safeErrorMessage(error, secrets = []) {
21
+ if (error instanceof Error) {
22
+ return redactText(error.message, secrets);
23
+ }
24
+ return redactText(String(error), secrets);
25
+ }
26
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/core/log/redact.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;AAElF,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,UAAoB,EAAE;IAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,qCAAqC,EACrC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,CACrD,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,wBAAwB,EAAE,IAAI,CAAC,CAAC;QACjE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,UAAoB,EAAE;IACrE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { SupportedPlatform } from "../../types.js";
2
+ export interface SetupPipelineOptions {
3
+ platform: SupportedPlatform;
4
+ repoDir: string;
5
+ gitlabUsername: string;
6
+ gitlabToken: string;
7
+ logger?: (message: string) => void;
8
+ }
9
+ export interface CondaActivateInspection {
10
+ supported: boolean;
11
+ needsInit: boolean;
12
+ shellName?: "zsh" | "bash";
13
+ manualInitCommand?: string;
14
+ detail: string;
15
+ }
16
+ export declare function checkCondaEnvExists(options: {
17
+ platform: SupportedPlatform;
18
+ envName?: string;
19
+ }): Promise<boolean>;
20
+ export declare function inspectCondaActivateForShell(options: {
21
+ platform: SupportedPlatform;
22
+ asUser?: string;
23
+ envName?: string;
24
+ }): Promise<CondaActivateInspection>;
25
+ export declare function runCondaInitForShell(options: {
26
+ platform: SupportedPlatform;
27
+ asUser?: string;
28
+ logger?: (message: string) => void;
29
+ }): Promise<CondaActivateInspection>;
30
+ export declare function setupPytuyooPipelineEnv(options: SetupPipelineOptions): Promise<void>;
@@ -0,0 +1,254 @@
1
+ import fs from "fs-extra";
2
+ import { VERSION_POLICY } from "../../constants/versionPolicy.js";
3
+ import { runCommand } from "../shell/commandRunner.js";
4
+ const PIPELINE_GIT_HOST = "tygit.tuyoo.com";
5
+ const PIPELINE_GIT_PATH = "liutongqing/pytuyoo-pipeline.git";
6
+ const CONDA_TOS_CHANNELS = [
7
+ "https://repo.anaconda.com/pkgs/main",
8
+ "https://repo.anaconda.com/pkgs/r",
9
+ ];
10
+ function userForPlatform(platform) {
11
+ if (platform === "linux") {
12
+ return "tywork";
13
+ }
14
+ return undefined;
15
+ }
16
+ function buildCloneUrl(username, token) {
17
+ return `https://${encodeURIComponent(username)}:${encodeURIComponent(token)}@${PIPELINE_GIT_HOST}/${PIPELINE_GIT_PATH}`;
18
+ }
19
+ function buildCleanRepoUrl() {
20
+ return `https://${PIPELINE_GIT_HOST}/${PIPELINE_GIT_PATH}`;
21
+ }
22
+ function shellForPlatform(platform) {
23
+ if (platform === "macos") {
24
+ return "zsh";
25
+ }
26
+ if (platform === "linux") {
27
+ return "bash";
28
+ }
29
+ return undefined;
30
+ }
31
+ function shellBinary(shellName) {
32
+ return shellName === "zsh" ? "/bin/zsh" : "/bin/bash";
33
+ }
34
+ function rawErrorMessage(error) {
35
+ if (error instanceof Error) {
36
+ return error.message;
37
+ }
38
+ return String(error);
39
+ }
40
+ function isCondaTosNotAccepted(text) {
41
+ const normalized = text.toLowerCase();
42
+ return (normalized.includes("condatosnoninteractiveerror") ||
43
+ normalized.includes("terms of service have not been accepted"));
44
+ }
45
+ function isCondaTosCommandUnsupported(text) {
46
+ const normalized = text.toLowerCase();
47
+ return (normalized.includes("invalid choice: 'tos'") ||
48
+ normalized.includes("no such command") ||
49
+ normalized.includes("unrecognized arguments: tos"));
50
+ }
51
+ async function acceptCondaTerms(runAsUser, logger) {
52
+ const condaExecutable = await resolveCondaExecutable(runAsUser);
53
+ for (const channel of CONDA_TOS_CHANNELS) {
54
+ logger?.(` - 接受 Conda ToS: ${channel}`);
55
+ const result = await runCommand(`"${condaExecutable}" tos accept --override-channels --channel ${channel}`, {
56
+ asUser: runAsUser,
57
+ allowFailure: true,
58
+ });
59
+ if (result.code !== 0) {
60
+ const output = `${result.stderr}\n${result.stdout}`.trim();
61
+ if (isCondaTosCommandUnsupported(output)) {
62
+ logger?.(" 当前 conda 不支持 tos 子命令,跳过该项。");
63
+ continue;
64
+ }
65
+ throw new Error(`自动接受 Conda ToS 失败(${channel}):${output || "未知错误"}`);
66
+ }
67
+ logger?.(" 已确认。");
68
+ }
69
+ }
70
+ async function runCondaCommandWithTosRetry(command, options) {
71
+ const run = async () => {
72
+ await runCommand(command, {
73
+ asUser: options.asUser,
74
+ cwd: options.cwd,
75
+ streamOutput: true,
76
+ streamPrefix: options.streamPrefix,
77
+ heartbeatIntervalMs: 15000,
78
+ heartbeatText: `${options.streamPrefix ?? "conda"} 正在执行,请稍候...`,
79
+ });
80
+ };
81
+ try {
82
+ await run();
83
+ }
84
+ catch (error) {
85
+ const message = rawErrorMessage(error);
86
+ if (!isCondaTosNotAccepted(message)) {
87
+ throw error;
88
+ }
89
+ options.logger?.("检测到 Conda ToS 未接受,正在自动处理后重试...");
90
+ await acceptCondaTerms(options.asUser, options.logger);
91
+ await run();
92
+ }
93
+ }
94
+ async function resolveCondaExecutable(runAsUser) {
95
+ const result = await runCommand("command -v conda", {
96
+ asUser: runAsUser,
97
+ allowFailure: true,
98
+ });
99
+ const found = result.stdout.trim().split("\n").filter(Boolean).at(-1);
100
+ if (found) {
101
+ return found;
102
+ }
103
+ const fallbackCandidates = [
104
+ "/usr/local/bin/conda",
105
+ "/usr/bin/conda",
106
+ "/opt/miniconda/bin/conda",
107
+ "/opt/conda/bin/conda",
108
+ "$HOME/miniconda3/bin/conda",
109
+ "/home/tywork/miniconda3/bin/conda",
110
+ ];
111
+ for (const candidate of fallbackCandidates) {
112
+ const check = await runCommand(`[ -x ${candidate} ]`, {
113
+ asUser: runAsUser,
114
+ allowFailure: true,
115
+ });
116
+ if (check.code === 0) {
117
+ return candidate;
118
+ }
119
+ }
120
+ throw new Error("未找到 conda 可执行文件,请确认 conda 已安装并在 PATH 中。");
121
+ }
122
+ async function detectCondaEnvExists(condaExecutable, envName, runAsUser) {
123
+ const envList = await runCommand(`"${condaExecutable}" env list`, {
124
+ allowFailure: true,
125
+ asUser: runAsUser,
126
+ });
127
+ return envList.code === 0 && envList.stdout.includes(envName);
128
+ }
129
+ export async function checkCondaEnvExists(options) {
130
+ const runAsUser = userForPlatform(options.platform);
131
+ const envName = options.envName ?? VERSION_POLICY.conda.envName;
132
+ const condaExecutable = await resolveCondaExecutable(runAsUser);
133
+ return await detectCondaEnvExists(condaExecutable, envName, runAsUser);
134
+ }
135
+ export async function inspectCondaActivateForShell(options) {
136
+ const shellName = shellForPlatform(options.platform);
137
+ const envName = options.envName ?? VERSION_POLICY.conda.envName;
138
+ if (!shellName) {
139
+ return {
140
+ supported: false,
141
+ needsInit: false,
142
+ detail: "当前平台无需执行 conda init 自动检测(可直接使用 conda run)。",
143
+ };
144
+ }
145
+ const shell = shellBinary(shellName);
146
+ const probe = await runCommand(`"${shell}" -lc "conda activate ${envName} >/dev/null 2>&1 && conda deactivate >/dev/null 2>&1"`, {
147
+ asUser: options.asUser,
148
+ allowFailure: true,
149
+ });
150
+ if (probe.code === 0) {
151
+ return {
152
+ supported: true,
153
+ needsInit: false,
154
+ shellName,
155
+ manualInitCommand: `conda init ${shellName}`,
156
+ detail: `当前 ${shellName} 环境可直接 conda activate。`,
157
+ };
158
+ }
159
+ return {
160
+ supported: true,
161
+ needsInit: true,
162
+ shellName,
163
+ manualInitCommand: `conda init ${shellName}`,
164
+ detail: `当前 ${shellName} 环境尚未完成 conda activate 初始化。`,
165
+ };
166
+ }
167
+ export async function runCondaInitForShell(options) {
168
+ const shellName = shellForPlatform(options.platform);
169
+ if (!shellName) {
170
+ return {
171
+ supported: false,
172
+ needsInit: false,
173
+ detail: "当前平台跳过 conda init。",
174
+ };
175
+ }
176
+ const log = options.logger ?? ((message) => console.log(message));
177
+ log(`执行 conda init ${shellName} ...`);
178
+ await runCommand(`conda init ${shellName}`, {
179
+ asUser: options.asUser,
180
+ streamOutput: true,
181
+ streamPrefix: "conda:init",
182
+ heartbeatIntervalMs: 15000,
183
+ heartbeatText: `conda init ${shellName} 正在执行,请稍候...`,
184
+ });
185
+ return await inspectCondaActivateForShell({
186
+ platform: options.platform,
187
+ asUser: options.asUser,
188
+ });
189
+ }
190
+ export async function setupPytuyooPipelineEnv(options) {
191
+ const runAsUser = userForPlatform(options.platform);
192
+ const envName = VERSION_POLICY.conda.envName;
193
+ const pythonVersion = VERSION_POLICY.conda.pythonVersion;
194
+ const log = options.logger ?? ((message) => console.log(message));
195
+ const condaExecutable = await resolveCondaExecutable(runAsUser);
196
+ log("4.1 检查 Conda ToS 状态...");
197
+ await acceptCondaTerms(runAsUser, log);
198
+ log(`4.2 检查 conda 环境是否存在: ${envName}`);
199
+ const hasEnv = await detectCondaEnvExists(condaExecutable, envName, runAsUser);
200
+ log(hasEnv ? ` - 已存在环境 ${envName}` : ` - 未找到环境 ${envName},准备创建`);
201
+ if (!hasEnv) {
202
+ log(`4.3 创建 conda 环境 ${envName}(python=${pythonVersion})...`);
203
+ await runCondaCommandWithTosRetry(`"${condaExecutable}" create -n ${envName} python=${pythonVersion} -y`, {
204
+ asUser: runAsUser,
205
+ streamPrefix: "conda:create",
206
+ logger: log,
207
+ });
208
+ }
209
+ else {
210
+ log("4.3 跳过环境创建(已存在)");
211
+ }
212
+ log("4.4 安装 poetry 到 conda 环境...");
213
+ await runCondaCommandWithTosRetry(`"${condaExecutable}" run -n ${envName} --live-stream python -m pip install poetry`, {
214
+ asUser: runAsUser,
215
+ streamPrefix: "conda:poetry",
216
+ logger: log,
217
+ });
218
+ log(`4.5 检查流水线仓库目录: ${options.repoDir}`);
219
+ const repoExists = await fs.pathExists(options.repoDir);
220
+ if (!repoExists) {
221
+ log(" - 仓库不存在,开始 clone pytuyoo-pipeline...");
222
+ const cloneUrl = buildCloneUrl(options.gitlabUsername, options.gitlabToken);
223
+ await runCommand(`git clone "${cloneUrl}" "${options.repoDir}"`, {
224
+ asUser: runAsUser,
225
+ streamOutput: true,
226
+ streamPrefix: "git:clone",
227
+ heartbeatIntervalMs: 15000,
228
+ heartbeatText: "git clone 正在执行,请稍候...",
229
+ redactValues: [options.gitlabToken],
230
+ });
231
+ await runCommand(`git -C "${options.repoDir}" remote set-url origin "${buildCleanRepoUrl()}"`, {
232
+ asUser: runAsUser,
233
+ allowFailure: true,
234
+ });
235
+ log(" - 已重置 origin 为无凭据地址。");
236
+ }
237
+ else {
238
+ log(" - 仓库已存在,跳过 clone。");
239
+ await runCommand(`git -C "${options.repoDir}" remote set-url origin "${buildCleanRepoUrl()}"`, {
240
+ asUser: runAsUser,
241
+ allowFailure: true,
242
+ });
243
+ log(" - 已校正 origin 为无凭据地址。");
244
+ }
245
+ log("4.6 安装 pytuyoo-pipeline Python 依赖(poetry install)...");
246
+ await runCondaCommandWithTosRetry(`"${condaExecutable}" run -n ${envName} --live-stream poetry install`, {
247
+ cwd: options.repoDir,
248
+ asUser: runAsUser,
249
+ streamPrefix: "poetry:install",
250
+ logger: log,
251
+ });
252
+ log("4.x conda 流水线环境准备完成。");
253
+ }
254
+ //# sourceMappingURL=setupPytuyooPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupPytuyooPipeline.js","sourceRoot":"","sources":["../../../src/core/pipeline/setupPytuyooPipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SupportedPlatform } from "../types.js";
2
+ export declare function getSupportedPlatform(): SupportedPlatform;
3
+ export declare function getCurrentUsername(): string;
4
+ export declare function getDefaultPipelineRepoDir(platform: SupportedPlatform): string;
5
+ export declare function getConfigDir(): string;
@@ -0,0 +1,27 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function getSupportedPlatform() {
4
+ if (process.platform === "darwin") {
5
+ return "macos";
6
+ }
7
+ if (process.platform === "win32") {
8
+ return "windows";
9
+ }
10
+ if (process.platform === "linux") {
11
+ return "linux";
12
+ }
13
+ throw new Error(`Unsupported platform: ${process.platform}`);
14
+ }
15
+ export function getCurrentUsername() {
16
+ return os.userInfo().username;
17
+ }
18
+ export function getDefaultPipelineRepoDir(platform) {
19
+ if (platform === "linux") {
20
+ return path.join("/home", "tywork", "pytuyoo-pipeline");
21
+ }
22
+ return path.join(os.homedir(), "pytuyoo-pipeline");
23
+ }
24
+ export function getConfigDir() {
25
+ return path.join(os.homedir(), ".tuyoo-devflow");
26
+ }
27
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/core/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAA2B;IACnE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { CheckResult, SupportedPlatform } from "../../types.js";
2
+ export type ManagedTool = "git" | "java" | "miniconda";
3
+ export interface MissingToolInstallResult {
4
+ detected: ManagedTool[];
5
+ selected: ManagedTool[];
6
+ installed: ManagedTool[];
7
+ }
8
+ export declare function getFailedToolKinds(toolChecks: CheckResult[]): ManagedTool[];
9
+ export declare function guideAndInstallMissingTools(platform: SupportedPlatform, failedToolChecks: CheckResult[]): Promise<MissingToolInstallResult>;