@dommaker/harness 0.7.2 → 0.7.4

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 (121) hide show
  1. package/README.md +390 -5
  2. package/dist/architecture/constraint-engine.d.ts +49 -0
  3. package/dist/architecture/constraint-engine.d.ts.map +1 -0
  4. package/dist/architecture/constraint-engine.js +207 -0
  5. package/dist/architecture/constraint-engine.js.map +1 -0
  6. package/dist/architecture/cross-project-checker.d.ts +34 -0
  7. package/dist/architecture/cross-project-checker.d.ts.map +1 -0
  8. package/dist/architecture/cross-project-checker.js +260 -0
  9. package/dist/architecture/cross-project-checker.js.map +1 -0
  10. package/dist/context/progressive-loader.d.ts +110 -0
  11. package/dist/context/progressive-loader.d.ts.map +1 -0
  12. package/dist/context/progressive-loader.js +183 -0
  13. package/dist/context/progressive-loader.js.map +1 -0
  14. package/dist/context/token-budget.d.ts +144 -0
  15. package/dist/context/token-budget.d.ts.map +1 -0
  16. package/dist/context/token-budget.js +264 -0
  17. package/dist/context/token-budget.js.map +1 -0
  18. package/dist/core/constraints/definitions.d.ts.map +1 -1
  19. package/dist/core/constraints/definitions.js +33 -0
  20. package/dist/core/constraints/definitions.js.map +1 -1
  21. package/dist/core/index.d.ts +2 -0
  22. package/dist/core/index.d.ts.map +1 -1
  23. package/dist/core/index.js +4 -0
  24. package/dist/core/index.js.map +1 -1
  25. package/dist/failure/classifier.d.ts +63 -0
  26. package/dist/failure/classifier.d.ts.map +1 -0
  27. package/dist/failure/classifier.js +123 -0
  28. package/dist/failure/classifier.js.map +1 -0
  29. package/dist/failure/index.d.ts +10 -0
  30. package/dist/failure/index.d.ts.map +1 -0
  31. package/dist/failure/index.js +36 -0
  32. package/dist/failure/index.js.map +1 -0
  33. package/dist/failure/recorder.d.ts +78 -0
  34. package/dist/failure/recorder.d.ts.map +1 -0
  35. package/dist/failure/recorder.js +193 -0
  36. package/dist/failure/recorder.js.map +1 -0
  37. package/dist/failure/types.d.ts +89 -0
  38. package/dist/failure/types.d.ts.map +1 -0
  39. package/dist/failure/types.js +121 -0
  40. package/dist/failure/types.js.map +1 -0
  41. package/dist/gates/acceptance.d.ts +159 -0
  42. package/dist/gates/acceptance.d.ts.map +1 -0
  43. package/dist/gates/acceptance.js +368 -0
  44. package/dist/gates/acceptance.js.map +1 -0
  45. package/dist/gates/contract.d.ts +41 -0
  46. package/dist/gates/contract.d.ts.map +1 -0
  47. package/dist/gates/contract.js +264 -0
  48. package/dist/gates/contract.js.map +1 -0
  49. package/dist/gates/index.d.ts +23 -0
  50. package/dist/gates/index.d.ts.map +1 -0
  51. package/dist/gates/index.js +46 -0
  52. package/dist/gates/index.js.map +1 -0
  53. package/dist/gates/performance.d.ts +81 -0
  54. package/dist/gates/performance.d.ts.map +1 -0
  55. package/dist/gates/performance.js +336 -0
  56. package/dist/gates/performance.js.map +1 -0
  57. package/dist/gates/review.d.ts +37 -0
  58. package/dist/gates/review.d.ts.map +1 -0
  59. package/dist/gates/review.js +149 -0
  60. package/dist/gates/review.js.map +1 -0
  61. package/dist/gates/security.d.ts +45 -0
  62. package/dist/gates/security.d.ts.map +1 -0
  63. package/dist/gates/security.js +221 -0
  64. package/dist/gates/security.js.map +1 -0
  65. package/dist/gates/types.d.ts +115 -0
  66. package/dist/gates/types.d.ts.map +1 -0
  67. package/dist/gates/types.js +6 -0
  68. package/dist/gates/types.js.map +1 -0
  69. package/dist/index.d.ts +15 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +30 -5
  72. package/dist/index.js.map +1 -1
  73. package/dist/monitoring/index.d.ts +6 -0
  74. package/dist/monitoring/index.d.ts.map +1 -1
  75. package/dist/monitoring/index.js +6 -0
  76. package/dist/monitoring/index.js.map +1 -1
  77. package/dist/monitoring/performance-analyzer.d.ts +104 -0
  78. package/dist/monitoring/performance-analyzer.d.ts.map +1 -0
  79. package/dist/monitoring/performance-analyzer.js +417 -0
  80. package/dist/monitoring/performance-analyzer.js.map +1 -0
  81. package/dist/monitoring/performance-collector.d.ts +111 -0
  82. package/dist/monitoring/performance-collector.d.ts.map +1 -0
  83. package/dist/monitoring/performance-collector.js +319 -0
  84. package/dist/monitoring/performance-collector.js.map +1 -0
  85. package/dist/monitoring/trace-analyzer.js +1 -1
  86. package/dist/monitoring/trace-analyzer.js.map +1 -1
  87. package/dist/monitoring/traces.js +1 -1
  88. package/dist/monitoring/traces.js.map +1 -1
  89. package/dist/presets/index.d.ts +0 -1
  90. package/dist/presets/index.d.ts.map +1 -1
  91. package/dist/presets/index.js +1 -6
  92. package/dist/presets/index.js.map +1 -1
  93. package/dist/spec/annotation-checker.d.ts +47 -0
  94. package/dist/spec/annotation-checker.d.ts.map +1 -0
  95. package/dist/spec/annotation-checker.js +299 -0
  96. package/dist/spec/annotation-checker.js.map +1 -0
  97. package/dist/types/index.d.ts +2 -0
  98. package/dist/types/index.d.ts.map +1 -1
  99. package/dist/types/index.js +9 -0
  100. package/dist/types/index.js.map +1 -1
  101. package/dist/types/performance.d.ts +204 -0
  102. package/dist/types/performance.d.ts.map +1 -0
  103. package/dist/types/performance.js +12 -0
  104. package/dist/types/performance.js.map +1 -0
  105. package/package.json +3 -1
  106. package/dist/extensions/long-running/constraints.d.ts +0 -38
  107. package/dist/extensions/long-running/constraints.d.ts.map +0 -1
  108. package/dist/extensions/long-running/constraints.js +0 -153
  109. package/dist/extensions/long-running/constraints.js.map +0 -1
  110. package/dist/extensions/long-running/index.d.ts +0 -30
  111. package/dist/extensions/long-running/index.d.ts.map +0 -1
  112. package/dist/extensions/long-running/index.js +0 -50
  113. package/dist/extensions/long-running/index.js.map +0 -1
  114. package/dist/extensions/long-running/types.d.ts +0 -154
  115. package/dist/extensions/long-running/types.d.ts.map +0 -1
  116. package/dist/extensions/long-running/types.js +0 -9
  117. package/dist/extensions/long-running/types.js.map +0 -1
  118. package/dist/presets/long-running.d.ts +0 -33
  119. package/dist/presets/long-running.d.ts.map +0 -1
  120. package/dist/presets/long-running.js +0 -52
  121. package/dist/presets/long-running.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/failure/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * 验收标准门禁
3
+ *
4
+ * 功能:
5
+ * 1. 验证任务是否满足验收标准
6
+ * 2. 解析 tasks.yml 中的验收条件
7
+ * 3. 检查所有验收条件是否满足
8
+ * 4. 运行关联的 E2E 测试
9
+ *
10
+ * 使用示例:
11
+ * ```typescript
12
+ * const gate = new SpecAcceptanceGate();
13
+ * const result = await gate.check({
14
+ * projectPath: '/path/to/project',
15
+ * taskId: 'TASK-001',
16
+ * });
17
+ * ```
18
+ */
19
+ /**
20
+ * 验收标准门禁配置
21
+ */
22
+ export interface SpecAcceptanceGateConfig {
23
+ /** tasks.yml 路径 */
24
+ tasksPath?: string;
25
+ /** 是否检查所有任务 */
26
+ checkAllTasks?: boolean;
27
+ /** 自定义验收条件 */
28
+ customAcceptanceCriteria?: Record<string, (task: any) => Promise<boolean>>;
29
+ /** E2E 测试命令模板 */
30
+ e2eTestCommand?: string;
31
+ /** E2E 测试超时时间(毫秒) */
32
+ e2eTestTimeout?: number;
33
+ /** 项目路径 */
34
+ projectPath?: string;
35
+ }
36
+ /**
37
+ * 验收标准门禁上下文
38
+ */
39
+ export interface AcceptanceGateContext {
40
+ /** 项目路径 */
41
+ projectPath: string;
42
+ /** 任务 ID */
43
+ taskId?: string;
44
+ /** tasks.yml 路径 */
45
+ tasksPath?: string;
46
+ }
47
+ /**
48
+ * 验收标准(旧格式,向后兼容)
49
+ */
50
+ export interface AcceptanceCriteria {
51
+ id: string;
52
+ description: string;
53
+ type: 'manual' | 'automated' | 'test';
54
+ required: boolean;
55
+ checked?: boolean;
56
+ notes?: string;
57
+ }
58
+ /**
59
+ * 验收条件(新格式,支持 E2E 测试关联)
60
+ */
61
+ export interface AcceptanceCondition {
62
+ description: string;
63
+ e2e_test?: string;
64
+ test_name?: string;
65
+ checked?: boolean;
66
+ }
67
+ /**
68
+ * 任务定义
69
+ */
70
+ export interface TaskDefinition {
71
+ id: string;
72
+ title?: string;
73
+ name?: string;
74
+ description?: string;
75
+ /** 旧格式 */
76
+ acceptance_criteria?: AcceptanceCriteria[];
77
+ /** 新格式(支持 E2E 测试) */
78
+ acceptance?: AcceptanceCondition[];
79
+ status?: string;
80
+ completed?: boolean;
81
+ }
82
+ /**
83
+ * Tasks 文件结构
84
+ */
85
+ export interface TasksFile {
86
+ tasks: TaskDefinition[];
87
+ version?: string;
88
+ }
89
+ /**
90
+ * 验收门禁结果
91
+ */
92
+ export interface AcceptanceGateResult {
93
+ passed: boolean;
94
+ message: string;
95
+ timestamp: string;
96
+ details?: {
97
+ taskId?: string;
98
+ totalCriteria: number;
99
+ checkedCriteria: number;
100
+ uncheckedCriteria: string[];
101
+ missingCriteria: string[];
102
+ e2eTestResults?: E2ETestResult[];
103
+ };
104
+ }
105
+ /**
106
+ * E2E 测试结果
107
+ */
108
+ export interface E2ETestResult {
109
+ criteria: string;
110
+ testFile: string;
111
+ testName?: string;
112
+ passed: boolean;
113
+ output?: string;
114
+ error?: string;
115
+ }
116
+ /**
117
+ * 验收标准门禁
118
+ */
119
+ export declare class SpecAcceptanceGate {
120
+ private config;
121
+ constructor(config?: Partial<SpecAcceptanceGateConfig>);
122
+ /**
123
+ * 检查验收标准
124
+ */
125
+ check(context: AcceptanceGateContext): Promise<AcceptanceGateResult>;
126
+ /**
127
+ * 加载 tasks.yml
128
+ */
129
+ private loadTasks;
130
+ /**
131
+ * 检查单个任务
132
+ */
133
+ private checkSingleTask;
134
+ /**
135
+ * 检查所有任务
136
+ */
137
+ private checkAllTasks;
138
+ /**
139
+ * 检查已完成的任务
140
+ */
141
+ private checkCompletedTasks;
142
+ /**
143
+ * 验证任务
144
+ */
145
+ private validateTask;
146
+ /**
147
+ * 运行 E2E 测试
148
+ */
149
+ private runE2ETest;
150
+ /**
151
+ * 解析测试输出判断是否通过
152
+ */
153
+ private parseTestOutput;
154
+ }
155
+ /**
156
+ * 创建验收标准门禁(便捷函数)
157
+ */
158
+ export declare function createSpecAcceptanceGate(config?: Partial<SpecAcceptanceGateConfig>): SpecAcceptanceGate;
159
+ //# sourceMappingURL=acceptance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../src/gates/acceptance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ /**
3
+ * 验收标准门禁
4
+ *
5
+ * 功能:
6
+ * 1. 验证任务是否满足验收标准
7
+ * 2. 解析 tasks.yml 中的验收条件
8
+ * 3. 检查所有验收条件是否满足
9
+ * 4. 运行关联的 E2E 测试
10
+ *
11
+ * 使用示例:
12
+ * ```typescript
13
+ * const gate = new SpecAcceptanceGate();
14
+ * const result = await gate.check({
15
+ * projectPath: '/path/to/project',
16
+ * taskId: 'TASK-001',
17
+ * });
18
+ * ```
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.SpecAcceptanceGate = void 0;
55
+ exports.createSpecAcceptanceGate = createSpecAcceptanceGate;
56
+ const fs = __importStar(require("fs/promises"));
57
+ const path = __importStar(require("path"));
58
+ const yaml = __importStar(require("js-yaml"));
59
+ const child_process_1 = require("child_process");
60
+ const util_1 = require("util");
61
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
62
+ // ==================== SpecAcceptanceGate 类 ====================
63
+ /**
64
+ * 验收标准门禁
65
+ */
66
+ class SpecAcceptanceGate {
67
+ config;
68
+ constructor(config) {
69
+ this.config = {
70
+ tasksPath: './tasks.yml',
71
+ checkAllTasks: false,
72
+ e2eTestCommand: 'npx playwright test',
73
+ e2eTestTimeout: 120000,
74
+ ...config,
75
+ };
76
+ }
77
+ /**
78
+ * 检查验收标准
79
+ */
80
+ async check(context) {
81
+ try {
82
+ // 确定 tasks.yml 路径
83
+ const tasksPath = context.tasksPath ??
84
+ this.config.tasksPath ??
85
+ path.join(context.projectPath, 'tasks.yml');
86
+ // 加载 tasks 文件
87
+ const tasks = await this.loadTasks(tasksPath);
88
+ if (!tasks || !tasks.tasks || tasks.tasks.length === 0) {
89
+ return {
90
+ passed: true,
91
+ message: 'No tasks.yml found or no tasks defined, skipping',
92
+ timestamp: new Date().toISOString(),
93
+ };
94
+ }
95
+ // 检查特定任务或所有任务
96
+ if (context.taskId) {
97
+ return this.checkSingleTask(tasks, context.taskId, context.projectPath);
98
+ }
99
+ else if (this.config.checkAllTasks) {
100
+ return this.checkAllTasks(tasks, context.projectPath);
101
+ }
102
+ else {
103
+ // 默认只检查已完成任务
104
+ return this.checkCompletedTasks(tasks, context.projectPath);
105
+ }
106
+ }
107
+ catch (error) {
108
+ return {
109
+ passed: false,
110
+ message: `Acceptance gate error: ${error.message}`,
111
+ timestamp: new Date().toISOString(),
112
+ };
113
+ }
114
+ }
115
+ /**
116
+ * 加载 tasks.yml
117
+ */
118
+ async loadTasks(tasksPath) {
119
+ try {
120
+ const content = await fs.readFile(tasksPath, 'utf-8');
121
+ return yaml.load(content);
122
+ }
123
+ catch (error) {
124
+ if (error.code === 'ENOENT') {
125
+ return null;
126
+ }
127
+ throw error;
128
+ }
129
+ }
130
+ /**
131
+ * 检查单个任务
132
+ */
133
+ async checkSingleTask(tasks, taskId, projectPath) {
134
+ const task = tasks.tasks.find(t => t.id === taskId);
135
+ if (!task) {
136
+ return {
137
+ passed: false,
138
+ message: `Task not found: ${taskId}`,
139
+ timestamp: new Date().toISOString(),
140
+ };
141
+ }
142
+ return this.validateTask(task, projectPath);
143
+ }
144
+ /**
145
+ * 检查所有任务
146
+ */
147
+ async checkAllTasks(tasks, projectPath) {
148
+ const results = [];
149
+ for (const task of tasks.tasks) {
150
+ results.push(await this.validateTask(task, projectPath));
151
+ }
152
+ const failedTasks = results.filter(r => !r.passed);
153
+ if (failedTasks.length === 0) {
154
+ return {
155
+ passed: true,
156
+ message: 'All tasks pass acceptance criteria',
157
+ timestamp: new Date().toISOString(),
158
+ details: {
159
+ totalCriteria: results.length,
160
+ checkedCriteria: results.length,
161
+ uncheckedCriteria: [],
162
+ missingCriteria: [],
163
+ },
164
+ };
165
+ }
166
+ return {
167
+ passed: false,
168
+ message: `${failedTasks.length} task(s) fail acceptance criteria`,
169
+ timestamp: new Date().toISOString(),
170
+ details: {
171
+ totalCriteria: results.length,
172
+ checkedCriteria: results.length - failedTasks.length,
173
+ uncheckedCriteria: failedTasks.map(r => r.message),
174
+ missingCriteria: [],
175
+ },
176
+ };
177
+ }
178
+ /**
179
+ * 检查已完成的任务
180
+ */
181
+ async checkCompletedTasks(tasks, projectPath) {
182
+ const completedTasks = tasks.tasks.filter(t => t.completed || t.status === 'done');
183
+ if (completedTasks.length === 0) {
184
+ return {
185
+ passed: true,
186
+ message: 'No completed tasks to check',
187
+ timestamp: new Date().toISOString(),
188
+ };
189
+ }
190
+ const results = [];
191
+ for (const task of completedTasks) {
192
+ results.push(await this.validateTask(task, projectPath));
193
+ }
194
+ const failedTasks = results.filter(r => !r.passed);
195
+ if (failedTasks.length === 0) {
196
+ return {
197
+ passed: true,
198
+ message: 'All completed tasks pass acceptance criteria',
199
+ timestamp: new Date().toISOString(),
200
+ };
201
+ }
202
+ return {
203
+ passed: false,
204
+ message: `${failedTasks.length} completed task(s) fail acceptance criteria`,
205
+ timestamp: new Date().toISOString(),
206
+ details: {
207
+ totalCriteria: results.length,
208
+ checkedCriteria: results.length - failedTasks.length,
209
+ uncheckedCriteria: failedTasks.map(r => r.message),
210
+ missingCriteria: [],
211
+ },
212
+ };
213
+ }
214
+ /**
215
+ * 验证任务
216
+ */
217
+ async validateTask(task, projectPath) {
218
+ const e2eResults = [];
219
+ // 优先使用新格式 acceptance
220
+ if (task.acceptance && task.acceptance.length > 0) {
221
+ for (const criteria of task.acceptance) {
222
+ // 如果有关联的 E2E 测试,运行它
223
+ if (criteria.e2e_test && !criteria.checked) {
224
+ const result = await this.runE2ETest(projectPath, criteria.e2e_test, criteria.test_name);
225
+ e2eResults.push(result);
226
+ if (!result.passed) {
227
+ return {
228
+ passed: false,
229
+ message: `E2E test failed for "${criteria.description}": ${criteria.e2e_test}`,
230
+ timestamp: new Date().toISOString(),
231
+ details: {
232
+ taskId: task.id,
233
+ totalCriteria: task.acceptance.length,
234
+ checkedCriteria: task.acceptance.filter(c => c.checked).length,
235
+ uncheckedCriteria: [criteria.description],
236
+ missingCriteria: [],
237
+ e2eTestResults: e2eResults,
238
+ },
239
+ };
240
+ }
241
+ }
242
+ }
243
+ return {
244
+ passed: true,
245
+ message: `Task ${task.id} passes all acceptance criteria`,
246
+ timestamp: new Date().toISOString(),
247
+ details: {
248
+ taskId: task.id,
249
+ totalCriteria: task.acceptance.length,
250
+ checkedCriteria: task.acceptance.length,
251
+ uncheckedCriteria: [],
252
+ missingCriteria: [],
253
+ e2eTestResults: e2eResults.length > 0 ? e2eResults : undefined,
254
+ },
255
+ };
256
+ }
257
+ // 兼容旧格式 acceptance_criteria
258
+ if (!task.acceptance_criteria || task.acceptance_criteria.length === 0) {
259
+ return {
260
+ passed: true,
261
+ message: `Task ${task.id} has no acceptance criteria`,
262
+ timestamp: new Date().toISOString(),
263
+ };
264
+ }
265
+ const unchecked = [];
266
+ for (const criteria of task.acceptance_criteria) {
267
+ if (criteria.required && !criteria.checked) {
268
+ unchecked.push(criteria.id);
269
+ }
270
+ }
271
+ if (unchecked.length === 0) {
272
+ return {
273
+ passed: true,
274
+ message: `Task ${task.id} passes all acceptance criteria`,
275
+ timestamp: new Date().toISOString(),
276
+ details: {
277
+ taskId: task.id,
278
+ totalCriteria: task.acceptance_criteria.length,
279
+ checkedCriteria: task.acceptance_criteria.filter(c => c.checked).length,
280
+ uncheckedCriteria: [],
281
+ missingCriteria: [],
282
+ },
283
+ };
284
+ }
285
+ return {
286
+ passed: false,
287
+ message: `Task ${task.id} has ${unchecked.length} unchecked acceptance criteria`,
288
+ timestamp: new Date().toISOString(),
289
+ details: {
290
+ taskId: task.id,
291
+ totalCriteria: task.acceptance_criteria.length,
292
+ checkedCriteria: task.acceptance_criteria.filter(c => c.checked).length,
293
+ uncheckedCriteria: unchecked,
294
+ missingCriteria: [],
295
+ },
296
+ };
297
+ }
298
+ /**
299
+ * 运行 E2E 测试
300
+ */
301
+ async runE2ETest(projectPath, testFile, testName) {
302
+ const timeout = this.config.e2eTestTimeout ?? 120000;
303
+ // 构建测试命令
304
+ let command = this.config.e2eTestCommand ?? 'npx playwright test';
305
+ command += ` ${testFile}`;
306
+ if (testName) {
307
+ command += ` -g "${testName}"`;
308
+ }
309
+ try {
310
+ const { stdout, stderr } = await execAsync(command, {
311
+ cwd: projectPath,
312
+ timeout,
313
+ });
314
+ const output = stdout + stderr;
315
+ const passed = this.parseTestOutput(output);
316
+ return {
317
+ criteria: testFile,
318
+ testFile,
319
+ testName,
320
+ passed,
321
+ output: output.substring(0, 2000),
322
+ };
323
+ }
324
+ catch (error) {
325
+ // 超时或执行失败
326
+ return {
327
+ criteria: testFile,
328
+ testFile,
329
+ testName,
330
+ passed: false,
331
+ error: error.message,
332
+ output: error.stdout?.substring(0, 2000) ?? error.message,
333
+ };
334
+ }
335
+ }
336
+ /**
337
+ * 解析测试输出判断是否通过
338
+ */
339
+ parseTestOutput(output) {
340
+ // Playwright 格式
341
+ if (output.includes('passed')) {
342
+ // 检查是否有失败
343
+ const failedMatch = output.match(/(\d+)\s+failed/);
344
+ if (failedMatch && parseInt(failedMatch[1]) > 0) {
345
+ return false;
346
+ }
347
+ return true;
348
+ }
349
+ // Jest 格式
350
+ if (output.includes('Test Suites:')) {
351
+ const match = output.match(/Test Suites:\s+(\d+)\s+failed/);
352
+ if (match && parseInt(match[1]) > 0) {
353
+ return false;
354
+ }
355
+ return output.includes('passed');
356
+ }
357
+ // 通用格式
358
+ return output.includes('PASS') && !output.includes('FAIL');
359
+ }
360
+ }
361
+ exports.SpecAcceptanceGate = SpecAcceptanceGate;
362
+ /**
363
+ * 创建验收标准门禁(便捷函数)
364
+ */
365
+ function createSpecAcceptanceGate(config) {
366
+ return new SpecAcceptanceGate(config);
367
+ }
368
+ //# sourceMappingURL=acceptance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../src/gates/acceptance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 契约门禁
3
+ *
4
+ * 检查 API 契约:
5
+ * - OpenAPI Schema 验证
6
+ * - 破坏性变更检测
7
+ * - 版本兼容性
8
+ */
9
+ import type { GateResult, GateContext, ContractGateConfig } from './types';
10
+ /**
11
+ * 契约门禁
12
+ */
13
+ export declare class ContractGate {
14
+ private config;
15
+ constructor(config?: Partial<ContractGateConfig>);
16
+ /**
17
+ * 检查契约
18
+ */
19
+ check(context: GateContext): Promise<GateResult>;
20
+ /**
21
+ * 验证契约格式
22
+ */
23
+ private validateContract;
24
+ /**
25
+ * 检测破坏性变更
26
+ */
27
+ private detectBreakingChanges;
28
+ /**
29
+ * 提取端点列表
30
+ */
31
+ private extractEndpoints;
32
+ /**
33
+ * 设置契约路径
34
+ */
35
+ setContractPath(path: string): void;
36
+ /**
37
+ * 获取配置
38
+ */
39
+ getConfig(): Required<ContractGateConfig>;
40
+ }
41
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/gates/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAI3E;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IASpD;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAkGtD;;OAEG;YACW,gBAAgB;IA0D9B;;OAEG;YACW,qBAAqB;IAmCnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,kBAAkB,CAAC;CAG1C"}