soloforge 1.0.0 → 1.1.1

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 (182) hide show
  1. package/README.md +4 -1
  2. package/dist/adapters/claude_code/claude_md.d.ts +1 -2
  3. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
  4. package/dist/adapters/claude_code/claude_md.js +2 -76
  5. package/dist/adapters/claude_code/claude_md.js.map +1 -1
  6. package/dist/adapters/claude_code/server.d.ts +16 -0
  7. package/dist/adapters/claude_code/server.d.ts.map +1 -1
  8. package/dist/adapters/claude_code/server.js +17 -1
  9. package/dist/adapters/claude_code/server.js.map +1 -1
  10. package/dist/adapters/claude_code/tools.d.ts +32 -1
  11. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  12. package/dist/adapters/claude_code/tools.js +65 -30
  13. package/dist/adapters/claude_code/tools.js.map +1 -1
  14. package/dist/adapters/codex/codex_config.d.ts +3 -0
  15. package/dist/adapters/codex/codex_config.d.ts.map +1 -0
  16. package/dist/adapters/codex/codex_config.js +51 -0
  17. package/dist/adapters/codex/codex_config.js.map +1 -0
  18. package/dist/adapters/codex/codex_rules.d.ts +2 -0
  19. package/dist/adapters/codex/codex_rules.d.ts.map +1 -0
  20. package/dist/adapters/codex/codex_rules.js +5 -0
  21. package/dist/adapters/codex/codex_rules.js.map +1 -0
  22. package/dist/adapters/shared/workflow_template.d.ts +3 -0
  23. package/dist/adapters/shared/workflow_template.d.ts.map +1 -0
  24. package/dist/adapters/shared/workflow_template.js +78 -0
  25. package/dist/adapters/shared/workflow_template.js.map +1 -0
  26. package/dist/adapters/trae/trae_rules.d.ts +1 -2
  27. package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
  28. package/dist/adapters/trae/trae_rules.js +2 -75
  29. package/dist/adapters/trae/trae_rules.js.map +1 -1
  30. package/dist/bin/soloforge.js +171 -22
  31. package/dist/bin/soloforge.js.map +1 -1
  32. package/dist/engine/change_coordinator.d.ts +20 -5
  33. package/dist/engine/change_coordinator.d.ts.map +1 -1
  34. package/dist/engine/change_coordinator.js +36 -22
  35. package/dist/engine/change_coordinator.js.map +1 -1
  36. package/dist/engine/classifier.d.ts +7 -0
  37. package/dist/engine/classifier.d.ts.map +1 -1
  38. package/dist/engine/classifier.js +75 -3
  39. package/dist/engine/classifier.js.map +1 -1
  40. package/dist/engine/code_reviewer.d.ts +37 -1
  41. package/dist/engine/code_reviewer.d.ts.map +1 -1
  42. package/dist/engine/code_reviewer.js +126 -24
  43. package/dist/engine/code_reviewer.js.map +1 -1
  44. package/dist/engine/confidence_scorer.d.ts +21 -0
  45. package/dist/engine/confidence_scorer.d.ts.map +1 -1
  46. package/dist/engine/confidence_scorer.js +19 -6
  47. package/dist/engine/confidence_scorer.js.map +1 -1
  48. package/dist/engine/contract_guard.d.ts +23 -0
  49. package/dist/engine/contract_guard.d.ts.map +1 -1
  50. package/dist/engine/contract_guard.js +152 -43
  51. package/dist/engine/contract_guard.js.map +1 -1
  52. package/dist/engine/convention_detector.d.ts +20 -0
  53. package/dist/engine/convention_detector.d.ts.map +1 -1
  54. package/dist/engine/convention_detector.js +19 -1
  55. package/dist/engine/convention_detector.js.map +1 -1
  56. package/dist/engine/debt_reporter.d.ts +5 -0
  57. package/dist/engine/debt_reporter.d.ts.map +1 -1
  58. package/dist/engine/debt_reporter.js +30 -6
  59. package/dist/engine/debt_reporter.js.map +1 -1
  60. package/dist/engine/debt_tracker.d.ts +52 -0
  61. package/dist/engine/debt_tracker.d.ts.map +1 -1
  62. package/dist/engine/debt_tracker.js +66 -1
  63. package/dist/engine/debt_tracker.js.map +1 -1
  64. package/dist/engine/debugger.d.ts +9 -0
  65. package/dist/engine/debugger.d.ts.map +1 -1
  66. package/dist/engine/debugger.js +112 -20
  67. package/dist/engine/debugger.js.map +1 -1
  68. package/dist/engine/delivery.d.ts +27 -0
  69. package/dist/engine/delivery.d.ts.map +1 -1
  70. package/dist/engine/delivery.js +67 -13
  71. package/dist/engine/delivery.js.map +1 -1
  72. package/dist/engine/dependency_scanner.d.ts +5 -8
  73. package/dist/engine/dependency_scanner.d.ts.map +1 -1
  74. package/dist/engine/dependency_scanner.js +46 -29
  75. package/dist/engine/dependency_scanner.js.map +1 -1
  76. package/dist/engine/evolver.d.ts +54 -0
  77. package/dist/engine/evolver.d.ts.map +1 -1
  78. package/dist/engine/evolver.js +159 -6
  79. package/dist/engine/evolver.js.map +1 -1
  80. package/dist/engine/exploration.d.ts +114 -0
  81. package/dist/engine/exploration.d.ts.map +1 -0
  82. package/dist/engine/exploration.js +414 -0
  83. package/dist/engine/exploration.js.map +1 -0
  84. package/dist/engine/failure_classifier.d.ts +28 -0
  85. package/dist/engine/failure_classifier.d.ts.map +1 -1
  86. package/dist/engine/failure_classifier.js +51 -5
  87. package/dist/engine/failure_classifier.js.map +1 -1
  88. package/dist/engine/git_deps.d.ts +29 -0
  89. package/dist/engine/git_deps.d.ts.map +1 -1
  90. package/dist/engine/git_deps.js +1 -0
  91. package/dist/engine/git_deps.js.map +1 -1
  92. package/dist/engine/impact_analyzer.d.ts +17 -0
  93. package/dist/engine/impact_analyzer.d.ts.map +1 -1
  94. package/dist/engine/impact_analyzer.js +76 -4
  95. package/dist/engine/impact_analyzer.js.map +1 -1
  96. package/dist/engine/intent_expander.d.ts +58 -0
  97. package/dist/engine/intent_expander.d.ts.map +1 -1
  98. package/dist/engine/intent_expander.js +173 -1
  99. package/dist/engine/intent_expander.js.map +1 -1
  100. package/dist/engine/migration_guard.d.ts +6 -0
  101. package/dist/engine/migration_guard.d.ts.map +1 -1
  102. package/dist/engine/migration_guard.js +26 -7
  103. package/dist/engine/migration_guard.js.map +1 -1
  104. package/dist/engine/observability.d.ts +31 -7
  105. package/dist/engine/observability.d.ts.map +1 -1
  106. package/dist/engine/observability.js +88 -28
  107. package/dist/engine/observability.js.map +1 -1
  108. package/dist/engine/onboarding.d.ts +41 -1
  109. package/dist/engine/onboarding.d.ts.map +1 -1
  110. package/dist/engine/onboarding.js +83 -8
  111. package/dist/engine/onboarding.js.map +1 -1
  112. package/dist/engine/scaffolder.d.ts +10 -0
  113. package/dist/engine/scaffolder.d.ts.map +1 -1
  114. package/dist/engine/scaffolder.js +55 -10
  115. package/dist/engine/scaffolder.js.map +1 -1
  116. package/dist/engine/scope_controller.d.ts +13 -0
  117. package/dist/engine/scope_controller.d.ts.map +1 -1
  118. package/dist/engine/scope_controller.js +76 -12
  119. package/dist/engine/scope_controller.js.map +1 -1
  120. package/dist/engine/task_context.d.ts +124 -0
  121. package/dist/engine/task_context.d.ts.map +1 -1
  122. package/dist/engine/task_context.js +155 -7
  123. package/dist/engine/task_context.js.map +1 -1
  124. package/dist/engine/task_planner.d.ts +17 -0
  125. package/dist/engine/task_planner.d.ts.map +1 -1
  126. package/dist/engine/task_planner.js +51 -4
  127. package/dist/engine/task_planner.js.map +1 -1
  128. package/dist/engine/team_awareness.d.ts +17 -0
  129. package/dist/engine/team_awareness.d.ts.map +1 -1
  130. package/dist/engine/team_awareness.js +29 -11
  131. package/dist/engine/team_awareness.js.map +1 -1
  132. package/dist/engine/test_generator.d.ts +5 -4
  133. package/dist/engine/test_generator.d.ts.map +1 -1
  134. package/dist/engine/test_generator.js +22 -5
  135. package/dist/engine/test_generator.js.map +1 -1
  136. package/dist/engine/test_quality.d.ts +11 -4
  137. package/dist/engine/test_quality.d.ts.map +1 -1
  138. package/dist/engine/test_quality.js +171 -14
  139. package/dist/engine/test_quality.js.map +1 -1
  140. package/dist/engine/verifier.d.ts +41 -0
  141. package/dist/engine/verifier.d.ts.map +1 -1
  142. package/dist/engine/verifier.js +110 -1
  143. package/dist/engine/verifier.js.map +1 -1
  144. package/dist/git/operations.d.ts +1 -0
  145. package/dist/git/operations.d.ts.map +1 -1
  146. package/dist/git/operations.js +3 -0
  147. package/dist/git/operations.js.map +1 -1
  148. package/dist/index.d.ts +9 -0
  149. package/dist/index.d.ts.map +1 -1
  150. package/dist/index.js +14 -0
  151. package/dist/index.js.map +1 -1
  152. package/dist/knowledge/index_manager.d.ts +7 -1
  153. package/dist/knowledge/index_manager.d.ts.map +1 -1
  154. package/dist/knowledge/index_manager.js +112 -37
  155. package/dist/knowledge/index_manager.js.map +1 -1
  156. package/dist/knowledge/loader.d.ts +31 -0
  157. package/dist/knowledge/loader.d.ts.map +1 -1
  158. package/dist/knowledge/loader.js +102 -8
  159. package/dist/knowledge/loader.js.map +1 -1
  160. package/dist/types.d.ts +608 -0
  161. package/dist/types.d.ts.map +1 -1
  162. package/package.json +1 -1
  163. package/templates/knowledge/acceptance_templates//346/212/200/346/234/257/351/200/211/345/236/213/351/252/214/346/224/266/346/270/205/345/215/225.md +19 -0
  164. package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +4 -0
  165. package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +4 -1
  166. package/templates/knowledge/procedures//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +34 -0
  167. package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +66 -0
  168. package/templates/scaffolds/react/Form.tsx.hbs +9 -1
  169. package/templates/scaffolds/react/List.tsx.hbs +10 -1
  170. package/templates/scaffolds/react/Page.tsx.hbs +4 -1
  171. package/templates/scaffolds/react/service.ts.hbs +29 -0
  172. package/templates/scaffolds/react/types.ts.hbs +7 -1
  173. package/templates/scaffolds/react/use{{ModuleName}}.ts.hbs +34 -2
  174. package/templates/scaffolds/spring-boot/Controller.java.hbs +27 -0
  175. package/templates/scaffolds/spring-boot/DTO.java.hbs +7 -1
  176. package/templates/scaffolds/spring-boot/Entity.java.hbs +11 -1
  177. package/templates/scaffolds/spring-boot/ErrorCode.java.hbs +13 -1
  178. package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
  179. package/templates/scaffolds/spring-boot/PageResponse.java.hbs +24 -1
  180. package/templates/scaffolds/spring-boot/Service.java.hbs +32 -0
  181. package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +23 -5
  182. package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +7 -1
@@ -1,3 +1,8 @@
1
+ /**
2
+ * 获取完整的团队态势信息,包括活动流、成员工作负载、过期分支和知识更新。
3
+ * @param input - 团队态势感知输入参数
4
+ * @returns 团队状态结果,包含活动流、成员工作量、过期分支、知识更新和中文摘要
5
+ */
1
6
  export async function getTeamStatus(input) {
2
7
  const { projectPath, gitOps, knowledgeIndex } = input;
3
8
  const since = input.since ?? defaultSince();
@@ -8,7 +13,7 @@ export async function getTeamStatus(input) {
8
13
  stale_branches: [],
9
14
  summary: "",
10
15
  };
11
- // 1. Activity feed
16
+ // 1. 获取活动流(近 50 条提交记录)
12
17
  try {
13
18
  const log = await gitOps.getLog(projectPath, { since, maxCount: 50 });
14
19
  result.activity_feed = log.map((entry) => ({
@@ -16,13 +21,13 @@ export async function getTeamStatus(input) {
16
21
  date: entry.date,
17
22
  message: entry.message,
18
23
  short_hash: entry.shortHash,
19
- files_changed: 0, // not available from log alone
24
+ files_changed: 0, // 单从日志无法获取变更文件数
20
25
  }));
21
26
  }
22
27
  catch (e) {
23
28
  console.debug("[soloforge]", e);
24
29
  }
25
- // 2. Member workloads
30
+ // 2. 按成员统计工作负载(提交数、活跃文件、最后活跃时间)
26
31
  try {
27
32
  const shortlog = await gitOps.getShortlog(projectPath, since);
28
33
  for (const { author, count } of shortlog) {
@@ -44,21 +49,22 @@ export async function getTeamStatus(input) {
44
49
  catch (e) {
45
50
  console.debug("[soloforge]", e);
46
51
  }
47
- // 3. Stale branches
48
- // TODO: getLog has no branch/ref parameter, so we cannot query per-branch log.
49
- // The `path` filter treats branch.name as a file path, which is incorrect.
50
- // A proper fix requires adding a `ref` option to GitOperations.getLog
51
- // or using `git log <branch> -1 --format=%aI` directly.
52
+ // 3. 检测过期分支(超过 30 天无新提交的分支)
53
+ // TODO: getLog 没有 branch/ref 参数,无法按分支查询日志
54
+ // path 过滤会将 branch.name 当作文件路径处理,结果不准确
55
+ // 正确修复需在 GitOperations.getLog 中添加 `ref` 选项
56
+ // 或直接使用 `git log <branch> -1 --format=%aI` 命令
52
57
  try {
53
58
  const branches = await gitOps.listBranches(projectPath);
54
59
  for (const branch of branches) {
55
60
  if (branch.isCurrent)
56
- continue;
61
+ continue; // 跳过当前分支
57
62
  try {
58
63
  const branchLog = await gitOps.getLog(projectPath, { maxCount: 1, path: branch.name });
59
64
  if (branchLog.length > 0) {
60
65
  const lastDate = new Date(branchLog[0].date);
61
66
  const daysSince = (Date.now() - lastDate.getTime()) / (1000 * 60 * 60 * 24);
67
+ // 分支超过 30 天无新提交视为过期
62
68
  if (daysSince > 30) {
63
69
  result.stale_branches.push({
64
70
  name: branch.name,
@@ -75,11 +81,12 @@ export async function getTeamStatus(input) {
75
81
  catch (e) {
76
82
  console.debug("[soloforge]", e);
77
83
  }
78
- // 4. Recent knowledge updates
84
+ // 4. 获取近期知识条目更新(需提供知识索引)
79
85
  if (knowledgeIndex) {
80
86
  try {
81
87
  const allEntries = knowledgeIndex.getAllEntries();
82
88
  const sinceDate = new Date(since);
89
+ // 合并全局和项目级知识条目,筛选在时间范围内且有 active 状态的条目
83
90
  const combined = [...allEntries.global, ...allEntries.project];
84
91
  result.recent_knowledge = combined
85
92
  .filter((e) => e.status === "active" && new Date(e.updated_at) >= sinceDate)
@@ -89,7 +96,7 @@ export async function getTeamStatus(input) {
89
96
  console.debug("[soloforge]", e);
90
97
  }
91
98
  }
92
- // 5. Summary
99
+ // 5. 生成中文摘要
93
100
  const parts = [];
94
101
  if (result.member_workloads.length > 0) {
95
102
  parts.push(`${result.member_workloads.length} 名活跃成员`);
@@ -103,19 +110,30 @@ export async function getTeamStatus(input) {
103
110
  result.summary = parts.length > 0 ? parts.join(",") : "暂无团队活动";
104
111
  return result;
105
112
  }
113
+ /**
114
+ * 计算默认的起始日期:当前时间往前推 7 天。
115
+ * @returns YYYY-MM-DD 格式的日期字符串
116
+ */
106
117
  function defaultSince() {
107
118
  const d = new Date();
108
119
  d.setDate(d.getDate() - 7);
109
120
  return d.toISOString().split("T")[0];
110
121
  }
122
+ /**
123
+ * 从提交消息中提取文件路径。使用正则匹配常见编程语言的文件扩展名。
124
+ * @param messages - 提交消息列表
125
+ * @returns 提取到的去重文件路径列表(最多 10 个)
126
+ */
111
127
  function extractFilesFromMessages(messages) {
112
128
  const files = new Set();
113
129
  for (const msg of messages) {
130
+ // 匹配常见源码文件扩展名
114
131
  const matches = msg.matchAll(/[\w/.-]+\.(java|ts|tsx|js|jsx|py|go|rs)/g);
115
132
  for (const m of matches) {
116
133
  files.add(m[0]);
117
134
  }
118
135
  }
136
+ // 限制返回数量,避免列表过长
119
137
  return [...files].slice(0, 10);
120
138
  }
121
139
  //# sourceMappingURL=team_awareness.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"team_awareness.js","sourceRoot":"","sources":["../../src/engine/team_awareness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team_awareness.js","sourceRoot":"","sources":["../../src/engine/team_awareness.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import type { TestGenGuide, ProjectConfig } from "../types.js";
2
2
  /**
3
- * Generate test generation guides for changed files.
4
- *
5
- * Pure rule-based — zero AI dependencies.
6
- * Maps file types to test strategies and produces actionable guides.
3
+ * 为变更文件生成测试引导 根据文件类型匹配测试策略,叠加知识驱动场景。
4
+ * @param changedFiles - 变更文件路径列表
5
+ * @param knowledgePatterns - 从知识库提取的关键词模式列表
6
+ * @param _config - 项目配置(预留,当前未使用)
7
+ * @returns 测试引导数组,每项包含测试类型、测试文件建议路径、场景列表和 Mock 要点
7
8
  */
8
9
  export declare function generateTestGuide(changedFiles: string[], knowledgePatterns: string[], _config: ProjectConfig): TestGenGuide[];
9
10
  //# sourceMappingURL=test_generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test_generator.d.ts","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAC;AA2L7E;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EAAE,EACtB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,aAAa,GACrB,YAAY,EAAE,CA+BhB"}
1
+ {"version":3,"file":"test_generator.d.ts","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAC;AAoM7E;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EAAE,EACtB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,aAAa,GACrB,YAAY,EAAE,CA+BhB"}
@@ -1,4 +1,5 @@
1
1
  import path from "node:path";
2
+ /** 文件类型 → 测试策略映射表: 根据文件名模式匹配测试类型、夹具方式和 Mock 策略 */
2
3
  const FILE_TEST_MAP = [
3
4
  {
4
5
  pattern: /Controller\.java$/,
@@ -34,6 +35,7 @@ const FILE_TEST_MAP = [
34
35
  // ────────────────────────────────────────────
35
36
  // Default scenarios per test type
36
37
  // ────────────────────────────────────────────
38
+ /** 各测试类型的默认场景集 — 单元/集成/E2E 测试的 Given-When-Then 标准场景 */
37
39
  const DEFAULT_SCENARIOS = {
38
40
  unit: [
39
41
  {
@@ -98,6 +100,7 @@ const DEFAULT_SCENARIOS = {
98
100
  },
99
101
  ],
100
102
  };
103
+ /** 知识关键词 → 额外测试场景映射表: 当文件路径或知识模式包含关键词时自动追加场景 */
101
104
  const KNOWLEDGE_SCENARIOS = [
102
105
  {
103
106
  keywords: ["并发", "concurrent", "thread", "lock", "mutex", "race"],
@@ -161,10 +164,11 @@ const KNOWLEDGE_SCENARIOS = [
161
164
  },
162
165
  ];
163
166
  /**
164
- * Generate test generation guides for changed files.
165
- *
166
- * Pure rule-based — zero AI dependencies.
167
- * Maps file types to test strategies and produces actionable guides.
167
+ * 为变更文件生成测试引导 根据文件类型匹配测试策略,叠加知识驱动场景。
168
+ * @param changedFiles - 变更文件路径列表
169
+ * @param knowledgePatterns - 从知识库提取的关键词模式列表
170
+ * @param _config - 项目配置(预留,当前未使用)
171
+ * @returns 测试引导数组,每项包含测试类型、测试文件建议路径、场景列表和 Mock 要点
168
172
  */
169
173
  export function generateTestGuide(changedFiles, knowledgePatterns, _config) {
170
174
  const guides = [];
@@ -195,6 +199,7 @@ export function generateTestGuide(changedFiles, knowledgePatterns, _config) {
195
199
  // ────────────────────────────────────────────
196
200
  // Internal helpers
197
201
  // ────────────────────────────────────────────
202
+ /** 根据文件路径匹配测试策略 — 遍历 FILE_TEST_MAP 返回首个命中的映射规则 */
198
203
  function matchFileTestMapping(filePath) {
199
204
  for (const mapping of FILE_TEST_MAP) {
200
205
  if (mapping.pattern.test(filePath)) {
@@ -203,6 +208,12 @@ function matchFileTestMapping(filePath) {
203
208
  }
204
209
  return null;
205
210
  }
211
+ /**
212
+ * 推荐测试文件路径 — Java 文件遵循 src/main → src/test 和 *Test.java 命名约定,TS/JS 文件追加 .test 后缀。
213
+ * @param sourceFile - 源文件路径
214
+ * @param testType - 测试类型(用于未来扩展不同约定)
215
+ * @returns 推荐的测试文件路径
216
+ */
206
217
  function suggestTestFilePath(sourceFile, testType) {
207
218
  const ext = path.extname(sourceFile);
208
219
  const base = sourceFile.slice(0, -ext.length);
@@ -219,10 +230,16 @@ function suggestTestFilePath(sourceFile, testType) {
219
230
  const testExt = `.test${ext}`;
220
231
  return `${base}${testExt}`;
221
232
  }
233
+ /**
234
+ * 匹配知识驱动的额外测试场景 — 将文件路径和知识模式拼接后搜索关键词命中。
235
+ * @param file - 源文件路径(用于关键词匹配)
236
+ * @param knowledgePatterns - 知识库关键词列表
237
+ * @returns 命中的额外测试场景数组(自动去重)
238
+ */
222
239
  function matchKnowledgeScenarios(file, knowledgePatterns) {
223
240
  const matched = [];
224
241
  const seenNames = new Set();
225
- // Build a combined search text from file path + knowledge patterns
242
+ // 将文件路径与所有知识关键词拼接为搜索文本,统一转小写进行匹配
226
243
  const searchText = (file + " " + knowledgePatterns.join(" ")).toLowerCase();
227
244
  for (const entry of KNOWLEDGE_SCENARIOS) {
228
245
  if (seenNames.has(entry.scenario.name)) {
@@ -1 +1 @@
1
- {"version":3,"file":"test_generator.js","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test_generator.js","sourceRoot":"","sources":["../../src/engine/test_generator.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,16 @@
1
1
  import type { TestQualityReport } from "../types.js";
2
2
  /**
3
- * Analyze test quality for a given test file.
3
+ * 测试质量分析器 对测试文件进行纯规则维度的质量评估,包含断言密度、边界覆盖、
4
+ * 命名规范性、断言重复和场景覆盖五个检查维度。零 AI 依赖。
4
5
  *
5
- * Pure rule-based analysiszero AI dependencies.
6
- * Returns a structured report with scored checks and suggestions.
6
+ * 机制 4: 变异测试防造假通过逻辑算符反转和边界值偏移模拟代码变异,
7
+ * 检测现有测试是否能捕捉到变更。若变异后测试依然全绿,判定测试无效。
8
+ *
9
+ * 分析测试文件质量,返回结构化报告,包含各项检查的评分和改进建议。
10
+ * @param testContent - 测试文件内容
11
+ * @param filename - 测试文件名(用于结果标识)
12
+ * @param sourceContent - 可选的被测源码内容(用于变异测试)
13
+ * @returns 测试质量报告,包含总分(0-100)、各项检查结果和改进建议列表
7
14
  */
8
- export declare function analyzeTestQuality(testContent: string, filename: string): TestQualityReport;
15
+ export declare function analyzeTestQuality(testContent: string, filename: string, sourceContent?: string): TestQualityReport;
9
16
  //# sourceMappingURL=test_quality.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test_quality.d.ts","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAmDnB"}
1
+ {"version":3,"file":"test_quality.d.ts","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,iBAAiB,CAqEnB"}
@@ -1,10 +1,17 @@
1
1
  /**
2
- * Analyze test quality for a given test file.
2
+ * 测试质量分析器 对测试文件进行纯规则维度的质量评估,包含断言密度、边界覆盖、
3
+ * 命名规范性、断言重复和场景覆盖五个检查维度。零 AI 依赖。
3
4
  *
4
- * Pure rule-based analysiszero AI dependencies.
5
- * Returns a structured report with scored checks and suggestions.
5
+ * 机制 4: 变异测试防造假通过逻辑算符反转和边界值偏移模拟代码变异,
6
+ * 检测现有测试是否能捕捉到变更。若变异后测试依然全绿,判定测试无效。
7
+ *
8
+ * 分析测试文件质量,返回结构化报告,包含各项检查的评分和改进建议。
9
+ * @param testContent - 测试文件内容
10
+ * @param filename - 测试文件名(用于结果标识)
11
+ * @param sourceContent - 可选的被测源码内容(用于变异测试)
12
+ * @returns 测试质量报告,包含总分(0-100)、各项检查结果和改进建议列表
6
13
  */
7
- export function analyzeTestQuality(testContent, filename) {
14
+ export function analyzeTestQuality(testContent, filename, sourceContent) {
8
15
  const checks = [];
9
16
  const suggestions = [];
10
17
  // ── 1. assertion_density ──
@@ -34,11 +41,29 @@ export function analyzeTestQuality(testContent, filename) {
34
41
  // ── 5. scenario_coverage ──
35
42
  const scenarioCheck = checkScenarioCoverage();
36
43
  checks.push(scenarioCheck);
44
+ // ── 6. mutation_audit (机制 4: 变异测试防造假) ──
45
+ if (sourceContent) {
46
+ const mutationCheck = checkMutationResistance(testContent, sourceContent);
47
+ checks.push(mutationCheck);
48
+ if (!mutationCheck.passed) {
49
+ suggestions.push("测试可能存在'自己证明自己'问题:变异后断言仍能通过。建议增加反向用例和精确断言");
50
+ }
51
+ }
52
+ else {
53
+ // 无源码时跳过变异测试,不扣分
54
+ checks.push({
55
+ dimension: "scenario_coverage",
56
+ passed: true,
57
+ detail: "变异测试跳过(未提供被测源码)",
58
+ });
59
+ }
60
+ // 评分计算: 满分 100,每项未通过的检查扣 16.7 分(6 项),最低 0 分
37
61
  // ── Score calculation ──
38
62
  let score = 100;
63
+ const deduction = Math.floor(100 / checks.length);
39
64
  for (const check of checks) {
40
65
  if (!check.passed) {
41
- score -= 20;
66
+ score -= deduction;
42
67
  }
43
68
  }
44
69
  score = Math.max(0, score);
@@ -52,8 +77,9 @@ export function analyzeTestQuality(testContent, filename) {
52
77
  // ────────────────────────────────────────────
53
78
  // Check implementations
54
79
  // ────────────────────────────────────────────
80
+ /** 断言密度检查 — 统计测试函数数与断言数的比率,阈值 >= 1.0(每个测试至少一个断言) */
55
81
  function checkAssertionDensity(content) {
56
- // Count test function occurrences
82
+ // 匹配 it/test/@Test 函数调用,统计测试函数总数
57
83
  const testFnMatches = content.match(/\b(it|test|@Test)\s*\(/g) ?? [];
58
84
  const testCount = testFnMatches.length;
59
85
  if (testCount === 0) {
@@ -63,9 +89,9 @@ function checkAssertionDensity(content) {
63
89
  detail: "未检测到测试函数",
64
90
  };
65
91
  }
66
- // Count assertion occurrences
92
+ // 匹配 expect/assert/assertEquals/assertEquals/assertThat/assertStrictEquals 调用
67
93
  const assertMatches = content.match(/\b(expect|assert|assertEquals|assertThat|assertStrictEquals)\s*\(/g) ?? [];
68
- // Filter out non-assertion matchers (e.g. expect.any(), expect.arrayContaining(), etc.)
94
+ // 过滤非断言的 expect 匹配器 (expect.any(), expect.arrayContaining() )
69
95
  const matcherSuffixes = ["any(", "arrayContaining(", "objectContaining(", "stringContaining(", "stringMatching(", "extend(", "anything(", "closeTo(", "assertions("];
70
96
  const assertCount = assertMatches.filter((m) => {
71
97
  // For expect( calls, check what follows the opening paren
@@ -92,19 +118,20 @@ function checkAssertionDensity(content) {
92
118
  detail: `断言密度不足: ${density.toFixed(1)} (${assertCount} 断言 / ${testCount} 测试, 阈值 >= 1.0)`,
93
119
  };
94
120
  }
121
+ /** 边界覆盖检查 — 在 expect() 和 it()/test() 代码块内搜索边界值关键字(null/undefined/空值/极值等) */
95
122
  function checkBoundaryCoverage(content) {
96
- // Only search within expect() contexts to avoid matching in URLs, ports, imports, etc.
97
- // Extract all expect(...) blocks (non-greedy, up to closing paren at depth 0)
123
+ // 仅在 expect() 上下文和 it()/test() 代码块内搜索,避免误匹配 URL/端口/import 中的值
124
+ // 提取所有 expect(...) 代码块内容(按括号深度匹配到闭合)
98
125
  const expectContexts = [];
99
126
  const expectRegex = /\bexpect\s*\(/g;
100
127
  let expectMatch;
101
128
  while ((expectMatch = expectRegex.exec(content)) !== null) {
102
- // Skip matchers like expect.any(), expect.arrayContaining(), etc.
129
+ // 跳过非断言匹配器 (expect.any(), expect.arrayContaining() 等)
103
130
  const afterOpen = content.slice(expectMatch.index + expectMatch[0].length).trimStart();
104
131
  if (/^(any|arrayContaining|objectContaining|stringContaining|stringMatching|extend|anything|closeTo|assertions)\s*\(/.test(afterOpen)) {
105
132
  continue;
106
133
  }
107
- // Extract the expect block content (up to the matching closing paren)
134
+ // 提取 expect 块内容(按括号深度匹配到对应的闭合括号)
108
135
  let depth = 1;
109
136
  let pos = expectMatch.index + expectMatch[0].length;
110
137
  while (pos < content.length && depth > 0) {
@@ -143,6 +170,7 @@ function checkBoundaryCoverage(content) {
143
170
  .split("\n")
144
171
  .filter((line) => !line.trim().startsWith("//") && !line.trim().startsWith("*") && !line.trimStart().startsWith("import "));
145
172
  const filteredText = filteredLines.join("\n");
173
+ // 边界值关键字列表: null、undefined、空字符串、数字边界、中文描述
146
174
  const boundaryKeywords = [
147
175
  "null", "undefined", '""', "''", "0",
148
176
  "MAX_VALUE", "MIN_VALUE", "MAX_SAFE_INTEGER", "MIN_SAFE_INTEGER",
@@ -167,6 +195,10 @@ function checkBoundaryCoverage(content) {
167
195
  detail: "未检测到边界值测试",
168
196
  };
169
197
  }
198
+ /**
199
+ * 命名规范性检查 — 提取 it()/test() 中的测试名称,检查描述性关键词占比是否 >= 50%。
200
+ * 支持英文关键词(should/when/returns/handles/throws)和中文关键词(应该/当/返回/处理/抛出)。
201
+ */
170
202
  function checkNaming(content) {
171
203
  // Extract test names from it("...", test("...", patterns
172
204
  const namePattern = /\b(?:it|test)\s*\(\s*["'`]([^"'`]+)["'`]/g;
@@ -176,13 +208,14 @@ function checkNaming(content) {
176
208
  names.push(match[1]);
177
209
  }
178
210
  if (names.length === 0) {
179
- // No extractable names — neutral pass (cannot evaluate)
211
+ // 无法提取测试名称(如仅使用 describe)— 中性通过(无法评估)
180
212
  return {
181
213
  dimension: "naming",
182
214
  passed: true,
183
215
  detail: "未提取到测试名称 (可能使用 describe-only 模式)",
184
216
  };
185
217
  }
218
+ // 描述性关键词: 英文 BDD 命名约定和中文命名约定
186
219
  const descriptiveKeywords = [
187
220
  "should", "when", "returns", "can", "handles", "throws",
188
221
  "shouldn't", "must", "will",
@@ -212,6 +245,7 @@ function checkNaming(content) {
212
245
  detail: `测试命名不够描述性: ${(ratio * 100).toFixed(0)}% (${descriptiveCount}/${names.length})`,
213
246
  };
214
247
  }
248
+ /** 断言重复检查 — 提取所有 expect() 语句,计算重复比率,阈值 > 30% 则不通过 */
215
249
  function checkDuplication(content) {
216
250
  // Extract expect(...) statements (first 120 chars per line to normalize)
217
251
  const expectPattern = /\bexpect\s*\([^)]*\)/g;
@@ -228,7 +262,7 @@ function checkDuplication(content) {
228
262
  detail: "无断言语句,跳过重复检查",
229
263
  };
230
264
  }
231
- // Sort and count duplicates
265
+ // 排序后统计唯一断言数,重复率 = 1 - (唯一数/总数)
232
266
  const sorted = [...expectCalls].sort();
233
267
  const unique = new Set(sorted);
234
268
  const duplicateRatio = 1 - unique.size / sorted.length;
@@ -246,6 +280,7 @@ function checkDuplication(content) {
246
280
  detail: `断言重复率: ${(duplicateRatio * 100).toFixed(0)}%`,
247
281
  };
248
282
  }
283
+ /** 场景覆盖检查 — 占位检查,实际场景覆盖需结合知识模板验收项进行交叉评估 */
249
284
  function checkScenarioCoverage() {
250
285
  return {
251
286
  dimension: "scenario_coverage",
@@ -253,4 +288,126 @@ function checkScenarioCoverage() {
253
288
  detail: "需结合知识模板验收项进行交叉检查",
254
289
  };
255
290
  }
291
+ /** 预定义变异操作集 */
292
+ const MUTATION_OPERATORS = [
293
+ {
294
+ description: "逻辑算符反转 (=== → !==, !== → ===, > → <=, < → >=)",
295
+ mutate: (line) => {
296
+ if (/===/.test(line) && !/!==/.test(line))
297
+ return line.replace(/===/g, "!==");
298
+ if (/!==/.test(line))
299
+ return line.replace(/!==/g, "===");
300
+ if (/>=/.test(line))
301
+ return line.replace(/>=/g, "<");
302
+ if (/<=/.test(line))
303
+ return line.replace(/<=/g, ">");
304
+ if (/>/.test(line) && !/>=/.test(line))
305
+ return line.replace(/>/g, "<=");
306
+ if (/</.test(line) && !/<=/.test(line))
307
+ return line.replace(/</g, ">=");
308
+ return line;
309
+ },
310
+ },
311
+ {
312
+ description: "边界值偏移 (+1/-1 常量数字)",
313
+ mutate: (line) => {
314
+ return line.replace(/\b(\d+)\b/g, (_, num) => {
315
+ const n = parseInt(num, 10);
316
+ if (n === 0)
317
+ return "1";
318
+ if (n === 1)
319
+ return "0";
320
+ return (n + 1).toString();
321
+ });
322
+ },
323
+ },
324
+ {
325
+ description: "布尔值反转 (true → false, false → true)",
326
+ mutate: (line) => {
327
+ if (/\btrue\b/.test(line))
328
+ return line.replace(/\btrue\b/g, "false");
329
+ if (/\bfalse\b/.test(line))
330
+ return line.replace(/\bfalse\b/g, "true");
331
+ return line;
332
+ },
333
+ },
334
+ {
335
+ description: "返回值篡改 (return → return null)",
336
+ mutate: (line) => {
337
+ if (/return\s+/.test(line) && !/return\s+null/.test(line)) {
338
+ return line.replace(/return\s+/, "return null; // ");
339
+ }
340
+ return line;
341
+ },
342
+ },
343
+ ];
344
+ /**
345
+ * 变异测试防造假 — 通过对源码模拟变异,检查测试的断言是否精确到能检测变异。
346
+ * 策略: 从源码中提取含关键逻辑的行,执行变异,检查测试中是否有断言针对这些逻辑的精确值。
347
+ * 若测试只含模糊断言(如 toBeTruthy),判定为可能存在"自己证明自己"问题。
348
+ */
349
+ function checkMutationResistance(testContent, sourceContent) {
350
+ // 提取源码中的关键逻辑行(含比较运算、返回值、布尔值)
351
+ const keyLines = sourceContent.split("\n").filter((line) => {
352
+ const trimmed = line.trim();
353
+ return trimmed.length > 0
354
+ && !trimmed.startsWith("//")
355
+ && !trimmed.startsWith("import ")
356
+ && !trimmed.startsWith("export ")
357
+ && (/===|!==|>=|<=|>|<|return|true|false/.test(trimmed));
358
+ });
359
+ if (keyLines.length === 0) {
360
+ return {
361
+ dimension: "scenario_coverage",
362
+ passed: true,
363
+ detail: "无可变异的关键逻辑行,跳过变异测试",
364
+ };
365
+ }
366
+ // 检查测试中的断言精确度
367
+ const preciseAssertions = testContent.match(/\bexpect\s*\([^)]*\)\s*\.\s*(toBe|toEqual|toStrictEqual|toBeLessThan|toBeGreaterThan|toThrow|toThrowError)/g) ?? [];
368
+ const looseAssertions = testContent.match(/\bexpect\s*\([^)]*\)\s*\.\s*(toBeTruthy|toBeFalsy|toBeDefined|toBeUndefined|toBeDefined)/g) ?? [];
369
+ // 变异可检测性评估: 精确断言/总断言 比率
370
+ const totalAssertions = preciseAssertions.length + looseAssertions.length;
371
+ if (totalAssertions === 0) {
372
+ return {
373
+ dimension: "scenario_coverage",
374
+ passed: false,
375
+ detail: "无断言,无法检测源码变异(变异测试防造假失败)",
376
+ };
377
+ }
378
+ const precisionRatio = preciseAssertions.length / totalAssertions;
379
+ // 抽样执行变异操作,检查是否有对应检测能力
380
+ let mutationsApplied = 0;
381
+ let mutationsUndetected = 0;
382
+ for (const keyLine of keyLines.slice(0, 5)) {
383
+ for (const mut of MUTATION_OPERATORS) {
384
+ const mutated = mut.mutate(keyLine);
385
+ if (mutated !== keyLine) {
386
+ mutationsApplied++;
387
+ // 简化检测: 如果测试中存在针对被变异值的精确断言,认为可检测
388
+ const mutatedValues = mutated.match(/(!==|===|<=|>=|>|<|\b\d+\b|true|false)/g) ?? [];
389
+ const hasDetection = mutatedValues.some((v) => testContent.includes(v));
390
+ if (!hasDetection) {
391
+ mutationsUndetected++;
392
+ }
393
+ }
394
+ }
395
+ }
396
+ // 综合评估: 精确断言率 > 50% 且 不可检测变异 < 50%
397
+ const passThreshold = 0.5;
398
+ const precisionOk = precisionRatio >= passThreshold;
399
+ const detectionOk = mutationsApplied === 0 || (mutationsUndetected / mutationsApplied) < passThreshold;
400
+ if (precisionOk && detectionOk) {
401
+ return {
402
+ dimension: "scenario_coverage",
403
+ passed: true,
404
+ detail: `变异测试通过 — 精确断言率 ${(precisionRatio * 100).toFixed(0)}%,${mutationsApplied} 次变异中 ${mutationsApplied - mutationsUndetected} 次可检测`,
405
+ };
406
+ }
407
+ return {
408
+ dimension: "scenario_coverage",
409
+ passed: false,
410
+ detail: `变异测试未通过 — 精确断言率 ${(precisionRatio * 100).toFixed(0)}%(阈值 50%),${mutationsApplied} 次变异中 ${mutationsUndetected} 次不可检测。测试可能存在"自己证明自己"问题`,
411
+ };
412
+ }
256
413
  //# sourceMappingURL=test_quality.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test_quality.js","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,QAAgB;IAEhB,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,6BAA6B;IAC7B,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACnC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACxD,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1B,WAAW,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC5D,CAAC;IAED,kBAAkB;IAClB,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC1E,CAAC;IAED,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9B,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3C,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,qBAAqB,EAAE,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE3B,0BAA0B;IAC1B,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IACD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE3B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK;QACL,MAAM;QACN,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,wBAAwB;AACxB,+CAA+C;AAE/C,SAAS,qBAAqB,CAAC,OAAe;IAC5C,kCAAkC;IAClC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;IAEvC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,IAAI,EAAE,CAAC;IAChH,wFAAwF;IACxF,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACrK,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,0DAA0D;QAC1D,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YAChB,oEAAoE;YACpE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YAC5D,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC,MAAM,CAAC;IAEV,MAAM,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IAExC,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,SAAS,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,SAAS,SAAS,MAAM;SAC5E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,WAAW,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,SAAS,SAAS,iBAAiB;KACzF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,uFAAuF;IACvF,8EAA8E;IAC9E,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,gBAAgB,CAAC;IACrC,IAAI,WAAmC,CAAC;IACxC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1D,kEAAkE;QAClE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QACvF,IAAI,iHAAiH,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACtI,SAAS;QACX,CAAC;QACD,sEAAsE;QACtE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpD,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;YACvC,GAAG,EAAE,CAAC;QACR,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,2EAA2E;IAC3E,MAAM,cAAc,GAAG,6DAA6D,CAAC;IACrF,IAAI,SAAiC,CAAC;IACtC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3D,kDAAkD;QAClD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAChD,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBAAC,KAAK,EAAE,CAAC;gBAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAAC,CAAC;YAC9E,GAAG,EAAE,CAAC;QACR,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjD,2CAA2C;IAC3C,MAAM,aAAa,GAAG,cAAc;SACjC,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9H,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9C,MAAM,gBAAgB,GAAG;QACvB,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG;QACpC,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB;QAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;KAC7B,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,WAAW;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,yDAAyD;IACzD,MAAM,WAAW,GAAG,2CAA2C,CAAC;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,wDAAwD;QACxD,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,kCAAkC;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG;QAC1B,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ;QACvD,WAAW,EAAE,MAAM,EAAE,MAAM;QAC3B,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KACxC,CAAC;IAEF,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;YAC1C,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C,gBAAgB,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;IAE9C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACjB,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,IAAI,KAAK,CAAC,MAAM,GAAG;SACtF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,cAAc,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,IAAI,KAAK,CAAC,MAAM,GAAG;KACxF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,yEAAyE;IACzE,MAAM,aAAa,GAAG,uBAAuB,CAAC;IAC9C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,oCAAoC;QACpC,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,cAAc;SACvB,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IAEvD,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QACnD,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,cAAc,IAAI,MAAM,CAAC,MAAM,SAAS,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;SACjG,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,aAAa;QACxB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,kBAAkB;KAC3B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"test_quality.js","sourceRoot":"","sources":["../../src/engine/test_quality.ts"],"names":[],"mappings":"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"}