@dommaker/harness 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +188 -0
  2. package/bin/harness.js +104 -0
  3. package/dist/cli/commands/check.d.ts +25 -0
  4. package/dist/cli/commands/check.d.ts.map +1 -0
  5. package/dist/cli/commands/check.js +166 -0
  6. package/dist/cli/commands/check.js.map +1 -0
  7. package/dist/cli/commands/index.d.ts +9 -0
  8. package/dist/cli/commands/index.d.ts.map +1 -0
  9. package/dist/cli/commands/index.js +20 -0
  10. package/dist/cli/commands/index.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +22 -0
  12. package/dist/cli/commands/init.d.ts.map +1 -0
  13. package/dist/cli/commands/init.js +244 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/passes-gate.d.ts +24 -0
  16. package/dist/cli/commands/passes-gate.d.ts.map +1 -0
  17. package/dist/cli/commands/passes-gate.js +171 -0
  18. package/dist/cli/commands/passes-gate.js.map +1 -0
  19. package/dist/cli/commands/report.d.ts +18 -0
  20. package/dist/cli/commands/report.d.ts.map +1 -0
  21. package/dist/cli/commands/report.js +205 -0
  22. package/dist/cli/commands/report.js.map +1 -0
  23. package/dist/cli/commands/validate.d.ts +22 -0
  24. package/dist/cli/commands/validate.d.ts.map +1 -0
  25. package/dist/cli/commands/validate.js +175 -0
  26. package/dist/cli/commands/validate.js.map +1 -0
  27. package/dist/core/index.d.ts +7 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +23 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/iron-laws/checker.d.ts +61 -0
  32. package/dist/core/iron-laws/checker.d.ts.map +1 -0
  33. package/dist/core/iron-laws/checker.js +175 -0
  34. package/dist/core/iron-laws/checker.js.map +1 -0
  35. package/dist/core/iron-laws/definitions.d.ts +28 -0
  36. package/dist/core/iron-laws/definitions.d.ts.map +1 -0
  37. package/dist/core/iron-laws/definitions.js +180 -0
  38. package/dist/core/iron-laws/definitions.js.map +1 -0
  39. package/dist/core/iron-laws/index.d.ts +6 -0
  40. package/dist/core/iron-laws/index.d.ts.map +1 -0
  41. package/dist/core/iron-laws/index.js +22 -0
  42. package/dist/core/iron-laws/index.js.map +1 -0
  43. package/dist/core/session/clean-state.d.ts +17 -0
  44. package/dist/core/session/clean-state.d.ts.map +1 -0
  45. package/dist/core/session/clean-state.js +190 -0
  46. package/dist/core/session/clean-state.js.map +1 -0
  47. package/dist/core/session/index.d.ts +6 -0
  48. package/dist/core/session/index.d.ts.map +1 -0
  49. package/dist/core/session/index.js +15 -0
  50. package/dist/core/session/index.js.map +1 -0
  51. package/dist/core/session/startup.d.ts +47 -0
  52. package/dist/core/session/startup.d.ts.map +1 -0
  53. package/dist/core/session/startup.js +266 -0
  54. package/dist/core/session/startup.js.map +1 -0
  55. package/dist/core/validators/checkpoint.d.ts +88 -0
  56. package/dist/core/validators/checkpoint.d.ts.map +1 -0
  57. package/dist/core/validators/checkpoint.js +451 -0
  58. package/dist/core/validators/checkpoint.js.map +1 -0
  59. package/dist/core/validators/cso.d.ts +47 -0
  60. package/dist/core/validators/cso.d.ts.map +1 -0
  61. package/dist/core/validators/cso.js +88 -0
  62. package/dist/core/validators/cso.js.map +1 -0
  63. package/dist/core/validators/index.d.ts +9 -0
  64. package/dist/core/validators/index.d.ts.map +1 -0
  65. package/dist/core/validators/index.js +13 -0
  66. package/dist/core/validators/index.js.map +1 -0
  67. package/dist/core/validators/passes-gate.d.ts +76 -0
  68. package/dist/core/validators/passes-gate.d.ts.map +1 -0
  69. package/dist/core/validators/passes-gate.js +418 -0
  70. package/dist/core/validators/passes-gate.js.map +1 -0
  71. package/dist/index.d.ts +18 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +52 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/presets/index.d.ts +14 -0
  76. package/dist/presets/index.d.ts.map +1 -0
  77. package/dist/presets/index.js +25 -0
  78. package/dist/presets/index.js.map +1 -0
  79. package/dist/presets/relaxed.d.ts +8 -0
  80. package/dist/presets/relaxed.d.ts.map +1 -0
  81. package/dist/presets/relaxed.js +24 -0
  82. package/dist/presets/relaxed.js.map +1 -0
  83. package/dist/presets/standard.d.ts +8 -0
  84. package/dist/presets/standard.d.ts.map +1 -0
  85. package/dist/presets/standard.js +51 -0
  86. package/dist/presets/standard.js.map +1 -0
  87. package/dist/presets/strict.d.ts +8 -0
  88. package/dist/presets/strict.d.ts.map +1 -0
  89. package/dist/presets/strict.js +51 -0
  90. package/dist/presets/strict.js.map +1 -0
  91. package/dist/types/checkpoint.d.ts +120 -0
  92. package/dist/types/checkpoint.d.ts.map +1 -0
  93. package/dist/types/checkpoint.js +6 -0
  94. package/dist/types/checkpoint.js.map +1 -0
  95. package/dist/types/cso.d.ts +35 -0
  96. package/dist/types/cso.d.ts.map +1 -0
  97. package/dist/types/cso.js +6 -0
  98. package/dist/types/cso.js.map +1 -0
  99. package/dist/types/index.d.ts +10 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +24 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/types/iron-law.d.ts +113 -0
  104. package/dist/types/iron-law.d.ts.map +1 -0
  105. package/dist/types/iron-law.js +21 -0
  106. package/dist/types/iron-law.js.map +1 -0
  107. package/dist/types/passes-gate.d.ts +72 -0
  108. package/dist/types/passes-gate.d.ts.map +1 -0
  109. package/dist/types/passes-gate.js +6 -0
  110. package/dist/types/passes-gate.js.map +1 -0
  111. package/dist/types/session.d.ts +105 -0
  112. package/dist/types/session.d.ts.map +1 -0
  113. package/dist/types/session.js +6 -0
  114. package/dist/types/session.js.map +1 -0
  115. package/package.json +74 -0
  116. package/templates/nextjs-app/.github/workflows/ci.yml +39 -0
  117. package/templates/node-api/.github/workflows/ci.yml +36 -0
  118. package/templates/node-api/package.json +23 -0
  119. package/templates/node-api/src/index.ts +2 -0
  120. package/templates/node-api/tsconfig.json +19 -0
  121. package/templates/python-api/.github/workflows/ci.yml +39 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * PassesGate - 测试门控
3
+ *
4
+ * 确保 task.passes 字段只能通过测试结果修改
5
+ * 禁止 Agent 自评通过
6
+ */
7
+ import type { PassesGateConfig, PassesGateResult, TaskTestResult, DynamicTask } from '../../types/passes-gate';
8
+ /**
9
+ * PassesGate 类
10
+ */
11
+ export declare class PassesGate {
12
+ private config;
13
+ private testResults;
14
+ constructor(config?: Partial<PassesGateConfig>);
15
+ /**
16
+ * 设置任务通过状态
17
+ * 核心方法:强制测试验证
18
+ */
19
+ setPasses(taskId: string, value: boolean, workDir: string, task?: DynamicTask): Promise<PassesGateResult>;
20
+ /**
21
+ * 运行测试(CLI 使用)
22
+ */
23
+ runTests(): Promise<{
24
+ passed: boolean;
25
+ passedTests: number;
26
+ failedTests: number;
27
+ totalTests: number;
28
+ duration: number;
29
+ failures?: {
30
+ name: string;
31
+ message: string;
32
+ }[];
33
+ message?: string;
34
+ }>;
35
+ /**
36
+ * 运行测试
37
+ */
38
+ private runTest;
39
+ /**
40
+ * 检测测试命令
41
+ */
42
+ private detectTestCommand;
43
+ /**
44
+ * 从输出中提取覆盖率
45
+ */
46
+ private extractCoverage;
47
+ /**
48
+ * 从输出中提取失败信息
49
+ */
50
+ private extractFailures;
51
+ /**
52
+ * 生成测试证据
53
+ */
54
+ private generateEvidence;
55
+ /**
56
+ * 验证证据存在
57
+ */
58
+ private verifyEvidence;
59
+ /**
60
+ * 检测是否修改了测试文件
61
+ */
62
+ checkTestFileChanges(workDir: string): Promise<string[]>;
63
+ /**
64
+ * 获取任务的测试结果
65
+ */
66
+ getTestResult(taskId: string): TaskTestResult | undefined;
67
+ /**
68
+ * 延迟函数
69
+ */
70
+ private delay;
71
+ }
72
+ /**
73
+ * 创建 PassesGate 实例
74
+ */
75
+ export declare function createPassesGate(config?: Partial<PassesGateConfig>): PassesGate;
76
+ //# sourceMappingURL=passes-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passes-gate.d.ts","sourceRoot":"","sources":["../../../src/core/validators/passes-gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACZ,MAAM,yBAAyB,CAAC;AA8BjC;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,WAAW,CAA0C;gBAEjD,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAIlD;;;OAGG;IACG,SAAS,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,gBAAgB,CAAC;IAoF5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAkDF;;OAEG;YACW,OAAO;IA2CrB;;OAEG;YACW,iBAAiB;IA+C/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;YACW,cAAc;IAY5B;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2B9D;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIzD;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAE/E"}
@@ -0,0 +1,418 @@
1
+ "use strict";
2
+ /**
3
+ * PassesGate - 测试门控
4
+ *
5
+ * 确保 task.passes 字段只能通过测试结果修改
6
+ * 禁止 Agent 自评通过
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.PassesGate = void 0;
43
+ exports.createPassesGate = createPassesGate;
44
+ const child_process_1 = require("child_process");
45
+ const util_1 = require("util");
46
+ const fs = __importStar(require("fs/promises"));
47
+ const path = __importStar(require("path"));
48
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
49
+ /**
50
+ * 默认配置
51
+ */
52
+ const DEFAULT_CONFIG = {
53
+ enabled: true,
54
+ testCommand: '',
55
+ requireEvidence: true,
56
+ allowPartialPass: false,
57
+ maxRetries: 2,
58
+ retryDelay: 1000,
59
+ };
60
+ /**
61
+ * 测试文件保护模式
62
+ */
63
+ const PROTECTED_TEST_PATTERNS = [
64
+ '**/*.test.ts',
65
+ '**/*.test.tsx',
66
+ '**/*.test.js',
67
+ '**/*.spec.ts',
68
+ '**/*.spec.tsx',
69
+ '**/*.spec.js',
70
+ '**/tests/**',
71
+ '**/__tests__/**',
72
+ ];
73
+ /**
74
+ * PassesGate 类
75
+ */
76
+ class PassesGate {
77
+ config;
78
+ testResults = new Map();
79
+ constructor(config = {}) {
80
+ this.config = { ...DEFAULT_CONFIG, ...config };
81
+ }
82
+ /**
83
+ * 设置任务通过状态
84
+ * 核心方法:强制测试验证
85
+ */
86
+ async setPasses(taskId, value, workDir, task) {
87
+ if (!this.config.enabled) {
88
+ return {
89
+ taskId,
90
+ allowed: true,
91
+ attempts: 0,
92
+ };
93
+ }
94
+ // 如果设置为 false,直接允许
95
+ if (value === false) {
96
+ return {
97
+ taskId,
98
+ allowed: true,
99
+ testResult: {
100
+ passed: false,
101
+ command: 'manual',
102
+ timestamp: new Date(),
103
+ },
104
+ attempts: 0,
105
+ };
106
+ }
107
+ // 如果设置为 true,必须运行测试
108
+ let attempts = 0;
109
+ let lastError;
110
+ let testResult;
111
+ while (attempts <= this.config.maxRetries) {
112
+ attempts++;
113
+ try {
114
+ testResult = await this.runTest(workDir, task);
115
+ if (testResult.passed) {
116
+ // 记录测试结果
117
+ this.testResults.set(taskId, testResult);
118
+ // 如果要求证据,验证证据存在
119
+ if (this.config.requireEvidence && testResult.evidence) {
120
+ const evidenceExists = await this.verifyEvidence(testResult.evidence, workDir);
121
+ if (!evidenceExists) {
122
+ return {
123
+ taskId,
124
+ allowed: false,
125
+ error: 'Test evidence not found',
126
+ testResult,
127
+ attempts,
128
+ };
129
+ }
130
+ }
131
+ return {
132
+ taskId,
133
+ allowed: true,
134
+ testResult,
135
+ attempts,
136
+ };
137
+ }
138
+ lastError = `Tests failed: ${testResult.failures?.join(', ') || 'Unknown error'}`;
139
+ // 等待后重试
140
+ if (attempts <= this.config.maxRetries) {
141
+ await this.delay(this.config.retryDelay);
142
+ }
143
+ }
144
+ catch (error) {
145
+ lastError = error.message;
146
+ if (attempts <= this.config.maxRetries) {
147
+ await this.delay(this.config.retryDelay);
148
+ }
149
+ }
150
+ }
151
+ return {
152
+ taskId,
153
+ allowed: false,
154
+ error: lastError,
155
+ testResult,
156
+ attempts,
157
+ };
158
+ }
159
+ /**
160
+ * 运行测试(CLI 使用)
161
+ */
162
+ async runTests() {
163
+ const startTime = Date.now();
164
+ const workDir = process.cwd();
165
+ try {
166
+ const testCommand = this.config.testCommand || await this.detectTestCommand(workDir);
167
+ if (!testCommand) {
168
+ return {
169
+ passed: false,
170
+ passedTests: 0,
171
+ failedTests: 0,
172
+ totalTests: 0,
173
+ duration: Date.now() - startTime,
174
+ message: '未检测到测试命令',
175
+ };
176
+ }
177
+ const result = await this.runTest(workDir);
178
+ const duration = Date.now() - startTime;
179
+ // 解析测试数量
180
+ const output = result.output || '';
181
+ const passedMatch = output.match(/(\d+) passed/i);
182
+ const failedMatch = output.match(/(\d+) failed/i);
183
+ const passedTests = passedMatch?.[1] ? parseInt(passedMatch[1], 10) : (result.passed ? 1 : 0);
184
+ const failedTests = failedMatch?.[1] ? parseInt(failedMatch[1], 10) : (result.passed ? 0 : 1);
185
+ return {
186
+ passed: result.passed,
187
+ passedTests,
188
+ failedTests,
189
+ totalTests: passedTests + failedTests,
190
+ duration,
191
+ failures: result.failures?.map(f => ({ name: f, message: f })),
192
+ message: result.passed ? '测试通过' : '测试失败',
193
+ };
194
+ }
195
+ catch (error) {
196
+ return {
197
+ passed: false,
198
+ passedTests: 0,
199
+ failedTests: 1,
200
+ totalTests: 1,
201
+ duration: Date.now() - startTime,
202
+ message: error.message,
203
+ };
204
+ }
205
+ }
206
+ /**
207
+ * 运行测试
208
+ */
209
+ async runTest(workDir, task) {
210
+ const testCommand = await this.detectTestCommand(workDir);
211
+ const timestamp = new Date();
212
+ try {
213
+ const { stdout, stderr } = await execAsync(testCommand, {
214
+ cwd: workDir,
215
+ maxBuffer: 10 * 1024 * 1024, // 10MB buffer
216
+ });
217
+ const passed = true;
218
+ const coverage = this.extractCoverage(stdout);
219
+ const failures = [];
220
+ return {
221
+ passed,
222
+ command: testCommand,
223
+ output: stdout,
224
+ failures,
225
+ coverage,
226
+ timestamp,
227
+ evidence: await this.generateEvidence(workDir, stdout),
228
+ };
229
+ }
230
+ catch (error) {
231
+ const output = error.stdout || '';
232
+ const stderrOutput = error.stderr || '';
233
+ const combinedOutput = output + '\n' + stderrOutput;
234
+ const failures = this.extractFailures(combinedOutput);
235
+ const passed = this.config.allowPartialPass && failures.length === 0;
236
+ return {
237
+ passed,
238
+ command: testCommand,
239
+ output: combinedOutput,
240
+ failures,
241
+ coverage: this.extractCoverage(output),
242
+ timestamp,
243
+ evidence: await this.generateEvidence(workDir, combinedOutput),
244
+ };
245
+ }
246
+ }
247
+ /**
248
+ * 检测测试命令
249
+ */
250
+ async detectTestCommand(workDir) {
251
+ if (this.config.testCommand) {
252
+ return this.config.testCommand;
253
+ }
254
+ // 尝试读取 package.json
255
+ try {
256
+ const packageJsonPath = path.join(workDir, 'package.json');
257
+ const content = await fs.readFile(packageJsonPath, 'utf-8');
258
+ const packageJson = JSON.parse(content);
259
+ // 优先使用 e2e 测试
260
+ if (packageJson.scripts?.['test:e2e']) {
261
+ return 'npm run test:e2e';
262
+ }
263
+ if (packageJson.scripts?.['test:coverage']) {
264
+ return 'npm run test:coverage';
265
+ }
266
+ if (packageJson.scripts?.test) {
267
+ return 'npm test';
268
+ }
269
+ }
270
+ catch {
271
+ // package.json 不存在,尝试其他检测
272
+ }
273
+ // 尝试 Python 项目
274
+ try {
275
+ const pyprojectPath = path.join(workDir, 'pyproject.toml');
276
+ await fs.access(pyprojectPath);
277
+ return 'pytest';
278
+ }
279
+ catch {
280
+ // 不是 Python 项目
281
+ }
282
+ // 尝试 Go 项目
283
+ try {
284
+ const goModPath = path.join(workDir, 'go.mod');
285
+ await fs.access(goModPath);
286
+ return 'go test ./...';
287
+ }
288
+ catch {
289
+ // 不是 Go 项目
290
+ }
291
+ // 默认命令
292
+ return 'npm test';
293
+ }
294
+ /**
295
+ * 从输出中提取覆盖率
296
+ */
297
+ extractCoverage(output) {
298
+ // Jest 格式: All files | 80.5 | 70.2 | ...
299
+ const jestMatch = output.match(/All files[|\s]+(\d+\.?\d*)/);
300
+ if (jestMatch?.[1]) {
301
+ return parseFloat(jestMatch[1]);
302
+ }
303
+ // Istanbul/nyc 格式: Statements : 80.5% ( 100/124 )
304
+ const istanbulMatch = output.match(/Statements\s*:\s*(\d+\.?\d*)%/);
305
+ if (istanbulMatch?.[1]) {
306
+ return parseFloat(istanbulMatch[1]);
307
+ }
308
+ // pytest-cov 格式: TOTAL 1234 80%
309
+ const pytestMatch = output.match(/TOTAL\s+\d+\s+(\d+)%/);
310
+ if (pytestMatch?.[1]) {
311
+ return parseInt(pytestMatch[1], 10);
312
+ }
313
+ return undefined;
314
+ }
315
+ /**
316
+ * 从输出中提取失败信息
317
+ */
318
+ extractFailures(output) {
319
+ const failures = [];
320
+ // Jest 格式
321
+ const jestMatches = output.matchAll(/✕\s+(.+?)\s+\(/g);
322
+ for (const match of jestMatches) {
323
+ if (match[1])
324
+ failures.push(match[1]);
325
+ }
326
+ // Mocha 格式
327
+ const mochaMatches = output.matchAll(/\d+\)\s+(.+?):/g);
328
+ for (const match of mochaMatches) {
329
+ if (match[1])
330
+ failures.push(match[1]);
331
+ }
332
+ // pytest 格式
333
+ const pytestMatches = output.matchAll(/FAILED\s+(.+?)::/g);
334
+ for (const match of pytestMatches) {
335
+ if (match[1])
336
+ failures.push(match[1]);
337
+ }
338
+ // Go test 格式
339
+ const goMatches = output.matchAll(/--- FAIL:\s+(.+?)\s+\(/g);
340
+ for (const match of goMatches) {
341
+ if (match[1])
342
+ failures.push(match[1]);
343
+ }
344
+ return failures;
345
+ }
346
+ /**
347
+ * 生成测试证据
348
+ */
349
+ async generateEvidence(workDir, output) {
350
+ const evidenceDir = path.join(workDir, '.agent', 'evidence');
351
+ await fs.mkdir(evidenceDir, { recursive: true });
352
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
353
+ const evidenceFile = path.join(evidenceDir, `test-${timestamp}.log`);
354
+ await fs.writeFile(evidenceFile, output);
355
+ return evidenceFile;
356
+ }
357
+ /**
358
+ * 验证证据存在
359
+ */
360
+ async verifyEvidence(evidencePath, workDir) {
361
+ try {
362
+ const fullPath = path.isAbsolute(evidencePath)
363
+ ? evidencePath
364
+ : path.join(workDir, evidencePath);
365
+ await fs.access(fullPath);
366
+ return true;
367
+ }
368
+ catch {
369
+ return false;
370
+ }
371
+ }
372
+ /**
373
+ * 检测是否修改了测试文件
374
+ */
375
+ async checkTestFileChanges(workDir) {
376
+ const changedTestFiles = [];
377
+ try {
378
+ const { stdout } = await execAsync('git diff --name-only', { cwd: workDir });
379
+ const changedFiles = stdout.split('\n').filter(Boolean);
380
+ // 简单的模式匹配
381
+ for (const file of changedFiles) {
382
+ const isTestFile = PROTECTED_TEST_PATTERNS.some(() => {
383
+ return file.includes('.test.') ||
384
+ file.includes('.spec.') ||
385
+ file.includes('/tests/') ||
386
+ file.includes('/__tests__/');
387
+ });
388
+ if (isTestFile) {
389
+ changedTestFiles.push(file);
390
+ }
391
+ }
392
+ }
393
+ catch {
394
+ // Git 不可用,跳过检查
395
+ }
396
+ return changedTestFiles;
397
+ }
398
+ /**
399
+ * 获取任务的测试结果
400
+ */
401
+ getTestResult(taskId) {
402
+ return this.testResults.get(taskId);
403
+ }
404
+ /**
405
+ * 延迟函数
406
+ */
407
+ delay(ms) {
408
+ return new Promise(resolve => setTimeout(resolve, ms));
409
+ }
410
+ }
411
+ exports.PassesGate = PassesGate;
412
+ /**
413
+ * 创建 PassesGate 实例
414
+ */
415
+ function createPassesGate(config) {
416
+ return new PassesGate(config);
417
+ }
418
+ //# sourceMappingURL=passes-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passes-gate.js","sourceRoot":"","sources":["../../../src/core/validators/passes-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @dommaker/harness - 主入口
3
+ *
4
+ * 通用工程约束框架
5
+ */
6
+ export * from './types';
7
+ export * from './core';
8
+ export * from './presets';
9
+ import type { IronLawContext, IronLawResult } from './types/iron-law';
10
+ /**
11
+ * 检查铁律
12
+ */
13
+ export declare function checkIronLaws(context: IronLawContext): Promise<IronLawResult[]>;
14
+ /**
15
+ * 执行前检查铁律
16
+ */
17
+ export declare function checkBeforeExecution(context: IronLawContext): Promise<void>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,cAAc,SAAS,CAAC;AAKxB,cAAc,QAAQ,CAAC;AAKvB,cAAc,WAAW,CAAC;AAO1B,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtE;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,EAAE,CAAC,CAE1B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAEf"}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * @dommaker/harness - 主入口
4
+ *
5
+ * 通用工程约束框架
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.checkIronLaws = checkIronLaws;
23
+ exports.checkBeforeExecution = checkBeforeExecution;
24
+ // ========================================
25
+ // 类型导出
26
+ // ========================================
27
+ __exportStar(require("./types"), exports);
28
+ // ========================================
29
+ // 核心功能导出
30
+ // ========================================
31
+ __exportStar(require("./core"), exports);
32
+ // ========================================
33
+ // 预设导出
34
+ // ========================================
35
+ __exportStar(require("./presets"), exports);
36
+ // ========================================
37
+ // 便捷 API
38
+ // ========================================
39
+ const checker_1 = require("./core/iron-laws/checker");
40
+ /**
41
+ * 检查铁律
42
+ */
43
+ async function checkIronLaws(context) {
44
+ return checker_1.IronLawChecker.getInstance().checkAll(context);
45
+ }
46
+ /**
47
+ * 执行前检查铁律
48
+ */
49
+ async function checkBeforeExecution(context) {
50
+ return checker_1.IronLawChecker.getInstance().beforeExecution(context);
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;AA2BH,sCAIC;AAKD,oDAIC;AAtCD,2CAA2C;AAC3C,OAAO;AACP,2CAA2C;AAC3C,0CAAwB;AAExB,2CAA2C;AAC3C,SAAS;AACT,2CAA2C;AAC3C,yCAAuB;AAEvB,2CAA2C;AAC3C,OAAO;AACP,2CAA2C;AAC3C,4CAA0B;AAE1B,2CAA2C;AAC3C,SAAS;AACT,2CAA2C;AAE3C,sDAA0D;AAG1D;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,OAAuB;IAEvB,OAAO,wBAAc,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAuB;IAEvB,OAAO,wBAAc,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 预设导出
3
+ */
4
+ import { STRICT_PRESET } from './strict';
5
+ import { STANDARD_PRESET } from './standard';
6
+ import { RELAXED_PRESET } from './relaxed';
7
+ import type { IronLawConfig } from '../types/iron-law';
8
+ export declare const PRESETS: Record<string, IronLawConfig>;
9
+ export { STRICT_PRESET, STANDARD_PRESET, RELAXED_PRESET };
10
+ /**
11
+ * 获取预设配置
12
+ */
13
+ export declare function getPreset(name: string): IronLawConfig;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAIjD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAE1D;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAErD"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * 预设导出
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RELAXED_PRESET = exports.STANDARD_PRESET = exports.STRICT_PRESET = exports.PRESETS = void 0;
7
+ exports.getPreset = getPreset;
8
+ const strict_1 = require("./strict");
9
+ Object.defineProperty(exports, "STRICT_PRESET", { enumerable: true, get: function () { return strict_1.STRICT_PRESET; } });
10
+ const standard_1 = require("./standard");
11
+ Object.defineProperty(exports, "STANDARD_PRESET", { enumerable: true, get: function () { return standard_1.STANDARD_PRESET; } });
12
+ const relaxed_1 = require("./relaxed");
13
+ Object.defineProperty(exports, "RELAXED_PRESET", { enumerable: true, get: function () { return relaxed_1.RELAXED_PRESET; } });
14
+ exports.PRESETS = {
15
+ strict: strict_1.STRICT_PRESET,
16
+ standard: standard_1.STANDARD_PRESET,
17
+ relaxed: relaxed_1.RELAXED_PRESET,
18
+ };
19
+ /**
20
+ * 获取预设配置
21
+ */
22
+ function getPreset(name) {
23
+ return exports.PRESETS[name] || standard_1.STANDARD_PRESET;
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAkBH,8BAEC;AAlBD,qCAAyC;AAWhC,8FAXA,sBAAa,OAWA;AAVtB,yCAA6C;AAUrB,gGAVf,0BAAe,OAUe;AATvC,uCAA2C;AASF,+FAThC,wBAAc,OASgC;AAN1C,QAAA,OAAO,GAAkC;IACpD,MAAM,EAAE,sBAAa;IACrB,QAAQ,EAAE,0BAAe;IACzB,OAAO,EAAE,wBAAc;CACxB,CAAC;AAIF;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAY;IACpC,OAAO,eAAO,CAAC,IAAI,CAAC,IAAI,0BAAe,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 宽松预设
3
+ *
4
+ * 只保留最核心的铁律,warning 可跳过
5
+ */
6
+ import type { IronLawConfig } from '../types/iron-law';
7
+ export declare const RELAXED_PRESET: IronLawConfig;
8
+ //# sourceMappingURL=relaxed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relaxed.d.ts","sourceRoot":"","sources":["../../src/presets/relaxed.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhE,eAAO,MAAM,cAAc,EAAE,aAc5B,CAAC"}