@xiuper/cli 0.0.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 (218) hide show
  1. package/README.md +180 -0
  2. package/dist/jsMain/typescript/agents/LLMService.d.ts +40 -0
  3. package/dist/jsMain/typescript/agents/LLMService.d.ts.map +1 -0
  4. package/dist/jsMain/typescript/agents/LLMService.js +156 -0
  5. package/dist/jsMain/typescript/agents/LLMService.js.map +1 -0
  6. package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts +103 -0
  7. package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts.map +1 -0
  8. package/dist/jsMain/typescript/agents/ServerAgentClient.js +142 -0
  9. package/dist/jsMain/typescript/agents/ServerAgentClient.js.map +1 -0
  10. package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts +87 -0
  11. package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts.map +1 -0
  12. package/dist/jsMain/typescript/agents/render/BaseRenderer.js +128 -0
  13. package/dist/jsMain/typescript/agents/render/BaseRenderer.js.map +1 -0
  14. package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts +51 -0
  15. package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts.map +1 -0
  16. package/dist/jsMain/typescript/agents/render/CliRenderer.js +564 -0
  17. package/dist/jsMain/typescript/agents/render/CliRenderer.js.map +1 -0
  18. package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts +55 -0
  19. package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts.map +1 -0
  20. package/dist/jsMain/typescript/agents/render/ServerRenderer.js +503 -0
  21. package/dist/jsMain/typescript/agents/render/ServerRenderer.js.map +1 -0
  22. package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts +104 -0
  23. package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts.map +1 -0
  24. package/dist/jsMain/typescript/agents/render/TuiRenderer.js +279 -0
  25. package/dist/jsMain/typescript/agents/render/TuiRenderer.js.map +1 -0
  26. package/dist/jsMain/typescript/config/ConfigManager.d.ts +146 -0
  27. package/dist/jsMain/typescript/config/ConfigManager.d.ts.map +1 -0
  28. package/dist/jsMain/typescript/config/ConfigManager.js +257 -0
  29. package/dist/jsMain/typescript/config/ConfigManager.js.map +1 -0
  30. package/dist/jsMain/typescript/constants/asciiArt.d.ts +9 -0
  31. package/dist/jsMain/typescript/constants/asciiArt.d.ts.map +1 -0
  32. package/dist/jsMain/typescript/constants/asciiArt.js +47 -0
  33. package/dist/jsMain/typescript/constants/asciiArt.js.map +1 -0
  34. package/dist/jsMain/typescript/design-system/colors.d.ts +492 -0
  35. package/dist/jsMain/typescript/design-system/colors.d.ts.map +1 -0
  36. package/dist/jsMain/typescript/design-system/colors.js +333 -0
  37. package/dist/jsMain/typescript/design-system/colors.js.map +1 -0
  38. package/dist/jsMain/typescript/design-system/index.d.ts +31 -0
  39. package/dist/jsMain/typescript/design-system/index.d.ts.map +1 -0
  40. package/dist/jsMain/typescript/design-system/index.js +195 -0
  41. package/dist/jsMain/typescript/design-system/index.js.map +1 -0
  42. package/dist/jsMain/typescript/design-system/theme-helpers.d.ts +161 -0
  43. package/dist/jsMain/typescript/design-system/theme-helpers.d.ts.map +1 -0
  44. package/dist/jsMain/typescript/design-system/theme-helpers.js +153 -0
  45. package/dist/jsMain/typescript/design-system/theme-helpers.js.map +1 -0
  46. package/dist/jsMain/typescript/i18n/index.d.ts +37 -0
  47. package/dist/jsMain/typescript/i18n/index.d.ts.map +1 -0
  48. package/dist/jsMain/typescript/i18n/index.js +139 -0
  49. package/dist/jsMain/typescript/i18n/index.js.map +1 -0
  50. package/dist/jsMain/typescript/i18n/locales/en.d.ts +6 -0
  51. package/dist/jsMain/typescript/i18n/locales/en.d.ts.map +1 -0
  52. package/dist/jsMain/typescript/i18n/locales/en.js +120 -0
  53. package/dist/jsMain/typescript/i18n/locales/en.js.map +1 -0
  54. package/dist/jsMain/typescript/i18n/locales/zh.d.ts +6 -0
  55. package/dist/jsMain/typescript/i18n/locales/zh.d.ts.map +1 -0
  56. package/dist/jsMain/typescript/i18n/locales/zh.js +120 -0
  57. package/dist/jsMain/typescript/i18n/locales/zh.js.map +1 -0
  58. package/dist/jsMain/typescript/i18n/types.d.ts +124 -0
  59. package/dist/jsMain/typescript/i18n/types.d.ts.map +1 -0
  60. package/dist/jsMain/typescript/i18n/types.js +7 -0
  61. package/dist/jsMain/typescript/i18n/types.js.map +1 -0
  62. package/dist/jsMain/typescript/index.d.ts +9 -0
  63. package/dist/jsMain/typescript/index.d.ts.map +1 -0
  64. package/dist/jsMain/typescript/index.js +380 -0
  65. package/dist/jsMain/typescript/index.js.map +1 -0
  66. package/dist/jsMain/typescript/modes/AgentMode.d.ts +33 -0
  67. package/dist/jsMain/typescript/modes/AgentMode.d.ts.map +1 -0
  68. package/dist/jsMain/typescript/modes/AgentMode.js +243 -0
  69. package/dist/jsMain/typescript/modes/AgentMode.js.map +1 -0
  70. package/dist/jsMain/typescript/modes/ChatMode.d.ts +30 -0
  71. package/dist/jsMain/typescript/modes/ChatMode.d.ts.map +1 -0
  72. package/dist/jsMain/typescript/modes/ChatMode.js +260 -0
  73. package/dist/jsMain/typescript/modes/ChatMode.js.map +1 -0
  74. package/dist/jsMain/typescript/modes/DocumentMode.d.ts +26 -0
  75. package/dist/jsMain/typescript/modes/DocumentMode.d.ts.map +1 -0
  76. package/dist/jsMain/typescript/modes/DocumentMode.js +217 -0
  77. package/dist/jsMain/typescript/modes/DocumentMode.js.map +1 -0
  78. package/dist/jsMain/typescript/modes/Mode.d.ts +72 -0
  79. package/dist/jsMain/typescript/modes/Mode.d.ts.map +1 -0
  80. package/dist/jsMain/typescript/modes/Mode.js +7 -0
  81. package/dist/jsMain/typescript/modes/Mode.js.map +1 -0
  82. package/dist/jsMain/typescript/modes/ModeManager.d.ts +76 -0
  83. package/dist/jsMain/typescript/modes/ModeManager.d.ts.map +1 -0
  84. package/dist/jsMain/typescript/modes/ModeManager.js +156 -0
  85. package/dist/jsMain/typescript/modes/ModeManager.js.map +1 -0
  86. package/dist/jsMain/typescript/modes/ReviewMode.d.ts +52 -0
  87. package/dist/jsMain/typescript/modes/ReviewMode.d.ts.map +1 -0
  88. package/dist/jsMain/typescript/modes/ReviewMode.js +435 -0
  89. package/dist/jsMain/typescript/modes/ReviewMode.js.map +1 -0
  90. package/dist/jsMain/typescript/modes/index.d.ts +9 -0
  91. package/dist/jsMain/typescript/modes/index.d.ts.map +1 -0
  92. package/dist/jsMain/typescript/modes/index.js +7 -0
  93. package/dist/jsMain/typescript/modes/index.js.map +1 -0
  94. package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts +34 -0
  95. package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts.map +1 -0
  96. package/dist/jsMain/typescript/processors/AtCommandProcessor.js +118 -0
  97. package/dist/jsMain/typescript/processors/AtCommandProcessor.js.map +1 -0
  98. package/dist/jsMain/typescript/processors/InputRouter.d.ts +84 -0
  99. package/dist/jsMain/typescript/processors/InputRouter.d.ts.map +1 -0
  100. package/dist/jsMain/typescript/processors/InputRouter.js +78 -0
  101. package/dist/jsMain/typescript/processors/InputRouter.js.map +1 -0
  102. package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts +25 -0
  103. package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts.map +1 -0
  104. package/dist/jsMain/typescript/processors/ModeCommandProcessor.js +127 -0
  105. package/dist/jsMain/typescript/processors/ModeCommandProcessor.js.map +1 -0
  106. package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts +68 -0
  107. package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts.map +1 -0
  108. package/dist/jsMain/typescript/processors/SlashCommandProcessor.js +391 -0
  109. package/dist/jsMain/typescript/processors/SlashCommandProcessor.js.map +1 -0
  110. package/dist/jsMain/typescript/processors/VariableProcessor.d.ts +44 -0
  111. package/dist/jsMain/typescript/processors/VariableProcessor.d.ts.map +1 -0
  112. package/dist/jsMain/typescript/processors/VariableProcessor.js +105 -0
  113. package/dist/jsMain/typescript/processors/VariableProcessor.js.map +1 -0
  114. package/dist/jsMain/typescript/ui/App.d.ts +16 -0
  115. package/dist/jsMain/typescript/ui/App.d.ts.map +1 -0
  116. package/dist/jsMain/typescript/ui/App.js +208 -0
  117. package/dist/jsMain/typescript/ui/App.js.map +1 -0
  118. package/dist/jsMain/typescript/ui/Banner.d.ts +6 -0
  119. package/dist/jsMain/typescript/ui/Banner.d.ts.map +1 -0
  120. package/dist/jsMain/typescript/ui/Banner.js +13 -0
  121. package/dist/jsMain/typescript/ui/Banner.js.map +1 -0
  122. package/dist/jsMain/typescript/ui/ChatInterface.d.ts +19 -0
  123. package/dist/jsMain/typescript/ui/ChatInterface.d.ts.map +1 -0
  124. package/dist/jsMain/typescript/ui/ChatInterface.js +223 -0
  125. package/dist/jsMain/typescript/ui/ChatInterface.js.map +1 -0
  126. package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts +21 -0
  127. package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts.map +1 -0
  128. package/dist/jsMain/typescript/ui/CommandSuggestions.js +43 -0
  129. package/dist/jsMain/typescript/ui/CommandSuggestions.js.map +1 -0
  130. package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts +11 -0
  131. package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts.map +1 -0
  132. package/dist/jsMain/typescript/ui/LanguageSwitcher.js +37 -0
  133. package/dist/jsMain/typescript/ui/LanguageSwitcher.js.map +1 -0
  134. package/dist/jsMain/typescript/ui/MessageRenderer.d.ts +70 -0
  135. package/dist/jsMain/typescript/ui/MessageRenderer.d.ts.map +1 -0
  136. package/dist/jsMain/typescript/ui/MessageRenderer.js +255 -0
  137. package/dist/jsMain/typescript/ui/MessageRenderer.js.map +1 -0
  138. package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts +19 -0
  139. package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts.map +1 -0
  140. package/dist/jsMain/typescript/ui/ModelConfigForm.js +257 -0
  141. package/dist/jsMain/typescript/ui/ModelConfigForm.js.map +1 -0
  142. package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts +12 -0
  143. package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts.map +1 -0
  144. package/dist/jsMain/typescript/ui/WelcomeScreen.js +93 -0
  145. package/dist/jsMain/typescript/ui/WelcomeScreen.js.map +1 -0
  146. package/dist/jsMain/typescript/utils/commandUtils.d.ts +64 -0
  147. package/dist/jsMain/typescript/utils/commandUtils.d.ts.map +1 -0
  148. package/dist/jsMain/typescript/utils/commandUtils.js +195 -0
  149. package/dist/jsMain/typescript/utils/commandUtils.js.map +1 -0
  150. package/dist/jsMain/typescript/utils/domainDictUtils.d.ts +53 -0
  151. package/dist/jsMain/typescript/utils/domainDictUtils.d.ts.map +1 -0
  152. package/dist/jsMain/typescript/utils/domainDictUtils.js +130 -0
  153. package/dist/jsMain/typescript/utils/domainDictUtils.js.map +1 -0
  154. package/dist/jsMain/typescript/utils/markdownSplitter.d.ts +23 -0
  155. package/dist/jsMain/typescript/utils/markdownSplitter.d.ts.map +1 -0
  156. package/dist/jsMain/typescript/utils/markdownSplitter.js +90 -0
  157. package/dist/jsMain/typescript/utils/markdownSplitter.js.map +1 -0
  158. package/dist/jsMain/typescript/utils/outputFormatter.d.ts +70 -0
  159. package/dist/jsMain/typescript/utils/outputFormatter.d.ts.map +1 -0
  160. package/dist/jsMain/typescript/utils/outputFormatter.js +140 -0
  161. package/dist/jsMain/typescript/utils/outputFormatter.js.map +1 -0
  162. package/dist/jsMain/typescript/utils/renderUtils.d.ts +17 -0
  163. package/dist/jsMain/typescript/utils/renderUtils.d.ts.map +1 -0
  164. package/dist/jsMain/typescript/utils/renderUtils.js +128 -0
  165. package/dist/jsMain/typescript/utils/renderUtils.js.map +1 -0
  166. package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts +87 -0
  167. package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts.map +1 -0
  168. package/dist/test/framework/analyzers/CodeChangeAnalyzer.js +412 -0
  169. package/dist/test/framework/analyzers/CodeChangeAnalyzer.js.map +1 -0
  170. package/dist/test/framework/analyzers/PromptAnalyzer.d.ts +46 -0
  171. package/dist/test/framework/analyzers/PromptAnalyzer.d.ts.map +1 -0
  172. package/dist/test/framework/analyzers/PromptAnalyzer.js +185 -0
  173. package/dist/test/framework/analyzers/PromptAnalyzer.js.map +1 -0
  174. package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts +45 -0
  175. package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts.map +1 -0
  176. package/dist/test/framework/analyzers/ToolCallAnalyzer.js +215 -0
  177. package/dist/test/framework/analyzers/ToolCallAnalyzer.js.map +1 -0
  178. package/dist/test/framework/cli.d.ts +8 -0
  179. package/dist/test/framework/cli.d.ts.map +1 -0
  180. package/dist/test/framework/cli.js +175 -0
  181. package/dist/test/framework/cli.js.map +1 -0
  182. package/dist/test/framework/core/TestCase.d.ts +100 -0
  183. package/dist/test/framework/core/TestCase.d.ts.map +1 -0
  184. package/dist/test/framework/core/TestCase.js +101 -0
  185. package/dist/test/framework/core/TestCase.js.map +1 -0
  186. package/dist/test/framework/core/TestEngine.d.ts +89 -0
  187. package/dist/test/framework/core/TestEngine.d.ts.map +1 -0
  188. package/dist/test/framework/core/TestEngine.js +552 -0
  189. package/dist/test/framework/core/TestEngine.js.map +1 -0
  190. package/dist/test/framework/core/TestResult.d.ts +143 -0
  191. package/dist/test/framework/core/TestResult.d.ts.map +1 -0
  192. package/dist/test/framework/core/TestResult.js +76 -0
  193. package/dist/test/framework/core/TestResult.js.map +1 -0
  194. package/dist/test/framework/examples/BasicRobustnessTest.d.ts +19 -0
  195. package/dist/test/framework/examples/BasicRobustnessTest.d.ts.map +1 -0
  196. package/dist/test/framework/examples/BasicRobustnessTest.js +116 -0
  197. package/dist/test/framework/examples/BasicRobustnessTest.js.map +1 -0
  198. package/dist/test/framework/index.d.ts +30 -0
  199. package/dist/test/framework/index.d.ts.map +1 -0
  200. package/dist/test/framework/index.js +38 -0
  201. package/dist/test/framework/index.js.map +1 -0
  202. package/dist/test/framework/loaders/JsonScenarioLoader.d.ts +99 -0
  203. package/dist/test/framework/loaders/JsonScenarioLoader.d.ts.map +1 -0
  204. package/dist/test/framework/loaders/JsonScenarioLoader.js +197 -0
  205. package/dist/test/framework/loaders/JsonScenarioLoader.js.map +1 -0
  206. package/dist/test/framework/reporters/ConsoleReporter.d.ts +25 -0
  207. package/dist/test/framework/reporters/ConsoleReporter.d.ts.map +1 -0
  208. package/dist/test/framework/reporters/ConsoleReporter.js +196 -0
  209. package/dist/test/framework/reporters/ConsoleReporter.js.map +1 -0
  210. package/dist/test/framework/scenarios/ScenarioBuilder.d.ts +62 -0
  211. package/dist/test/framework/scenarios/ScenarioBuilder.d.ts.map +1 -0
  212. package/dist/test/framework/scenarios/ScenarioBuilder.js +285 -0
  213. package/dist/test/framework/scenarios/ScenarioBuilder.js.map +1 -0
  214. package/dist/test/framework/validate-framework.d.ts +9 -0
  215. package/dist/test/framework/validate-framework.d.ts.map +1 -0
  216. package/dist/test/framework/validate-framework.js +187 -0
  217. package/dist/test/framework/validate-framework.js.map +1 -0
  218. package/package.json +84 -0
@@ -0,0 +1,412 @@
1
+ /**
2
+ * 代码变更分析器
3
+ *
4
+ * 分析和评估 AI Agent 产生的文件变更、代码质量、功能完整性等
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ export class CodeChangeAnalyzer {
9
+ /**
10
+ * 分析项目文件变更
11
+ */
12
+ static async analyzeFileChanges(projectPath, beforeSnapshot, afterSnapshot) {
13
+ const changes = [];
14
+ // 检查新创建的文件
15
+ for (const [filePath, snapshot] of afterSnapshot) {
16
+ if (!beforeSnapshot.has(filePath)) {
17
+ changes.push({
18
+ type: 'created',
19
+ path: filePath,
20
+ sizeAfter: snapshot.size,
21
+ contentPreview: this.getContentPreview(snapshot.content),
22
+ timestamp: snapshot.lastModified
23
+ });
24
+ }
25
+ }
26
+ // 检查修改的文件
27
+ for (const [filePath, afterSnap] of afterSnapshot) {
28
+ const beforeSnap = beforeSnapshot.get(filePath);
29
+ if (beforeSnap && beforeSnap.hash !== afterSnap.hash) {
30
+ changes.push({
31
+ type: 'modified',
32
+ path: filePath,
33
+ sizeBefore: beforeSnap.size,
34
+ sizeAfter: afterSnap.size,
35
+ contentPreview: this.getContentPreview(afterSnap.content),
36
+ timestamp: afterSnap.lastModified
37
+ });
38
+ }
39
+ }
40
+ // 检查删除的文件
41
+ for (const [filePath, snapshot] of beforeSnapshot) {
42
+ if (!afterSnapshot.has(filePath)) {
43
+ changes.push({
44
+ type: 'deleted',
45
+ path: filePath,
46
+ sizeBefore: snapshot.size,
47
+ timestamp: new Date()
48
+ });
49
+ }
50
+ }
51
+ return changes;
52
+ }
53
+ /**
54
+ * 分析代码质量
55
+ */
56
+ static async analyzeCodeQuality(projectPath, fileChanges) {
57
+ const result = {
58
+ syntaxErrors: 0,
59
+ structuralIssues: 0,
60
+ bestPracticeViolations: 0,
61
+ totalIssues: 0,
62
+ qualityScore: 1.0,
63
+ issues: []
64
+ };
65
+ // 分析每个变更的文件
66
+ for (const change of fileChanges) {
67
+ if (change.type === 'deleted')
68
+ continue;
69
+ const filePath = path.join(projectPath, change.path);
70
+ try {
71
+ const content = await fs.readFile(filePath, 'utf-8');
72
+ const fileIssues = await this.analyzeFileQuality(filePath, content);
73
+ result.issues.push(...fileIssues);
74
+ }
75
+ catch (error) {
76
+ result.issues.push({
77
+ type: 'syntax',
78
+ severity: 'error',
79
+ message: `无法读取文件: ${error}`,
80
+ file: change.path
81
+ });
82
+ }
83
+ }
84
+ // 统计问题数量
85
+ result.syntaxErrors = result.issues.filter(i => i.type === 'syntax' && i.severity === 'error').length;
86
+ result.structuralIssues = result.issues.filter(i => i.type === 'structure').length;
87
+ result.bestPracticeViolations = result.issues.filter(i => i.type === 'best-practice').length;
88
+ result.totalIssues = result.issues.length;
89
+ // 计算质量得分
90
+ result.qualityScore = this.calculateQualityScore(result);
91
+ return result;
92
+ }
93
+ /**
94
+ * 分析任务完成情况
95
+ */
96
+ static async analyzeTaskCompletion(testCase, projectPath, fileChanges) {
97
+ const result = {
98
+ completed: false,
99
+ completionScore: 0,
100
+ functionalityImplemented: [],
101
+ functionalityMissing: [],
102
+ backwardCompatibility: true,
103
+ regressionIssues: []
104
+ };
105
+ // 检查期望的变更是否实现
106
+ const implementedChanges = await this.checkExpectedChanges(testCase.expectedChanges, fileChanges, projectPath);
107
+ result.functionalityImplemented = implementedChanges.implemented;
108
+ result.functionalityMissing = implementedChanges.missing;
109
+ result.completionScore = implementedChanges.score;
110
+ result.completed = result.completionScore >= 0.8;
111
+ // 检查向后兼容性
112
+ result.backwardCompatibility = await this.checkBackwardCompatibility(projectPath, fileChanges);
113
+ return result;
114
+ }
115
+ /**
116
+ * 分析单个文件的代码质量
117
+ */
118
+ static async analyzeFileQuality(filePath, content) {
119
+ const issues = [];
120
+ const ext = path.extname(filePath).toLowerCase();
121
+ // Java 文件分析
122
+ if (ext === '.java') {
123
+ issues.push(...this.analyzeJavaFile(filePath, content));
124
+ }
125
+ // TypeScript/JavaScript 文件分析
126
+ else if (ext === '.ts' || ext === '.js') {
127
+ issues.push(...this.analyzeTypeScriptFile(filePath, content));
128
+ }
129
+ // Kotlin 文件分析
130
+ else if (ext === '.kt') {
131
+ issues.push(...this.analyzeKotlinFile(filePath, content));
132
+ }
133
+ // 配置文件分析
134
+ else if (['.json', '.yml', '.yaml', '.xml', '.properties'].includes(ext)) {
135
+ issues.push(...this.analyzeConfigFile(filePath, content));
136
+ }
137
+ return issues;
138
+ }
139
+ /**
140
+ * 分析 Java 文件
141
+ */
142
+ static analyzeJavaFile(filePath, content) {
143
+ const issues = [];
144
+ const lines = content.split('\n');
145
+ // 检查基本语法问题
146
+ if (!content.includes('class ') && !content.includes('interface ') && !content.includes('enum ')) {
147
+ issues.push({
148
+ type: 'syntax',
149
+ severity: 'error',
150
+ message: '文件中没有找到类、接口或枚举定义',
151
+ file: filePath
152
+ });
153
+ }
154
+ // 检查包声明
155
+ if (!content.startsWith('package ')) {
156
+ issues.push({
157
+ type: 'structure',
158
+ severity: 'warning',
159
+ message: '缺少包声明',
160
+ file: filePath,
161
+ line: 1
162
+ });
163
+ }
164
+ // 检查大括号匹配
165
+ const openBraces = (content.match(/\{/g) || []).length;
166
+ const closeBraces = (content.match(/\}/g) || []).length;
167
+ if (openBraces !== closeBraces) {
168
+ issues.push({
169
+ type: 'syntax',
170
+ severity: 'error',
171
+ message: '大括号不匹配',
172
+ file: filePath
173
+ });
174
+ }
175
+ // 检查最佳实践
176
+ if (content.includes('System.out.println')) {
177
+ issues.push({
178
+ type: 'best-practice',
179
+ severity: 'info',
180
+ message: '建议使用日志框架而不是 System.out.println',
181
+ file: filePath
182
+ });
183
+ }
184
+ return issues;
185
+ }
186
+ /**
187
+ * 分析 TypeScript 文件
188
+ */
189
+ static analyzeTypeScriptFile(filePath, content) {
190
+ const issues = [];
191
+ // 检查基本语法
192
+ const openBraces = (content.match(/\{/g) || []).length;
193
+ const closeBraces = (content.match(/\}/g) || []).length;
194
+ if (openBraces !== closeBraces) {
195
+ issues.push({
196
+ type: 'syntax',
197
+ severity: 'error',
198
+ message: '大括号不匹配',
199
+ file: filePath
200
+ });
201
+ }
202
+ // 检查分号使用
203
+ const lines = content.split('\n');
204
+ lines.forEach((line, index) => {
205
+ const trimmed = line.trim();
206
+ if (trimmed && !trimmed.endsWith(';') && !trimmed.endsWith('{') &&
207
+ !trimmed.endsWith('}') && !trimmed.startsWith('//') &&
208
+ !trimmed.startsWith('*') && !trimmed.startsWith('import')) {
209
+ issues.push({
210
+ type: 'best-practice',
211
+ severity: 'info',
212
+ message: '建议在语句末尾添加分号',
213
+ file: filePath,
214
+ line: index + 1
215
+ });
216
+ }
217
+ });
218
+ return issues;
219
+ }
220
+ /**
221
+ * 分析 Kotlin 文件
222
+ */
223
+ static analyzeKotlinFile(filePath, content) {
224
+ const issues = [];
225
+ // 检查基本语法
226
+ if (!content.includes('class ') && !content.includes('interface ') &&
227
+ !content.includes('object ') && !content.includes('fun ')) {
228
+ issues.push({
229
+ type: 'syntax',
230
+ severity: 'warning',
231
+ message: '文件中没有找到类、接口、对象或函数定义',
232
+ file: filePath
233
+ });
234
+ }
235
+ return issues;
236
+ }
237
+ /**
238
+ * 分析配置文件
239
+ */
240
+ static analyzeConfigFile(filePath, content) {
241
+ const issues = [];
242
+ const ext = path.extname(filePath).toLowerCase();
243
+ try {
244
+ if (ext === '.json') {
245
+ JSON.parse(content);
246
+ }
247
+ else if (ext === '.xml') {
248
+ // 简单的 XML 格式检查
249
+ if (!content.includes('<?xml') && content.includes('<')) {
250
+ issues.push({
251
+ type: 'syntax',
252
+ severity: 'warning',
253
+ message: '可能缺少 XML 声明',
254
+ file: filePath
255
+ });
256
+ }
257
+ }
258
+ }
259
+ catch (error) {
260
+ issues.push({
261
+ type: 'syntax',
262
+ severity: 'error',
263
+ message: `配置文件格式错误: ${error}`,
264
+ file: filePath
265
+ });
266
+ }
267
+ return issues;
268
+ }
269
+ /**
270
+ * 检查期望的变更是否实现
271
+ */
272
+ static async checkExpectedChanges(expectedChanges, actualChanges, projectPath) {
273
+ const implemented = [];
274
+ const missing = [];
275
+ for (const expected of expectedChanges) {
276
+ let found = false;
277
+ switch (expected.type) {
278
+ case 'file-created':
279
+ found = actualChanges.some(change => change.type === 'created' &&
280
+ (expected.path ? change.path.includes(expected.path) : true) &&
281
+ (expected.pattern ? expected.pattern.test(change.path) : true));
282
+ break;
283
+ case 'file-modified':
284
+ found = actualChanges.some(change => change.type === 'modified' &&
285
+ (expected.path ? change.path.includes(expected.path) : true) &&
286
+ (expected.pattern ? expected.pattern.test(change.path) : true));
287
+ break;
288
+ case 'dependency-added':
289
+ // 检查构建文件是否包含新依赖
290
+ found = await this.checkDependencyAdded(projectPath, expected);
291
+ break;
292
+ }
293
+ if (found) {
294
+ implemented.push(`${expected.type}: ${expected.path || expected.pattern?.source || 'unknown'}`);
295
+ }
296
+ else if (expected.required) {
297
+ missing.push(`${expected.type}: ${expected.path || expected.pattern?.source || 'unknown'}`);
298
+ }
299
+ }
300
+ const requiredChanges = expectedChanges.filter(c => c.required).length;
301
+ const score = requiredChanges > 0 ? implemented.length / requiredChanges : 1;
302
+ return { implemented, missing, score };
303
+ }
304
+ /**
305
+ * 检查依赖是否已添加
306
+ */
307
+ static async checkDependencyAdded(projectPath, expected) {
308
+ const buildFiles = ['build.gradle.kts', 'build.gradle', 'pom.xml', 'package.json'];
309
+ for (const buildFile of buildFiles) {
310
+ const filePath = path.join(projectPath, buildFile);
311
+ try {
312
+ const content = await fs.readFile(filePath, 'utf-8');
313
+ if (expected.content) {
314
+ const pattern = typeof expected.content === 'string'
315
+ ? new RegExp(expected.content, 'i')
316
+ : expected.content;
317
+ if (pattern.test(content)) {
318
+ return true;
319
+ }
320
+ }
321
+ }
322
+ catch (error) {
323
+ // 文件不存在,继续检查下一个
324
+ }
325
+ }
326
+ return false;
327
+ }
328
+ /**
329
+ * 检查向后兼容性
330
+ */
331
+ static async checkBackwardCompatibility(projectPath, fileChanges) {
332
+ // 检查是否删除了重要文件
333
+ const deletedFiles = fileChanges.filter(c => c.type === 'deleted');
334
+ const criticalFiles = deletedFiles.filter(f => f.path.includes('Application.') ||
335
+ f.path.includes('Controller.') ||
336
+ f.path.includes('Service.'));
337
+ return criticalFiles.length === 0;
338
+ }
339
+ /**
340
+ * 计算代码质量得分
341
+ */
342
+ static calculateQualityScore(result) {
343
+ const errorWeight = 0.5;
344
+ const warningWeight = 0.3;
345
+ const infoWeight = 0.2;
346
+ const errors = result.issues.filter(i => i.severity === 'error').length;
347
+ const warnings = result.issues.filter(i => i.severity === 'warning').length;
348
+ const infos = result.issues.filter(i => i.severity === 'info').length;
349
+ const penalty = errors * errorWeight + warnings * warningWeight + infos * infoWeight;
350
+ return Math.max(0, 1 - penalty / 10); // 假设10个错误为最低分
351
+ }
352
+ /**
353
+ * 获取内容预览
354
+ */
355
+ static getContentPreview(content, maxLength = 200) {
356
+ if (content.length <= maxLength)
357
+ return content;
358
+ return content.substring(0, maxLength) + '...';
359
+ }
360
+ /**
361
+ * 创建文件快照
362
+ */
363
+ static async createSnapshot(projectPath) {
364
+ const snapshot = new Map();
365
+ try {
366
+ await this.walkDirectory(projectPath, async (filePath) => {
367
+ const relativePath = path.relative(projectPath, filePath);
368
+ const stats = await fs.stat(filePath);
369
+ const content = await fs.readFile(filePath, 'utf-8');
370
+ snapshot.set(relativePath, {
371
+ path: relativePath,
372
+ content,
373
+ size: stats.size,
374
+ lastModified: stats.mtime,
375
+ hash: this.simpleHash(content)
376
+ });
377
+ });
378
+ }
379
+ catch (error) {
380
+ console.warn(`创建快照时出错: ${error}`);
381
+ }
382
+ return snapshot;
383
+ }
384
+ /**
385
+ * 遍历目录
386
+ */
387
+ static async walkDirectory(dir, callback) {
388
+ const entries = await fs.readdir(dir, { withFileTypes: true });
389
+ for (const entry of entries) {
390
+ const fullPath = path.join(dir, entry.name);
391
+ if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
392
+ await this.walkDirectory(fullPath, callback);
393
+ }
394
+ else if (entry.isFile()) {
395
+ await callback(fullPath);
396
+ }
397
+ }
398
+ }
399
+ /**
400
+ * 简单哈希函数
401
+ */
402
+ static simpleHash(str) {
403
+ let hash = 0;
404
+ for (let i = 0; i < str.length; i++) {
405
+ const char = str.charCodeAt(i);
406
+ hash = ((hash << 5) - hash) + char;
407
+ hash = hash & hash; // 转换为32位整数
408
+ }
409
+ return hash.toString(16);
410
+ }
411
+ }
412
+ //# sourceMappingURL=CodeChangeAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeChangeAnalyzer.js","sourceRoot":"","sources":["../../../../src/test/framework/analyzers/CodeChangeAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 提示词效果分析器
3
+ *
4
+ * 分析 AI Agent 是否按照系统提示词的指导进行操作,
5
+ * 验证提示词的有效性和 Agent 的遵循程度
6
+ */
7
+ import { PromptAnalysisResult, ExecutionInfo, ToolCallInfo } from '../core/TestResult';
8
+ import { TestCase } from '../core/TestCase';
9
+ export interface PromptPattern {
10
+ name: string;
11
+ pattern: RegExp;
12
+ weight: number;
13
+ description: string;
14
+ }
15
+ export declare class PromptAnalyzer {
16
+ private static readonly PROMPT_PATTERNS;
17
+ /**
18
+ * 分析 Agent 输出是否符合系统提示词的指导
19
+ */
20
+ static analyze(testCase: TestCase, executionInfo: ExecutionInfo, toolCalls: ToolCallInfo[]): PromptAnalysisResult;
21
+ /**
22
+ * 检查系统提示词遵循情况
23
+ */
24
+ private static checkSystemPromptCompliance;
25
+ /**
26
+ * 检查是否首先探索了项目结构
27
+ */
28
+ private static checkProjectExploration;
29
+ /**
30
+ * 检查工具使用的合适性
31
+ */
32
+ private static checkToolAppropriatenesss;
33
+ /**
34
+ * 检查错误处理能力
35
+ */
36
+ private static checkErrorHandling;
37
+ /**
38
+ * 计算提示词有效性得分
39
+ */
40
+ private static calculateEffectivenessScore;
41
+ /**
42
+ * 生成提示词改进建议
43
+ */
44
+ static generateImprovementSuggestions(result: PromptAnalysisResult): string[];
45
+ }
46
+ //# sourceMappingURL=PromptAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptAnalyzer.d.ts","sourceRoot":"","sources":["../../../../src/test/framework/analyzers/PromptAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAqB,MAAM,kBAAkB,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IAEzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CA+BrC;IAEF;;OAEG;IACH,MAAM,CAAC,OAAO,CACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,YAAY,EAAE,GACxB,oBAAoB;IAuDvB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAe1C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAYtC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAexC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAiBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IA6B1C;;OAEG;IACH,MAAM,CAAC,8BAA8B,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,EAAE;CAqB9E"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * 提示词效果分析器
3
+ *
4
+ * 分析 AI Agent 是否按照系统提示词的指导进行操作,
5
+ * 验证提示词的有效性和 Agent 的遵循程度
6
+ */
7
+ export class PromptAnalyzer {
8
+ // 系统提示词相关的行为模式
9
+ static PROMPT_PATTERNS = [
10
+ {
11
+ name: 'project_exploration',
12
+ pattern: /(?:glob|list|explore|structure|understand)/i,
13
+ weight: 0.2,
14
+ description: '是否首先探索项目结构'
15
+ },
16
+ {
17
+ name: 'tool_selection',
18
+ pattern: /(?:read-file|write-file|grep|shell)/i,
19
+ weight: 0.3,
20
+ description: '是否选择了合适的工具'
21
+ },
22
+ {
23
+ name: 'error_handling',
24
+ pattern: /(?:error|failed|exception|recovery)/i,
25
+ weight: 0.2,
26
+ description: '是否处理了错误情况'
27
+ },
28
+ {
29
+ name: 'systematic_approach',
30
+ pattern: /(?:step|first|then|next|finally)/i,
31
+ weight: 0.15,
32
+ description: '是否采用系统性方法'
33
+ },
34
+ {
35
+ name: 'code_quality',
36
+ pattern: /(?:test|quality|best.practice|standard)/i,
37
+ weight: 0.15,
38
+ description: '是否关注代码质量'
39
+ }
40
+ ];
41
+ /**
42
+ * 分析 Agent 输出是否符合系统提示词的指导
43
+ */
44
+ static analyze(testCase, executionInfo, toolCalls) {
45
+ const output = executionInfo.stdout + executionInfo.stderr;
46
+ const expectation = testCase.expectedPromptBehavior;
47
+ const result = {
48
+ followedSystemPrompt: false,
49
+ exploredProjectFirst: false,
50
+ usedAppropriateTools: false,
51
+ handledErrorsGracefully: false,
52
+ promptEffectivenessScore: 0,
53
+ issues: []
54
+ };
55
+ // 1. 检查是否遵循了系统提示词
56
+ result.followedSystemPrompt = this.checkSystemPromptCompliance(output, expectation);
57
+ // 2. 检查是否首先探索项目
58
+ if (expectation.shouldExploreProjectFirst) {
59
+ result.exploredProjectFirst = this.checkProjectExploration(toolCalls);
60
+ if (!result.exploredProjectFirst) {
61
+ result.issues.push('Agent 没有首先探索项目结构');
62
+ }
63
+ }
64
+ // 3. 检查工具使用是否合适
65
+ if (expectation.shouldUseAppropriateTools) {
66
+ result.usedAppropriateTools = this.checkToolAppropriatenesss(toolCalls, testCase);
67
+ if (!result.usedAppropriateTools) {
68
+ result.issues.push('Agent 没有使用合适的工具');
69
+ }
70
+ }
71
+ // 4. 检查错误处理
72
+ if (expectation.shouldHandleErrorsGracefully) {
73
+ result.handledErrorsGracefully = this.checkErrorHandling(output, toolCalls);
74
+ if (!result.handledErrorsGracefully) {
75
+ result.issues.push('Agent 没有优雅地处理错误');
76
+ }
77
+ }
78
+ // 5. 运行自定义验证
79
+ if (expectation.customValidations) {
80
+ for (const validation of expectation.customValidations) {
81
+ if (!validation(output)) {
82
+ result.issues.push('自定义验证失败');
83
+ }
84
+ }
85
+ }
86
+ // 6. 计算提示词有效性得分
87
+ result.promptEffectivenessScore = this.calculateEffectivenessScore(output, result);
88
+ return result;
89
+ }
90
+ /**
91
+ * 检查系统提示词遵循情况
92
+ */
93
+ static checkSystemPromptCompliance(output, expectation) {
94
+ // 检查输出中是否包含系统提示词相关的行为指标
95
+ const indicators = [
96
+ /(?:analyzing|understanding|exploring)/i,
97
+ /(?:using|calling|executing).+(?:tool|command)/i,
98
+ /(?:reading|writing|modifying).+file/i,
99
+ /(?:step|approach|method)/i
100
+ ];
101
+ return indicators.some(pattern => pattern.test(output));
102
+ }
103
+ /**
104
+ * 检查是否首先探索了项目结构
105
+ */
106
+ static checkProjectExploration(toolCalls) {
107
+ if (toolCalls.length === 0)
108
+ return false;
109
+ // 检查前几个工具调用是否包含探索性工具
110
+ const explorationTools = ['glob', 'read-file', 'ls', 'find'];
111
+ const firstFewCalls = toolCalls.slice(0, Math.min(3, toolCalls.length));
112
+ return firstFewCalls.some(call => explorationTools.some(tool => call.tool.toLowerCase().includes(tool)));
113
+ }
114
+ /**
115
+ * 检查工具使用的合适性
116
+ */
117
+ static checkToolAppropriatenesss(toolCalls, testCase) {
118
+ const expectedTools = testCase.expectedToolCalls.map(exp => exp.tool.toLowerCase());
119
+ const actualTools = toolCalls.map(call => call.tool.toLowerCase());
120
+ // 计算期望工具的覆盖率
121
+ const coverage = expectedTools.filter(tool => actualTools.some(actual => actual.includes(tool))).length / expectedTools.length;
122
+ return coverage >= 0.6; // 至少60%的期望工具被使用
123
+ }
124
+ /**
125
+ * 检查错误处理能力
126
+ */
127
+ static checkErrorHandling(output, toolCalls) {
128
+ const hasErrors = output.includes('Error') || output.includes('Failed') ||
129
+ toolCalls.some(call => !call.success);
130
+ if (!hasErrors)
131
+ return true; // 没有错误,无需处理
132
+ // 检查是否有错误恢复的迹象
133
+ const recoveryIndicators = [
134
+ /(?:retry|retrying|trying.again)/i,
135
+ /(?:alternative|different.approach)/i,
136
+ /(?:fixing|correcting|resolving)/i,
137
+ /(?:error.recovery|recovery.mode)/i
138
+ ];
139
+ return recoveryIndicators.some(pattern => pattern.test(output));
140
+ }
141
+ /**
142
+ * 计算提示词有效性得分
143
+ */
144
+ static calculateEffectivenessScore(output, result) {
145
+ let score = 0;
146
+ let totalWeight = 0;
147
+ // 基于模式匹配计算得分
148
+ for (const pattern of this.PROMPT_PATTERNS) {
149
+ totalWeight += pattern.weight;
150
+ if (pattern.pattern.test(output)) {
151
+ score += pattern.weight;
152
+ }
153
+ }
154
+ // 基于具体检查结果调整得分
155
+ const checks = [
156
+ result.exploredProjectFirst,
157
+ result.usedAppropriateTools,
158
+ result.handledErrorsGracefully,
159
+ result.followedSystemPrompt
160
+ ];
161
+ const checkScore = checks.filter(Boolean).length / checks.length * 0.4;
162
+ const patternScore = totalWeight > 0 ? (score / totalWeight) * 0.6 : 0;
163
+ return Math.min(1, patternScore + checkScore);
164
+ }
165
+ /**
166
+ * 生成提示词改进建议
167
+ */
168
+ static generateImprovementSuggestions(result) {
169
+ const suggestions = [];
170
+ if (!result.exploredProjectFirst) {
171
+ suggestions.push('建议在系统提示词中强调首先探索项目结构的重要性');
172
+ }
173
+ if (!result.usedAppropriateTools) {
174
+ suggestions.push('建议在系统提示词中提供更明确的工具选择指导');
175
+ }
176
+ if (!result.handledErrorsGracefully) {
177
+ suggestions.push('建议在系统提示词中加强错误处理和恢复策略的描述');
178
+ }
179
+ if (result.promptEffectivenessScore < 0.7) {
180
+ suggestions.push('建议重新审视系统提示词的结构和内容,提高指导的明确性');
181
+ }
182
+ return suggestions;
183
+ }
184
+ }
185
+ //# sourceMappingURL=PromptAnalyzer.js.map