speccore 8.3.59 → 8.3.61

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 (65) hide show
  1. package/.agents/skills/spec-deploy/SKILL.md +311 -0
  2. package/.agents/skills/spec-verify/SKILL.md +226 -0
  3. package/README.md +60 -3
  4. package/dist/cli.js +52 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/about.d.ts.map +1 -1
  7. package/dist/commands/about.js +9 -2
  8. package/dist/commands/about.js.map +1 -1
  9. package/dist/commands/build.d.ts +9 -0
  10. package/dist/commands/build.d.ts.map +1 -0
  11. package/dist/commands/build.js +180 -0
  12. package/dist/commands/build.js.map +1 -0
  13. package/dist/commands/deploy.d.ts +11 -0
  14. package/dist/commands/deploy.d.ts.map +1 -0
  15. package/dist/commands/deploy.js +118 -0
  16. package/dist/commands/deploy.js.map +1 -0
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +2 -0
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/iteration/split.d.ts.map +1 -1
  21. package/dist/commands/iteration/split.js +28 -0
  22. package/dist/commands/iteration/split.js.map +1 -1
  23. package/dist/commands/pipeline.d.ts +10 -0
  24. package/dist/commands/pipeline.d.ts.map +1 -0
  25. package/dist/commands/pipeline.js +365 -0
  26. package/dist/commands/pipeline.js.map +1 -0
  27. package/dist/commands/pr.d.ts +3 -0
  28. package/dist/commands/pr.d.ts.map +1 -1
  29. package/dist/commands/pr.js +218 -0
  30. package/dist/commands/pr.js.map +1 -1
  31. package/dist/commands/update-env-configs.d.ts +3 -0
  32. package/dist/commands/update-env-configs.d.ts.map +1 -0
  33. package/dist/commands/update-env-configs.js +252 -0
  34. package/dist/commands/update-env-configs.js.map +1 -0
  35. package/dist/commands/update.d.ts.map +1 -1
  36. package/dist/commands/update.js +13 -0
  37. package/dist/commands/update.js.map +1 -1
  38. package/dist/commands/verify.d.ts +3 -0
  39. package/dist/commands/verify.d.ts.map +1 -1
  40. package/dist/commands/verify.js +330 -3
  41. package/dist/commands/verify.js.map +1 -1
  42. package/dist/core/deploy/engine.d.ts +25 -0
  43. package/dist/core/deploy/engine.d.ts.map +1 -0
  44. package/dist/core/deploy/engine.js +348 -0
  45. package/dist/core/deploy/engine.js.map +1 -0
  46. package/dist/core/environment-config.d.ts +61 -0
  47. package/dist/core/environment-config.d.ts.map +1 -0
  48. package/dist/core/environment-config.js +178 -0
  49. package/dist/core/environment-config.js.map +1 -0
  50. package/dist/core/pipeline-test.d.ts +83 -0
  51. package/dist/core/pipeline-test.d.ts.map +1 -0
  52. package/dist/core/pipeline-test.js +467 -0
  53. package/dist/core/pipeline-test.js.map +1 -0
  54. package/dist/core/test-config.d.ts +39 -0
  55. package/dist/core/test-config.d.ts.map +1 -0
  56. package/dist/core/test-config.js +162 -0
  57. package/dist/core/test-config.js.map +1 -0
  58. package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
  59. package/dist/core/ui-verify/spec-generator.js +27 -0
  60. package/dist/core/ui-verify/spec-generator.js.map +1 -1
  61. package/dist/core/unified-config.d.ts +49 -0
  62. package/dist/core/unified-config.d.ts.map +1 -1
  63. package/dist/core/unified-config.js +89 -0
  64. package/dist/core/unified-config.js.map +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTestConfig = loadTestConfig;
4
+ exports.mergeTestConfigWithEnv = mergeTestConfigWithEnv;
5
+ /**
6
+ * test-config — 测试场景配置加载与管理
7
+ *
8
+ * 支持 verify --config 读取测试场景 YAML 配置文件。
9
+ * 实现测试配置与环境配置的双层分离。
10
+ *
11
+ * v8.3.60+
12
+ */
13
+ const fs_extra_1 = require("fs-extra");
14
+ const logger_1 = require("../utils/logger");
15
+ /** 解析测试配置 YAML */
16
+ function parseTestYaml(content) {
17
+ const result = {};
18
+ const lines = content.split('\n');
19
+ let stack = [{ obj: result, indent: -1 }];
20
+ for (const line of lines) {
21
+ if (!line.trim() || line.trim().startsWith('#'))
22
+ continue;
23
+ const indent = line.length - line.trimStart().length;
24
+ while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
25
+ stack.pop();
26
+ }
27
+ const trimmed = line.trim();
28
+ const parent = stack[stack.length - 1].obj;
29
+ if (trimmed.startsWith('- ')) {
30
+ const value = trimmed.slice(2).trim();
31
+ if (!Array.isArray(parent))
32
+ continue;
33
+ if (value.includes(':')) {
34
+ const obj = {};
35
+ const [k, ...rest] = value.split(':');
36
+ const v = rest.join(':').trim();
37
+ if (v)
38
+ obj[k.trim()] = autoType(v);
39
+ parent.push(obj);
40
+ stack.push({ obj, indent });
41
+ }
42
+ else {
43
+ parent.push(autoType(value));
44
+ }
45
+ }
46
+ else if (trimmed.endsWith(':')) {
47
+ const key = trimmed.slice(0, -1).trim();
48
+ if (Array.isArray(parent)) {
49
+ const last = parent[parent.length - 1];
50
+ if (last && typeof last === 'object' && !Array.isArray(last)) {
51
+ last[key] = {};
52
+ stack.push({ obj: last[key], indent });
53
+ }
54
+ }
55
+ else {
56
+ if (!parent[key])
57
+ parent[key] = {};
58
+ stack.push({ obj: parent[key], indent });
59
+ }
60
+ }
61
+ else if (trimmed.includes(':')) {
62
+ const [k, ...rest] = trimmed.split(':');
63
+ const v = rest.join(':').trim();
64
+ if (Array.isArray(parent)) {
65
+ const last = parent[parent.length - 1];
66
+ if (last && typeof last === 'object') {
67
+ last[k.trim()] = autoType(v);
68
+ }
69
+ }
70
+ else {
71
+ parent[k.trim()] = autoType(v);
72
+ }
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ function autoType(v) {
78
+ if (v === 'true')
79
+ return true;
80
+ if (v === 'false')
81
+ return false;
82
+ if (/^-?\d+$/.test(v))
83
+ return parseInt(v, 10);
84
+ if (/^-?\d+\.\d+$/.test(v))
85
+ return parseFloat(v);
86
+ return v;
87
+ }
88
+ /** 加载测试场景配置文件 */
89
+ async function loadTestConfig(filePath) {
90
+ if (!(await (0, fs_extra_1.pathExists)(filePath))) {
91
+ logger_1.logger.warn(`⚠️ 测试配置文件不存在: ${filePath}`);
92
+ return null;
93
+ }
94
+ try {
95
+ const raw = await (0, fs_extra_1.readFile)(filePath, 'utf-8');
96
+ const parsed = parseTestYaml(raw);
97
+ const config = {
98
+ tests: [],
99
+ };
100
+ if (parsed.name)
101
+ config.name = String(parsed.name);
102
+ if (parsed.target && typeof parsed.target === 'object') {
103
+ const t = parsed.target;
104
+ config.target = {
105
+ url: t.url,
106
+ base_url: t.base_url,
107
+ router_file: t.router_file,
108
+ };
109
+ }
110
+ if (parsed.endpoints && typeof parsed.endpoints === 'object') {
111
+ config.endpoints = parsed.endpoints;
112
+ }
113
+ if (Array.isArray(parsed.tests)) {
114
+ for (const tc of parsed.tests) {
115
+ if (tc && typeof tc === 'object') {
116
+ const t = tc;
117
+ const testCase = {
118
+ name: String(t.name || 'unnamed'),
119
+ type: t.type || 'smoke',
120
+ };
121
+ if (Array.isArray(t.routes))
122
+ testCase.routes = t.routes.map(String);
123
+ if (Array.isArray(t.scenarios))
124
+ testCase.scenarios = t.scenarios.map(String);
125
+ if (t.threshold)
126
+ testCase.threshold = t.threshold;
127
+ if (Array.isArray(t.devices))
128
+ testCase.devices = t.devices.map(String);
129
+ if (Array.isArray(t.browsers))
130
+ testCase.browsers = t.browsers.map(String);
131
+ config.tests.push(testCase);
132
+ }
133
+ }
134
+ }
135
+ if (parsed.visual_model && typeof parsed.visual_model === 'object') {
136
+ config.visual_model = parsed.visual_model;
137
+ }
138
+ if (parsed.output)
139
+ config.output = String(parsed.output);
140
+ return config;
141
+ }
142
+ catch (e) {
143
+ logger_1.logger.warn(`⚠️ 测试配置文件解析失败: ${filePath} — ${e.message}`);
144
+ return null;
145
+ }
146
+ }
147
+ /** 合并环境配置中的测试参数 */
148
+ function mergeTestConfigWithEnv(testConfig, envConfig) {
149
+ if (!envConfig?.tests)
150
+ return testConfig;
151
+ const merged = { ...testConfig, tests: [...testConfig.tests] };
152
+ // 合并 endpoints
153
+ if (envConfig.tests.base_urls) {
154
+ merged.endpoints = { ...envConfig.tests.base_urls, ...testConfig.endpoints };
155
+ }
156
+ // 合并 visual_model(测试配置优先级更高)
157
+ if (envConfig.tests.visual_model && !testConfig.visual_model) {
158
+ merged.visual_model = envConfig.tests.visual_model;
159
+ }
160
+ return merged;
161
+ }
162
+ //# sourceMappingURL=test-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-config.js","sourceRoot":"","sources":["../../src/core/test-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"spec-generator.d.ts","sourceRoot":"","sources":["../../../src/core/ui-verify/spec-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAA+B,MAAM,SAAS,CAAC;AAEvE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,EAAE,qBAAqB,GAC7B,UAAU,CA2BZ;AAGD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAAE,EAClB,OAAO,EAAE,qBAAqB,GAC7B,UAAU,CA+BZ;AAwBD,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
1
+ {"version":3,"file":"spec-generator.d.ts","sourceRoot":"","sources":["../../../src/core/ui-verify/spec-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAA+B,MAAM,SAAS,CAAC;AAEvE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,EAAE,qBAAqB,GAC7B,UAAU,CA2BZ;AAGD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAAE,EAClB,OAAO,EAAE,qBAAqB,GAC7B,UAAU,CAsCZ;AAuDD,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
@@ -48,6 +48,7 @@ function generateSpecFromPages(pages, options) {
48
48
  const scenarioName = page.module
49
49
  ? `${page.module} - ${page.name}`
50
50
  : page.name;
51
+ const pageSelector = generatePageSelector(slugify(page.module), slugify(page.name), page.routePath || '');
51
52
  scenarios.push({
52
53
  name: scenarioName,
53
54
  description: `页面: ${page.filePath}`,
@@ -56,6 +57,7 @@ function generateSpecFromPages(pages, options) {
56
57
  { type: 'wait', delay: 1000 },
57
58
  ],
58
59
  assertions: [
60
+ { type: 'visible', selector: pageSelector, description: '页面核心容器已加载' },
59
61
  { type: 'visible', selector: 'body', description: '页面已加载' },
60
62
  ],
61
63
  });
@@ -74,6 +76,10 @@ function createScenarioForRoute(route, baseUrl) {
74
76
  return null;
75
77
  const displayName = route.name || route.component || path;
76
78
  const moduleName = route.module || 'default';
79
+ const safeName = slugify(displayName);
80
+ const safeModule = slugify(moduleName);
81
+ // 生成 data-testid 风格的智能 selector
82
+ const pageSelector = generatePageSelector(safeModule, safeName, path);
77
83
  return {
78
84
  name: `${moduleName} - ${displayName}`,
79
85
  description: `路由: ${path}`,
@@ -82,10 +88,31 @@ function createScenarioForRoute(route, baseUrl) {
82
88
  { type: 'wait', delay: 1000 },
83
89
  ],
84
90
  assertions: [
91
+ { type: 'visible', selector: pageSelector, description: '页面核心容器已加载' },
85
92
  { type: 'visible', selector: 'body', description: '页面已加载' },
86
93
  ],
87
94
  };
88
95
  }
96
+ /** 生成页面级智能 selector,优先 data-testid 风格 */
97
+ function generatePageSelector(moduleName, pageName, path) {
98
+ // 策略1: data-testid="module-page"(推荐实践)
99
+ const testId = `[data-testid="${moduleName}-${pageName}-page"]`;
100
+ // 策略2: 路由路径作为 id
101
+ const pathId = path.replace(/^\//, '').replace(/\//g, '-');
102
+ const pathSelector = pathId ? `#page-${pathId}` : '';
103
+ // 策略3: 通用容器
104
+ const fallback = `[data-testid="page-container"]`;
105
+ // 返回最佳 selector(实际执行时按顺序匹配,但 YAML 中只写最推荐的一个)
106
+ return testId;
107
+ }
108
+ /** 将字符串转为安全的 slug */
109
+ function slugify(str) {
110
+ return str
111
+ .replace(/^[^a-zA-Z0-9\u4e00-\u9fa5]+/, '')
112
+ .replace(/[^a-zA-Z0-9\u4e00-\u9fa5]+/g, '-')
113
+ .toLowerCase()
114
+ .slice(0, 40);
115
+ }
89
116
  // ── 写入规格文件 ──
90
117
  async function writeVerifySpec(spec, outputPath) {
91
118
  await (0, fs_extra_1.ensureDir)((0, path_1.join)(outputPath, '..'));
@@ -1 +1 @@
1
- {"version":3,"file":"spec-generator.js","sourceRoot":"","sources":["../../../src/core/ui-verify/spec-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec-generator.js","sourceRoot":"","sources":["../../../src/core/ui-verify/spec-generator.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,41 @@
2
2
  export declare const CURRENT_SCHEMA_VERSION = 1;
3
3
  /** 当前项目配置 schema 版本号(.speccore/PROJECT.yaml) */
4
4
  export declare const PROJECT_CURRENT_SCHEMA_VERSION = 1;
5
+ /** 单个环境的部署配置 */
6
+ export interface DeployEnvConfig {
7
+ /** 部署类型 */
8
+ type: 'docker' | 'static' | 'script' | 'vercel' | 'k8s' | 'ssh' | 'helm' | 'pm2' | 'serverless' | 'sftp';
9
+ /** 构建命令(如 npm run build) */
10
+ build_cmd?: string;
11
+ /** 构建输出目录(static / sftp / ssh 类型用) */
12
+ output_dir?: string;
13
+ /** Dockerfile 路径(docker 类型用,默认 ./Dockerfile) */
14
+ dockerfile?: string;
15
+ /** 镜像仓库地址(docker 类型用) */
16
+ registry?: string;
17
+ /** 镜像名(docker 类型用) */
18
+ image?: string;
19
+ /** 镜像标签(docker 类型用,默认 latest) */
20
+ tag?: string;
21
+ /** 部署目标路径 / CDN 配置 / 服务器地址 / namespace / 函数名 */
22
+ target?: string;
23
+ /** 自定义部署脚本路径或命令(script / k8s / helm 类型用) */
24
+ script?: string;
25
+ /** SSH 服务器地址(ssh 类型用,格式 user@host:port) */
26
+ host?: string;
27
+ /** SSH 私钥路径(ssh / sftp 类型用,默认 ~/.ssh/id_rsa) */
28
+ key?: string;
29
+ /** 远程服务器部署目录(ssh / sftp / pm2 类型用) */
30
+ remote_dir?: string;
31
+ /** PM2 配置文件路径(pm2 类型用,默认 ecosystem.config.js) */
32
+ pm2_config?: string;
33
+ /** Serverless 提供商(serverless 类型用: aliyun-fc / aws-lambda / tencent-scf) */
34
+ provider?: string;
35
+ /** 部署前执行的命令 */
36
+ pre_deploy?: string[];
37
+ /** 部署后执行的命令 */
38
+ post_deploy?: string[];
39
+ }
5
40
  export interface PlatformConfig {
6
41
  /** 端名/工程标识:全局唯一,用于目录名、命令参数、端识别。如: booking-service, h5-mobile, admin-web */
7
42
  name: string;
@@ -17,6 +52,15 @@ export interface PlatformConfig {
17
52
  default_branch: string;
18
53
  /** 对应需求端/功能单元:用于 AI 分析时自动对标需求文档中的功能模块名。如: 预订订单服务, 会议室管理 */
19
54
  requirement_unit?: string;
55
+ /** v8.3.60+: 按环境部署配置 */
56
+ deploy?: {
57
+ /** 测试环境 */
58
+ staging?: DeployEnvConfig;
59
+ /** 生产环境 */
60
+ production?: DeployEnvConfig;
61
+ /** 自定义环境(如 preview, qa) */
62
+ [env: string]: DeployEnvConfig | undefined;
63
+ };
20
64
  }
21
65
  export interface LlmProviderConfig {
22
66
  name: string;
@@ -149,6 +193,11 @@ export declare function loadConfigWithMeta(): Promise<ConfigLoadResult>;
149
193
  export declare function loadProjectConfig(): Promise<ProjectConfig>;
150
194
  /** 获取项目配置 + 元信息 */
151
195
  export declare function loadProjectConfigWithMeta(): Promise<ProjectConfigLoadResult>;
196
+ /**
197
+ * 加载项目配置并叠加环境配置覆盖
198
+ * v8.3.60+: 支持 .speccore/environments/*.yaml 覆盖
199
+ */
200
+ export declare function loadProjectConfigWithEnv(envFileOrName?: string): Promise<ProjectConfig>;
152
201
  /** 兼容旧代码:getConfig = loadConfig */
153
202
  export declare function getConfig(): Promise<SpecConfig>;
154
203
  export declare function saveConfig(config: SpecConfig): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"unified-config.d.ts","sourceRoot":"","sources":["../../src/core/unified-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unified-config.d.ts","sourceRoot":"","sources":["../../src/core/unified-config.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,44 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.DEFAULT_PROJECT_CONFIG = exports.DEFAULT_CONFIG = exports.PROJECT_CURRENT_SCHEMA_VERSION = exports.CURRENT_SCHEMA_VERSION = void 0;
4
37
  exports.loadConfig = loadConfig;
5
38
  exports.loadConfigWithMeta = loadConfigWithMeta;
6
39
  exports.loadProjectConfig = loadProjectConfig;
7
40
  exports.loadProjectConfigWithMeta = loadProjectConfigWithMeta;
41
+ exports.loadProjectConfigWithEnv = loadProjectConfigWithEnv;
8
42
  exports.getConfig = getConfig;
9
43
  exports.saveConfig = saveConfig;
10
44
  exports.saveProjectConfig = saveProjectConfig;
@@ -194,6 +228,61 @@ async function loadProjectConfigWithMeta() {
194
228
  return { config: { ...exports.DEFAULT_PROJECT_CONFIG }, warnings, migrated: false };
195
229
  }
196
230
  }
231
+ /**
232
+ * 加载项目配置并叠加环境配置覆盖
233
+ * v8.3.60+: 支持 .speccore/environments/*.yaml 覆盖
234
+ */
235
+ async function loadProjectConfigWithEnv(envFileOrName) {
236
+ const projectConfig = await loadProjectConfig();
237
+ if (!envFileOrName) {
238
+ return projectConfig;
239
+ }
240
+ // 动态导入避免循环依赖
241
+ const { loadEnvironmentByNameOrPath } = await Promise.resolve().then(() => __importStar(require('./environment-config')));
242
+ const envConfig = await loadEnvironmentByNameOrPath(envFileOrName);
243
+ if (!envConfig) {
244
+ return projectConfig;
245
+ }
246
+ // 深拷贝项目配置,避免修改原对象
247
+ const merged = JSON.parse(JSON.stringify(projectConfig));
248
+ // 叠加环境配置到各端
249
+ for (const platform of merged.platforms) {
250
+ const envPlatform = envConfig.platforms[platform.name];
251
+ if (!envPlatform)
252
+ continue;
253
+ // 叠加 build_cmd(写入 deploy 配置中对应环境)
254
+ const buildCmd = envPlatform.build_cmd || envConfig.defaults?.build_cmd;
255
+ if (buildCmd) {
256
+ if (!platform.deploy)
257
+ platform.deploy = {};
258
+ // 为所有已配置的环境添加 build_cmd,或为 staging 创建默认
259
+ for (const envKey of Object.keys(platform.deploy)) {
260
+ const existing = platform.deploy[envKey];
261
+ if (existing) {
262
+ existing.build_cmd = buildCmd;
263
+ }
264
+ }
265
+ // 若没有任何环境配置,默认写入 staging
266
+ if (Object.keys(platform.deploy).length === 0) {
267
+ platform.deploy.staging = { type: 'script', build_cmd: buildCmd };
268
+ }
269
+ }
270
+ // 叠加 deploy 配置(环境文件中的 deploy 覆盖对应 env 的配置)
271
+ if (envPlatform.deploy) {
272
+ if (!platform.deploy)
273
+ platform.deploy = {};
274
+ const targetEnv = envConfig.env;
275
+ const existing = platform.deploy[targetEnv];
276
+ if (existing) {
277
+ Object.assign(existing, envPlatform.deploy);
278
+ }
279
+ else {
280
+ platform.deploy[targetEnv] = { ...envPlatform.deploy };
281
+ }
282
+ }
283
+ }
284
+ return merged;
285
+ }
197
286
  /** 兼容旧代码:getConfig = loadConfig */
198
287
  async function getConfig() {
199
288
  return loadConfig();