@fantasticit/sumi 0.5.0 → 0.6.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 (29) hide show
  1. package/node_modules/@sumi/create/dist/bin.d.ts +2 -0
  2. package/node_modules/@sumi/create/dist/bin.js +52 -0
  3. package/node_modules/@sumi/create/dist/bin.js.map +1 -0
  4. package/node_modules/@sumi/create/package.json +1 -1
  5. package/node_modules/@sumi/kernel/dist/scope.d.ts +2 -0
  6. package/node_modules/@sumi/kernel/dist/scope.js +5 -1
  7. package/node_modules/@sumi/kernel/dist/scope.js.map +1 -1
  8. package/node_modules/@sumi/kernel/package.json +2 -2
  9. package/node_modules/@sumi/plugin-sdk/package.json +1 -1
  10. package/node_modules/@sumi/plugins-core/README.md +107 -15
  11. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js +392 -45
  12. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js.map +1 -1
  13. package/node_modules/@sumi/plugins-core/dist/test-scope.d.ts +96 -0
  14. package/node_modules/@sumi/plugins-core/dist/test-scope.js +228 -0
  15. package/node_modules/@sumi/plugins-core/dist/test-scope.js.map +1 -0
  16. package/node_modules/@sumi/plugins-core/dist/vitest-runner.d.ts +1 -0
  17. package/node_modules/@sumi/plugins-core/dist/vitest-runner.js +126 -0
  18. package/node_modules/@sumi/plugins-core/dist/vitest-runner.js.map +1 -0
  19. package/node_modules/@sumi/plugins-core/package.json +2 -2
  20. package/node_modules/@sumi/plugins-governance/dist/commands/gate.js +10 -0
  21. package/node_modules/@sumi/plugins-governance/dist/commands/gate.js.map +1 -1
  22. package/node_modules/@sumi/plugins-governance/dist/hooks.d.ts +2 -0
  23. package/node_modules/@sumi/plugins-governance/dist/hooks.js +4 -0
  24. package/node_modules/@sumi/plugins-governance/dist/hooks.js.map +1 -0
  25. package/node_modules/@sumi/plugins-governance/package.json +2 -2
  26. package/node_modules/@sumi/plugins-openspec/package.json +2 -2
  27. package/node_modules/@sumi/plugins-precedent/package.json +3 -3
  28. package/node_modules/@sumi/plugins-review/package.json +3 -3
  29. package/package.json +10 -10
@@ -1,59 +1,399 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { definePlugin, result, splitFileArguments, writeEvidence } from '@sumi/plugin-sdk';
4
- import { findTool, runTool, toRepoPath } from '../lib.js';
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, realpathSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { definePlugin, gitPaths, result, spawnCommandSync, writeEvidence, } from '@sumi/plugin-sdk';
7
+ import { toRepoPath } from '../lib.js';
8
+ import { classifyChanges, decideTestModes, ignoreMatcher, owningPackage, packageManager, parseIgnore, readWorkspace, rootTestScript, stringList, wholeRunReason, } from '../test-scope.js';
9
+ const RUNNER = fileURLToPath(new URL('../vitest-runner.js', import.meta.url));
10
+ const FALLBACK_EXIT = 3;
11
+ const INCOMPATIBLE_EXIT = 4;
5
12
  /**
6
- * 受影响测试:vitest related 运行与改动相关的测试(含规划器注入的测试文件)。
13
+ * with.attribute 归属命令的超时(毫秒),默认 120 秒。
14
+ * SUMI_ATTRIBUTE_TIMEOUT_MS 只供测试注入短超时,不是用户配置。
15
+ */
16
+ function attributeTimeout() {
17
+ const injected = Number(process.env.SUMI_ATTRIBUTE_TIMEOUT_MS);
18
+ return Number.isFinite(injected) && injected > 0 ? injected : 120_000;
19
+ }
20
+ /**
21
+ * 从目录向上查找项目安装的 vitest(vitest/node 入口);找不到时返回 null。
22
+ * 只认项目的 node_modules:Node 解析会读取 NODE_PATH(包管理器的命令垫片会设置它),可能解析到 Sumi 自己依赖里的 vitest。
23
+ */
24
+ function resolveVitest(dir) {
25
+ for (let at = dir;; at = dirname(at)) {
26
+ const manifest = join(at, 'node_modules', 'vitest', 'package.json');
27
+ if (existsSync(manifest)) {
28
+ try {
29
+ return createRequire(manifest).resolve('vitest/node');
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ if (dirname(at) === at)
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * 受影响测试:用 vitest Node API 运行与改动相关的测试(含规划器注入的测试文件),vitest related 追不到的改动改为全部运行;
41
+ * with.workspaces 为 true 时按 workspace 包逐包判定 related、整包或跳过;包外改动可由项目命令(with.attribute)归属到包。
7
42
  * 被注入的具名测试义务逐项回执:跳过、待办、未执行都不算 passed。
8
43
  */
9
44
  await definePlugin((ctx) => {
10
- const vitest = findTool(ctx, 'vitest');
11
- if (!vitest)
12
- return result({ status: 'skipped', summary: '未找到 vitest,请在项目中安装' });
13
- if (!ctx.all && ctx.files.length === 0) {
14
- return result({ status: 'pass', summary: '没有受影响的测试', checked: [] });
45
+ const ignore = parseIgnore(ctx.config.ignore);
46
+ // 配置写错时阻塞:丢弃非法项会退回默认忽略,可能漏测
47
+ if ('error' in ignore)
48
+ return result({ status: 'blocked', summary: `配置非法:${ignore.error}` });
49
+ const deleted = !ctx.all && ctx.base ? gitPaths(ctx.repoRoot, ['diff', '--name-only', '--diff-filter=D', '--no-renames', ctx.base]) : [];
50
+ const raw = [...ctx.files.map((path) => ({ path, deleted: false })), ...deleted.map((path) => ({ path, deleted: true }))];
51
+ const changes = classifyChanges(raw, ignore.default);
52
+ const workspace = ctx.config.workspaces === true;
53
+ const lines = [];
54
+ if (!workspace && Object.keys(ignore.packages).length > 0)
55
+ lines.push('配置提示:单仓模式忽略 with.ignore.packages,只使用 default');
56
+ const note = (summary) => [...lines, summary].join(';');
57
+ const vitest = resolveVitest(ctx.repoRoot);
58
+ if (!workspace && !vitest)
59
+ return result({ status: 'skipped', summary: note('未找到 vitest,请在项目中安装') });
60
+ if (!ctx.all && changes.length === 0)
61
+ return result({ status: 'pass', summary: note('没有受影响的测试'), checked: [] });
62
+ const logs = [];
63
+ const evidence = [];
64
+ let seq = 0;
65
+ /** 在 cwd 运行 vitest:files 为 null 时全部运行。related 求图失败时回退全部运行。 */
66
+ const runVitest = (label, cwd, entry, files) => {
67
+ const once = (list) => {
68
+ const tag = seq === 0 ? `vitest` : `vitest-${seq}`;
69
+ seq++;
70
+ const input = join(ctx.evidenceDir, `${tag}.input.json`);
71
+ const report = join(ctx.evidenceDir, `${tag}.json`);
72
+ const resultFile = join(ctx.evidenceDir, `${tag}.result.json`);
73
+ writeEvidence(ctx, `${tag}.input.json`, JSON.stringify({ vitest: entry, files: list, report, result: resultFile }));
74
+ const r = spawnSync(process.execPath, [RUNNER, input], { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, windowsHide: true });
75
+ logs.push(`## ${label}${list ? '(related)' : '(全部)'}\n${r.stdout ?? ''}${r.stderr ?? ''}${r.error ? `\n无法启动:${r.error.message}` : ''}`);
76
+ const info = existsSync(resultFile)
77
+ ? JSON.parse(readFileSync(resultFile, 'utf8'))
78
+ : undefined;
79
+ if (existsSync(report))
80
+ evidence.push(report);
81
+ return {
82
+ status: r.status,
83
+ info,
84
+ report: existsSync(report) ? JSON.parse(readFileSync(report, 'utf8')) : undefined,
85
+ };
86
+ };
87
+ let r = once(files);
88
+ let fallback = '';
89
+ if (files && r.status === FALLBACK_EXIT) {
90
+ fallback = 'related 无法运行,回退全部运行;';
91
+ r = once(null);
92
+ }
93
+ const note = `${fallback}${r.info?.whole ? `${r.info.whole},全部运行;` : ''}选中 ${r.info?.selected ?? '?'} 个测试文件`;
94
+ if (r.status === INCOMPATIBLE_EXIT)
95
+ return { label, note, blocked: r.info?.incompatible ?? '项目的 vitest 缺少所需 API,需要 vitest >= 3.0' };
96
+ if (r.status === FALLBACK_EXIT)
97
+ return { label, note, blocked: 'vitest 无法启动' };
98
+ if (!r.report)
99
+ return { label, note, blocked: 'vitest 未产出报告' };
100
+ if (r.status !== 0 && r.status !== 1)
101
+ return { label, note, report: r.report, blocked: `vitest 退出码 ${r.status}` };
102
+ if (r.status === 1 && r.report.numFailedTests === 0)
103
+ return { label, note, report: r.report, blocked: 'vitest 失败但没有失败的测试,见日志' };
104
+ return { label, note, report: r.report, selected: r.info?.selected };
105
+ };
106
+ /** 以项目包管理器运行目录下的 test 脚本(测试命令不是单纯 vitest run 时)。 */
107
+ const runScript = (label, cwd, manifest) => {
108
+ const pm = packageManager(ctx.repoRoot);
109
+ const r = spawnCommandSync(pm, ['run', 'test'], { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, windowsHide: true });
110
+ logs.push(`## ${label}(${pm} run test)\n${r.stdout ?? ''}${r.stderr ?? ''}${r.error ? `\n无法启动:${r.error.message}` : ''}`);
111
+ if (r.error)
112
+ return { label, note: `${pm} run test`, blocked: `无法启动 ${pm}:${r.error.message}` };
113
+ return { label, note: `${pm} run test`, scriptFailure: r.status === 0 ? undefined : { file: manifest, status: r.status } };
114
+ };
115
+ const outcomes = [];
116
+ if (!workspace) {
117
+ const reason = ctx.all ? '全量运行' : wholeRunReason(changes);
118
+ const realRoot = realpathSync(ctx.repoRoot);
119
+ const related = changes.filter((c) => c.kind === 'code').map((c) => join(realRoot, c.path));
120
+ if (!reason && related.length === 0)
121
+ return result({ status: 'pass', summary: note('没有受影响的测试'), checked: ctx.files });
122
+ const run = runVitest('项目', realRoot, vitest, reason ? null : related);
123
+ outcomes.push(run);
124
+ lines.push(reason ? `全部运行(${reason},${run.note})` : `related(输入 ${related.length} 个文件,${run.note})`);
125
+ }
126
+ else {
127
+ runWorkspace(ctx, raw, ignore, { runVitest, runScript, outcomes, lines, evidence });
15
128
  }
16
- // 改动文件按命令行安全预算分批(Windows 的 .cmd 经命令解释器,长度上限约 8K),每批单独写报告后合并。
17
- const outputOf = (i) => join(ctx.evidenceDir, i === 0 ? 'vitest.json' : `vitest-${i}.json`);
18
- const fixed = (i) => ctx.all
19
- ? ['run', '--reporter=json', `--outputFile=${outputOf(i)}`, '--passWithNoTests']
20
- : ['related', '--run', '--reporter=json', `--outputFile=${outputOf(i)}`, '--passWithNoTests'];
21
- let batches;
129
+ evidence.unshift(writeEvidence(ctx, 'vitest.log', logs.join('\n')));
130
+ return summarize(ctx, outcomes, lines, evidence);
131
+ });
132
+ /**
133
+ * workspace 模式:改动归属到包,按依赖求下游,逐包判定并运行;最后按 runRoot 运行仓库根自己的测试。
134
+ * with.rootTest 为 false 时根 test 不参与(读不出包时阻塞,不回退根测试);包外改动有 with.attribute 时交给项目命令归属。
135
+ */
136
+ function runWorkspace(ctx, raw, ignore, runners) {
137
+ const { outcomes, lines } = runners;
138
+ const useRoot = ctx.config.rootTest !== false;
139
+ const rootTest = rootTestScript(ctx.repoRoot);
140
+ const ws = readWorkspace(ctx.repoRoot);
141
+ if ('error' in ws) {
142
+ if (!useRoot) {
143
+ outcomes.push({ label: 'workspace', note: '', blocked: `${ws.error},rootTest 为 false,不能回退为运行根 test 脚本` });
144
+ return;
145
+ }
146
+ lines.push(`全部运行(${ws.error})`);
147
+ outcomes.push(rootTest
148
+ ? runWhole(ctx.repoRoot, '仓库根', rootTest, 'package.json', runners)
149
+ : { label: '仓库根', note: '', blocked: rootTest === null ? '根 package.json 不存在' : '根 package.json 没有 test 脚本' });
150
+ return;
151
+ }
152
+ const { packages } = ws;
153
+ const config = checkWorkspaceConfig(ctx, ignore, packages);
154
+ if (config.error) {
155
+ outcomes.push({ label: '配置非法', note: '', blocked: config.error });
156
+ return;
157
+ }
158
+ lines.push(...config.notes.map((n) => `配置提示:${n}`));
159
+ const byPackage = new Map();
160
+ const outside = [];
161
+ for (const change of classifyChanges(raw, ignoreMatcher(ignore, packages))) {
162
+ if (change.kind === 'ignored')
163
+ continue;
164
+ const pkg = owningPackage(packages, change.path);
165
+ if (!pkg) {
166
+ outside.push({ path: change.path, deleted: change.deleted });
167
+ continue;
168
+ }
169
+ const rel = change.path.slice(pkg.rel.length + 1);
170
+ byPackage.set(pkg.name, [...(byPackage.get(pkg.name) ?? []), { ...change, rel, abs: join(pkg.dir, rel) }]);
171
+ }
172
+ let wholeAll = ctx.all ? '全量运行' : undefined;
173
+ let attributed;
174
+ if (!wholeAll && outside.length > 0) {
175
+ const a = ctx.config.attribute === undefined ? undefined : attributeOutside(ctx, outside, packages, runners.evidence);
176
+ if (a && 'attributed' in a) {
177
+ attributed = a.attributed;
178
+ lines.push(a.note);
179
+ }
180
+ else {
181
+ if (a)
182
+ lines.push(`全部运行(${a.all})`);
183
+ wholeAll = `改动 ${outside[0].path} 不属于任何包${a ? ',未能归属' : ''}`;
184
+ }
185
+ }
186
+ const decisions = decideTestModes(packages, byPackage, {
187
+ wholePackages: wholePackages(ctx.config.wholePackages),
188
+ sourceGuards: sourceGuards(ctx.config.sourceGuards),
189
+ wholeAll,
190
+ attributed,
191
+ noPropagate: new Set(stringList(ctx.config.noPropagate) ?? []),
192
+ });
193
+ writeEvidence(ctx, 'modes.json', JSON.stringify(decisions, null, 2));
194
+ const byName = new Map(packages.map((p) => [p.name, p]));
195
+ for (const d of decisions)
196
+ lines.push(runPackage(byName.get(d.name), d, runners));
197
+ if (!useRoot)
198
+ return;
199
+ const line = runRoot(ctx.repoRoot, rootTest, wholeAll, outside[0]?.path, byPackage, runners);
200
+ if (line)
201
+ lines.push(line);
202
+ }
203
+ /**
204
+ * 检查 workspace 扩展配置。sourceGuards 的值不是字符串数组、with.ignore.packages 的包不存在时返回 error(覆盖落空会退回默认忽略,可能漏测);
205
+ * wholePackages、sourceGuards、noPropagate 的包不存在、sourceGuards 的路径不存在时只给出提示(只会多跑或无影响)。
206
+ */
207
+ function checkWorkspaceConfig(ctx, ignore, packages) {
208
+ const byName = new Map(packages.map((p) => [p.name, p]));
209
+ const missing = (names) => [...names].filter((name) => !byName.has(name));
210
+ const unknownIgnore = missing(Object.keys(ignore.packages));
211
+ if (unknownIgnore.length)
212
+ return { error: `with.ignore.packages 中的包 ${unknownIgnore.join('、')} 不存在于 workspace`, notes: [] };
213
+ const guards = sourceGuards(ctx.config.sourceGuards);
214
+ const badGuard = Object.entries(guards).find(([, paths]) => !stringList(paths));
215
+ if (badGuard)
216
+ return { error: `with.sourceGuards.${badGuard[0]} 应为字符串数组`, notes: [] };
217
+ const notes = [];
218
+ const lists = [
219
+ ['wholePackages', wholePackages(ctx.config.wholePackages).keys()],
220
+ ['sourceGuards', Object.keys(guards)],
221
+ ['noPropagate', stringList(ctx.config.noPropagate) ?? []],
222
+ ];
223
+ for (const [key, names] of lists) {
224
+ const unknown = missing(names);
225
+ if (unknown.length)
226
+ notes.push(`with.${key} 中的包 ${unknown.join('、')} 不存在于 workspace`);
227
+ }
228
+ for (const [name, paths] of Object.entries(guards)) {
229
+ const pkg = byName.get(name);
230
+ const absent = pkg ? paths.filter((rel) => !existsSync(join(pkg.dir, rel))) : [];
231
+ if (absent.length)
232
+ notes.push(`with.sourceGuards 中 ${name} 的守卫测试 ${absent.join('、')} 不存在`);
233
+ }
234
+ return { notes };
235
+ }
236
+ /**
237
+ * with.attribute:以项目命令把包外改动归属到包。命令在仓库根运行,stdin 为
238
+ * { repoRoot, base, files: [{ path, deleted }], packages: [{ name, dir, manifest }] },stdout 为 { packages: [包名], reasons?: [说明], all?: boolean }。
239
+ * 命令无法启动、超时、非零退出、输出非法或返回未知包名时返回 all(全部运行,宁可多跑)。
240
+ */
241
+ function attributeOutside(ctx, files, packages, evidence) {
242
+ const argv = stringList(ctx.config.attribute);
243
+ if (!argv?.length)
244
+ return { all: 'with.attribute 不是非空的命令数组' };
245
+ const input = JSON.stringify({
246
+ repoRoot: ctx.repoRoot,
247
+ base: ctx.base,
248
+ files,
249
+ packages: packages.map((p) => ({ name: p.name, dir: p.rel, manifest: `${p.rel}/package.json` })),
250
+ });
251
+ const [cmd, ...args] = argv;
252
+ const timeout = attributeTimeout();
253
+ const r = spawnCommandSync(cmd, args, {
254
+ cwd: ctx.repoRoot,
255
+ encoding: 'utf8',
256
+ input,
257
+ maxBuffer: 64 * 1024 * 1024,
258
+ timeout,
259
+ windowsHide: true,
260
+ });
261
+ evidence.push(writeEvidence(ctx, 'attribute.log', `$ ${argv.join(' ')}\n## stdin\n${input}\n## stdout\n${r.stdout ?? ''}\n## stderr\n${r.stderr ?? ''}${r.error ? `\n## error\n${r.error.message}` : ''}`));
262
+ const fail = (why) => ({ all: `归属命令 ${argv.join(' ')} ${why},见 attribute.log` });
263
+ if (r.error?.code === 'ETIMEDOUT')
264
+ return fail(`超时(${timeout / 1000} 秒)`);
265
+ if (r.error)
266
+ return fail(`无法启动:${r.error.message}`);
267
+ if (r.status !== 0)
268
+ return fail(r.status === null ? `被信号 ${r.signal} 终止` : `退出码 ${r.status}`);
269
+ let out;
22
270
  try {
23
- batches = ctx.all ? [[]] : splitFileArguments(vitest, fixed(9999), ctx.files);
271
+ out = JSON.parse(r.stdout ?? '');
24
272
  }
25
- catch (error) {
26
- return result({ status: 'blocked', summary: `无法运行 vitest:${error.message}` });
273
+ catch {
274
+ return fail('的输出不是 JSON');
27
275
  }
28
- const runs = batches.map((batch, i) => runTool(ctx, vitest, [...fixed(i), ...batch]));
29
- const evidence = [writeEvidence(ctx, 'vitest.log', runs.map((r) => r.stdout + r.stderr).join(''))];
30
- const outputs = batches.map((_, i) => outputOf(i));
31
- if (!outputs.every((o) => existsSync(o)))
32
- return result({ status: 'blocked', summary: 'vitest 未产出报告', evidence });
33
- evidence.push(...outputs);
34
- const reports = outputs.map((o) => JSON.parse(readFileSync(o, 'utf8')));
35
- // 不同批次可能关联到同一个测试文件,同名结果只保留一份,总数按去重后的结果计算
36
- const testResults = [...new Map(reports.flatMap((x) => x.testResults).map((t) => [t.name, t])).values()];
37
- const assertions = testResults.flatMap((t) => t.assertionResults);
38
- const report = {
39
- numTotalTests: batches.length === 1 ? reports[0].numTotalTests : assertions.length,
40
- numFailedTests: batches.length === 1 ? reports[0].numFailedTests : assertions.filter((a) => a.status === 'failed').length,
41
- testResults,
276
+ const { packages: names, reasons = [], all } = (out && typeof out === 'object' ? out : {});
277
+ const why = stringList(reasons);
278
+ if (!out || typeof out !== 'object' || Array.isArray(out) || (all !== undefined && typeof all !== 'boolean') || !why)
279
+ return fail('的输出格式不对(应为 { packages, reasons?, all? })');
280
+ const detail = why.length ? `:${why.join(';')}` : '';
281
+ if (all === true)
282
+ return { all: `包外改动无法归属${detail}` };
283
+ const list = stringList(names);
284
+ if (!list)
285
+ return fail('的输出缺少 packages 包名数组');
286
+ const known = new Set(packages.map((p) => p.name));
287
+ const unknown = list.filter((name) => !known.has(name));
288
+ if (unknown.length)
289
+ return fail(`返回了未知的包 ${unknown.join('、')}`);
290
+ const because = why.length ? `(${why.join(';')})` : '';
291
+ return {
292
+ attributed: new Set(list),
293
+ note: list.length ? `包外改动归属到 ${list.join('、')}${because}` : `包外改动不影响任何包${because}`,
294
+ };
295
+ }
296
+ /**
297
+ * 仓库根自己的测试(宁可多跑:根配置若也扫描子包测试,这些测试会再运行一次)。
298
+ * 包外改动或全量运行:整体运行根 test 脚本。只有包内改动时:根 test 是 vitest run 则在根上以全部包内改动运行一次 related
299
+ * (有配置、删除或非 JS/TS 改动时整体运行);根 test 不是单纯 vitest run(带参数、多份配置、pnpm -r 等)时无法按文件选择,整体运行。
300
+ */
301
+ function runRoot(root, rootTest, wholeAll, outside, byPackage, runners) {
302
+ const changes = [...byPackage.values()].flat();
303
+ if (!rootTest)
304
+ return outside ? '仓库根:根没有 test 脚本,包外改动未运行根测试' : undefined;
305
+ const whole = (reason) => {
306
+ runners.outcomes.push(runWhole(root, '仓库根', rootTest, 'package.json', runners));
307
+ return `仓库根:整包(${reason})`;
42
308
  };
43
- const r = { status: runs.find((run) => run.status !== 0)?.status ?? 0 };
309
+ if (wholeAll)
310
+ return whole(wholeAll);
311
+ // 包外改动已归属到包时,根自己的测试仍可能受这些改动影响,整体运行
312
+ if (outside)
313
+ return whole(`改动 ${outside} 不属于任何包`);
314
+ if (changes.length === 0)
315
+ return undefined;
316
+ const entry = resolveVitest(root);
317
+ if (rootTest.trim() === 'vitest run' && entry) {
318
+ const reason = wholeRunReason(changes);
319
+ if (reason)
320
+ return whole(reason);
321
+ const files = changes.map((c) => c.abs);
322
+ const run = runners.runVitest('仓库根', realpathSync(root), entry, files);
323
+ runners.outcomes.push(run);
324
+ return `仓库根:related(输入 ${files.length} 个包内改动文件,${run.note})`;
325
+ }
326
+ return whole(rootTest.trim() === 'vitest run' ? '未找到 vitest' : 'test 脚本不是 vitest run');
327
+ }
328
+ /** 整包运行:test 脚本是 vitest run 时由运行器全部运行(保留逐条结果),否则以包管理器运行 test 脚本。 */
329
+ function runWhole(dir, label, test, manifest, { runVitest, runScript }) {
330
+ const entry = resolveVitest(dir);
331
+ return entry && test?.trim() === 'vitest run' ? runVitest(label, dir, entry, null) : runScript(label, dir, manifest);
332
+ }
333
+ function runPackage(pkg, d, runners) {
334
+ if (d.mode === 'skip')
335
+ return `${d.name}:跳过(${d.reason})`;
336
+ const entry = resolveVitest(pkg.dir);
337
+ if (d.mode === 'related' && entry) {
338
+ const run = runners.runVitest(d.name, pkg.dir, entry, d.files);
339
+ if (run.selected === 0 && !d.own)
340
+ return `${d.name}:跳过(related 没有选中测试)`;
341
+ runners.outcomes.push(run);
342
+ return `${d.name}:related(${d.reason},${run.note})`;
343
+ }
344
+ runners.outcomes.push(runWhole(pkg.dir, d.name, pkg.test, `${pkg.rel}/package.json`, runners));
345
+ return `${d.name}:整包(${d.mode === 'related' ? '未找到 vitest' : d.reason})`;
346
+ }
347
+ /** with.sourceGuards:包名 → 相对包目录的守卫测试路径。 */
348
+ function sourceGuards(value) {
349
+ return (value && typeof value === 'object' && !Array.isArray(value) ? value : {});
350
+ }
351
+ /** with.wholePackages:包名列表,或包名 → 原因。 */
352
+ function wholePackages(value) {
353
+ if (Array.isArray(value))
354
+ return new Map(value.map((name) => [String(name), '']));
355
+ if (value && typeof value === 'object')
356
+ return new Map(Object.entries(value).map(([k, v]) => [k, String(v ?? '')]));
357
+ return new Map();
358
+ }
359
+ function summarize(ctx, outcomes, lines, evidence) {
44
360
  const findings = [];
45
361
  const executed = new Map();
46
- for (const file of report.testResults) {
47
- const rel = toRepoPath(ctx.repoRoot, file.name);
48
- executed.set(rel, file.assertionResults);
49
- for (const a of file.assertionResults.filter((x) => x.status === 'failed')) {
362
+ let total = 0;
363
+ for (const outcome of outcomes) {
364
+ for (const file of outcome.report?.testResults ?? []) {
365
+ const rel = toRepoPath(ctx.repoRoot, file.name);
366
+ executed.set(rel, [...(executed.get(rel) ?? []), ...file.assertionResults]);
367
+ total += file.assertionResults.length;
368
+ for (const a of file.assertionResults.filter((x) => x.status === 'failed')) {
369
+ findings.push({
370
+ id: `F${findings.length + 1}`,
371
+ rule: 'test-failed',
372
+ severity: 'error',
373
+ message: `${a.fullName}:${(a.failureMessages?.[0] ?? '').split('\n')[0]}`,
374
+ file: rel,
375
+ subject: a.fullName,
376
+ });
377
+ }
378
+ // 测试文件本身加载失败(语法错误、导入失败)时没有失败的断言,按文件报告
379
+ if (file.status === 'failed' && !file.assertionResults.some((x) => x.status === 'failed')) {
380
+ findings.push({
381
+ id: `F${findings.length + 1}`,
382
+ rule: 'test-failed',
383
+ severity: 'error',
384
+ message: `测试文件失败:${(file.message ?? '').split('\n')[0]}`,
385
+ file: rel,
386
+ });
387
+ }
388
+ }
389
+ if (outcome.scriptFailure) {
50
390
  findings.push({
51
391
  id: `F${findings.length + 1}`,
52
392
  rule: 'test-failed',
53
393
  severity: 'error',
54
- message: `${a.fullName}:${(a.failureMessages?.[0] ?? '').split('\n')[0]}`,
55
- file: rel,
56
- subject: a.fullName,
394
+ message: `${outcome.label} 的 test 脚本失败(退出码 ${outcome.scriptFailure.status}),见 vitest.log`,
395
+ file: outcome.scriptFailure.file,
396
+ subject: outcome.label,
57
397
  });
58
398
  }
59
399
  }
@@ -69,14 +409,21 @@ await definePlugin((ctx) => {
69
409
  return { id: o.id, outcome: 'failed' };
70
410
  return { id: o.id, outcome: 'skipped', detail: `测试状态为 ${match.status}` };
71
411
  });
72
- const failed = findings.length > 0 || (r.status !== 0 && report.numFailedTests > 0);
412
+ const blocked = outcomes.filter((o) => o.blocked).map((o) => `${o.label}:${o.blocked}`);
413
+ const verdict = findings.length > 0
414
+ ? `${findings.length} 个测试失败`
415
+ : blocked.length > 0
416
+ ? blocked.join(';')
417
+ : outcomes.length === 0
418
+ ? '没有需要运行的测试'
419
+ : `测试通过(${total} 个)`;
73
420
  return result({
74
- status: failed ? 'fail' : r.status !== 0 ? 'blocked' : 'pass',
75
- summary: failed ? `${findings.length} 个测试失败` : `测试通过(${report.numTotalTests} 个)`,
421
+ status: findings.length > 0 ? 'fail' : blocked.length > 0 ? 'blocked' : 'pass',
422
+ summary: [...lines, verdict].join(';'),
76
423
  findings,
77
424
  checked: ctx.all ? 'all' : ctx.files,
78
425
  evidence,
79
426
  obligations: receipts,
80
427
  });
81
- });
428
+ }
82
429
  //# sourceMappingURL=test-affected.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-affected.js","sourceRoot":"","sources":["../../src/plugins/test-affected.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-affected.js","sourceRoot":"","sources":["../../src/plugins/test-affected.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * 受影响测试的范围判定(纯逻辑,供 core/test-affected 使用)。
3
+ *
4
+ * vitest related 只沿 import 图追踪,以下改动它追不到或不会整体重跑,因此按“全部运行”处理:
5
+ * 配置文件(package.json、tsconfig、vite(st) 配置、vitest workspace/projects 文件)、删除的文件(已不在 import 图中)、
6
+ * 非 JS/TS 文件(`?raw`、fs 读取的数据文件;按文件名找引用者会被同名文件误导)。被 ignore 匹配的文件(默认 .md)不计入。
7
+ */
8
+ export type FileKind = 'config' | 'code' | 'data' | 'ignored';
9
+ export interface Change {
10
+ /** 相对仓库根的路径(/ 分隔)。 */
11
+ path: string;
12
+ deleted: boolean;
13
+ }
14
+ export interface ClassifiedChange extends Change {
15
+ kind: FileKind;
16
+ }
17
+ export declare const DEFAULT_IGNORE: string[];
18
+ /** 按类别归类改动;删除的文件归为 config(同样需要全部运行)。ignore 为 glob 列表(相对仓库根)或判定函数。 */
19
+ export declare function classifyChanges(changes: Change[], ignore?: string[] | ((path: string) => boolean)): ClassifiedChange[];
20
+ /** with.ignore:default 为相对仓库根的 glob;packages 按包覆盖(glob 相对包目录),覆盖时替换 default。 */
21
+ export interface IgnoreConfig {
22
+ default: string[];
23
+ packages: Record<string, string[]>;
24
+ }
25
+ export declare const stringList: (value: unknown) => string[] | undefined;
26
+ /**
27
+ * 解析 with.ignore:数组为全局列表(原语义);对象为 { default?, packages? };未给出时为默认值。
28
+ * 写错时返回 error(调用方阻塞):丢弃非法项会退回默认忽略,可能漏测。
29
+ */
30
+ export declare function parseIgnore(value: unknown): IgnoreConfig | {
31
+ error: string;
32
+ };
33
+ /** 按包解析 ignore 的判定函数:文件所属包有覆盖时用覆盖(相对包目录匹配),否则用 default(相对仓库根匹配)。 */
34
+ export declare function ignoreMatcher(config: IgnoreConfig, packages?: WorkspacePackage[]): (path: string) => boolean;
35
+ /** 需要全部运行的原因(第一个不是 JS/TS 源码的相关改动);没有时返回 null。 */
36
+ export declare function wholeRunReason(changes: ClassifiedChange[]): string | null;
37
+ export interface WorkspacePackage {
38
+ name: string;
39
+ /** 相对仓库根的包目录(/ 分隔)。 */
40
+ rel: string;
41
+ /** 包目录的绝对路径(真实路径)。 */
42
+ dir: string;
43
+ test?: string;
44
+ /** workspace 内部依赖的包名。 */
45
+ deps: string[];
46
+ }
47
+ export type WorkspaceRead = {
48
+ packages: WorkspacePackage[];
49
+ } | {
50
+ error: string;
51
+ };
52
+ /**
53
+ * 读出 workspace 包。只支持 `dir` 与 `dir/*` 两种写法;遇到 `**`、`!` 等其他写法,或一个包也没有匹配到时返回 error,
54
+ * 由调用方回退为运行仓库根的 test 脚本(关闭根测试时阻塞;不能因为包列表为空而通过)。
55
+ */
56
+ export declare function readWorkspace(root: string): WorkspaceRead;
57
+ /** 文件所属的包(包目录嵌套时取最深的一个)。 */
58
+ export declare function owningPackage(packages: WorkspacePackage[], path: string): WorkspacePackage | undefined;
59
+ export interface PackageChange extends ClassifiedChange {
60
+ /** 相对包目录的路径。 */
61
+ rel: string;
62
+ /** 绝对路径(真实路径)。 */
63
+ abs: string;
64
+ }
65
+ export interface Decision {
66
+ name: string;
67
+ mode: 'related' | 'whole' | 'skip';
68
+ reason: string;
69
+ /** related 的输入文件(绝对路径)。 */
70
+ files?: string[];
71
+ /** 本包自身有相关改动(related 选中 0 个时据此区分“没有相关测试”与“跳过”)。 */
72
+ own?: boolean;
73
+ }
74
+ export interface DecideOptions {
75
+ /** 只要成为候选就整包运行的包:包名 → 原因。 */
76
+ wholePackages?: Map<string, string>;
77
+ /** 本包有源码改动时追加到 related 输入的守卫测试:包名 → 相对包目录的路径。 */
78
+ sourceGuards?: Record<string, string[]>;
79
+ /** 全部运行的原因:给出时每个有 test 脚本的包都整包。 */
80
+ wholeAll?: string;
81
+ /** 包外改动归属到的包(with.attribute 的结果):按配置改动对待,整包运行并带动下游整包。 */
82
+ attributed?: Set<string>;
83
+ /** 改动不带出下游候选的包(with.noPropagate);自身仍按规则判定。 */
84
+ noPropagate?: Set<string>;
85
+ }
86
+ /**
87
+ * 逐包判定模式:候选包为有改动(或被归属包外改动)的包及其下游;noPropagate 中的包不带出下游。
88
+ * changes:包名 → 该包的改动(不含 ignored)。
89
+ */
90
+ export declare function decideTestModes(packages: WorkspacePackage[], changes: Map<string, PackageChange[]>, opts?: DecideOptions): Decision[];
91
+ /** 仓库根 package.json 的 test 脚本;没有 package.json 时返回 null。 */
92
+ export declare function rootTestScript(root: string): string | undefined | null;
93
+ /** 比较路径用的键:绝对路径、/ 分隔;Windows 文件系统大小写不敏感,统一小写。 */
94
+ export declare function pathKey(file: string, platform?: NodeJS.Platform): string;
95
+ /** 项目的包管理器:package.json 的 packageManager 字段,其次按锁文件判断,默认 npm。 */
96
+ export declare function packageManager(root: string): string;