@dommaker/harness 1.5.0 → 1.7.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.
- package/CHANGELOG.md +26 -0
- package/README.md +0 -2
- package/dist/cli/commands/definitions.d.ts.map +1 -1
- package/dist/cli/commands/definitions.js +1 -32
- package/dist/cli/commands/definitions.js.map +1 -1
- package/dist/cli/commands/passes-gate.d.ts +0 -2
- package/dist/cli/commands/passes-gate.d.ts.map +1 -1
- package/dist/cli/commands/passes-gate.js +0 -1
- package/dist/cli/commands/passes-gate.js.map +1 -1
- package/dist/cli/commands/performance.d.ts +0 -4
- package/dist/cli/commands/performance.d.ts.map +1 -1
- package/dist/cli/commands/performance.js +10 -20
- package/dist/cli/commands/performance.js.map +1 -1
- package/dist/cli/commands/report.d.ts +1 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +2 -55
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +4 -8
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/context/index.d.ts +2 -5
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +2 -8
- package/dist/context/index.js.map +1 -1
- package/dist/context/token-budget.d.ts +0 -29
- package/dist/context/token-budget.d.ts.map +1 -1
- package/dist/context/token-budget.js +1 -65
- package/dist/context/token-budget.js.map +1 -1
- package/dist/context/types.d.ts +0 -1
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/types.js +0 -9
- package/dist/context/types.js.map +1 -1
- package/dist/core/constraints/checker.d.ts +14 -0
- package/dist/core/constraints/checker.d.ts.map +1 -1
- package/dist/core/constraints/checker.js +22 -2
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/git-evidence.d.ts +6 -3
- package/dist/core/constraints/git-evidence.d.ts.map +1 -1
- package/dist/core/constraints/git-evidence.js +6 -3
- package/dist/core/constraints/git-evidence.js.map +1 -1
- package/dist/core/index.d.ts +1 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -9
- package/dist/core/index.js.map +1 -1
- package/dist/core/spec/validator.d.ts +2 -0
- package/dist/core/spec/validator.d.ts.map +1 -1
- package/dist/core/spec/validator.js +9 -11
- package/dist/core/spec/validator.js.map +1 -1
- package/dist/core/validators/index.d.ts +1 -1
- package/dist/core/validators/index.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.d.ts +1 -15
- package/dist/core/validators/passes-gate.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.js +2 -127
- package/dist/core/validators/passes-gate.js.map +1 -1
- package/dist/failure/index.d.ts +0 -1
- package/dist/failure/index.d.ts.map +1 -1
- package/dist/failure/index.js +1 -7
- package/dist/failure/index.js.map +1 -1
- package/dist/gates/definitions.d.ts.map +1 -1
- package/dist/gates/definitions.js +0 -4
- package/dist/gates/definitions.js.map +1 -1
- package/dist/gates/performance.d.ts +7 -22
- package/dist/gates/performance.d.ts.map +1 -1
- package/dist/gates/performance.js +7 -89
- package/dist/gates/performance.js.map +1 -1
- package/dist/gates/types.d.ts +2 -8
- package/dist/gates/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -22
- package/dist/index.js.map +1 -1
- package/dist/knowledge/index.d.ts +0 -1
- package/dist/knowledge/index.d.ts.map +1 -1
- package/dist/knowledge/index.js +1 -3
- package/dist/knowledge/index.js.map +1 -1
- package/dist/monitoring/trace-analyzer.d.ts +25 -10
- package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
- package/dist/monitoring/trace-analyzer.js +147 -116
- package/dist/monitoring/trace-analyzer.js.map +1 -1
- package/dist/types/passes-gate.d.ts +0 -32
- package/dist/types/passes-gate.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/passes-gate-check.test.ts +20 -4
- package/src/__tests__/passes-gate.test.ts +5 -99
- package/src/__tests__/performance-gate.test.ts +3 -11
- package/src/__tests__/public-exports.test.ts +68 -16
- package/src/__tests__/public-type-surface.test.ts +359 -0
- package/src/__tests__/trace-analyzer.test.ts +52 -2
- package/src/cli/commands/CONTEXT.md +3 -2
- package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +158 -0
- package/src/cli/commands/__tests__/passes-gate.test.ts +7 -3
- package/src/cli/commands/__tests__/performance.test.ts +5 -16
- package/src/cli/commands/__tests__/registry.test.ts +46 -3
- package/src/cli/commands/__tests__/report-extra.test.ts +0 -19
- package/src/cli/commands/__tests__/report-false-green.test.ts +46 -0
- package/src/cli/commands/__tests__/report.test.ts +0 -20
- package/src/cli/commands/__tests__/status-analysis-wiring.test.ts +68 -0
- package/src/cli/commands/__tests__/status-extra.test.ts +63 -116
- package/src/cli/commands/__tests__/status.test.ts +66 -148
- package/src/cli/commands/definitions.ts +1 -32
- package/src/cli/commands/passes-gate.ts +0 -3
- package/src/cli/commands/performance.ts +13 -27
- package/src/cli/commands/report.ts +3 -61
- package/src/cli/commands/status.ts +5 -10
- package/src/context/CONTEXT.md +2 -3
- package/src/context/__tests__/token-budget.test.ts +1 -81
- package/src/context/index.ts +2 -7
- package/src/context/token-budget.ts +0 -73
- package/src/context/types.ts +0 -9
- package/src/core/CONTEXT.md +5 -6
- package/src/core/constraints/__tests__/collect-constraints.test.ts +66 -0
- package/src/core/constraints/checker.ts +33 -2
- package/src/core/constraints/git-evidence.ts +6 -3
- package/src/core/index.ts +0 -12
- package/src/core/spec/__tests__/validator.test.ts +24 -0
- package/src/core/spec/validator.ts +9 -10
- package/src/core/validators/__tests__/passes-gate.test.ts +2 -9
- package/src/core/validators/index.ts +0 -2
- package/src/core/validators/passes-gate.ts +3 -152
- package/src/failure/CONTEXT.md +8 -6
- package/src/failure/index.ts +0 -10
- package/src/gates/CONTEXT.md +3 -2
- package/src/gates/__tests__/performance.test.ts +6 -74
- package/src/gates/definitions.ts +0 -4
- package/src/gates/performance.ts +9 -111
- package/src/gates/types.ts +2 -8
- package/src/index.ts +1 -37
- package/src/knowledge/CONTEXT.md +1 -2
- package/src/knowledge/index.ts +0 -1
- package/src/monitoring/CONTEXT.md +2 -2
- package/src/monitoring/trace-analyzer.ts +160 -126
- package/src/types/passes-gate.ts +0 -43
- package/src/utils/__tests__/jsonl-skip-disposition.test.ts +0 -1
- package/dist/cli/commands/analyze-sessions.d.ts +0 -20
- package/dist/cli/commands/analyze-sessions.d.ts.map +0 -1
- package/dist/cli/commands/analyze-sessions.js +0 -290
- package/dist/cli/commands/analyze-sessions.js.map +0 -1
- package/dist/cli/commands/update-user-model.d.ts +0 -30
- package/dist/cli/commands/update-user-model.d.ts.map +0 -1
- package/dist/cli/commands/update-user-model.js +0 -406
- package/dist/cli/commands/update-user-model.js.map +0 -1
- package/dist/cli/session-mining/corrections.d.ts +0 -17
- package/dist/cli/session-mining/corrections.d.ts.map +0 -1
- package/dist/cli/session-mining/corrections.js +0 -58
- package/dist/cli/session-mining/corrections.js.map +0 -1
- package/dist/cli/session-mining/index.d.ts +0 -13
- package/dist/cli/session-mining/index.d.ts.map +0 -1
- package/dist/cli/session-mining/index.js +0 -29
- package/dist/cli/session-mining/index.js.map +0 -1
- package/dist/cli/session-mining/text.d.ts +0 -31
- package/dist/cli/session-mining/text.d.ts.map +0 -1
- package/dist/cli/session-mining/text.js +0 -126
- package/dist/cli/session-mining/text.js.map +0 -1
- package/dist/cli/session-mining/transcript.d.ts +0 -34
- package/dist/cli/session-mining/transcript.d.ts.map +0 -1
- package/dist/cli/session-mining/transcript.js +0 -130
- package/dist/cli/session-mining/transcript.js.map +0 -1
- package/dist/context/compaction.d.ts +0 -57
- package/dist/context/compaction.d.ts.map +0 -1
- package/dist/context/compaction.js +0 -165
- package/dist/context/compaction.js.map +0 -1
- package/dist/core/session/clean-state.d.ts +0 -17
- package/dist/core/session/clean-state.d.ts.map +0 -1
- package/dist/core/session/clean-state.js +0 -192
- package/dist/core/session/clean-state.js.map +0 -1
- package/dist/core/session/index.d.ts +0 -6
- package/dist/core/session/index.d.ts.map +0 -1
- package/dist/core/session/index.js +0 -15
- package/dist/core/session/index.js.map +0 -1
- package/dist/core/session/startup.d.ts +0 -47
- package/dist/core/session/startup.d.ts.map +0 -1
- package/dist/core/session/startup.js +0 -263
- package/dist/core/session/startup.js.map +0 -1
- package/dist/failure/constraint-handler.d.ts +0 -83
- package/dist/failure/constraint-handler.d.ts.map +0 -1
- package/dist/failure/constraint-handler.js +0 -138
- package/dist/failure/constraint-handler.js.map +0 -1
- package/dist/knowledge/lifecycle-hooks.d.ts +0 -62
- package/dist/knowledge/lifecycle-hooks.d.ts.map +0 -1
- package/dist/knowledge/lifecycle-hooks.js +0 -143
- package/dist/knowledge/lifecycle-hooks.js.map +0 -1
- package/dist/types/session.d.ts +0 -113
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js +0 -6
- package/dist/types/session.js.map +0 -1
- package/src/__tests__/clean-state-extra.test.ts +0 -301
- package/src/__tests__/clean-state.test.ts +0 -169
- package/src/__tests__/constraint-handler.test.ts +0 -132
- package/src/__tests__/passes-gate-extra.test.ts +0 -93
- package/src/__tests__/session-startup.test.ts +0 -334
- package/src/cli/commands/__tests__/analyze-sessions.test.ts +0 -184
- package/src/cli/commands/__tests__/update-user-model.test.ts +0 -268
- package/src/cli/commands/analyze-sessions.ts +0 -335
- package/src/cli/commands/update-user-model.ts +0 -476
- package/src/cli/session-mining/__tests__/transcript.test.ts +0 -118
- package/src/cli/session-mining/corrections.ts +0 -56
- package/src/cli/session-mining/index.ts +0 -13
- package/src/cli/session-mining/text.ts +0 -117
- package/src/cli/session-mining/transcript.ts +0 -125
- package/src/context/__tests__/compaction.test.ts +0 -169
- package/src/context/compaction.ts +0 -201
- package/src/core/session/__tests__/startup.test.ts +0 -281
- package/src/core/session/clean-state.ts +0 -178
- package/src/core/session/index.ts +0 -15
- package/src/core/session/startup.ts +0 -253
- package/src/failure/constraint-handler.ts +0 -171
- package/src/knowledge/__tests__/lifecycle-hooks.test.ts +0 -140
- package/src/knowledge/lifecycle-hooks.ts +0 -202
- package/src/types/session.ts +0 -132
|
@@ -20,10 +20,6 @@ export interface PassesGateConfig {
|
|
|
20
20
|
* 不赦免非零退出码(判定依据收在 core/validators/test-output.ts 的 judgeTestRun,ADR-0014)
|
|
21
21
|
*/
|
|
22
22
|
allowPartialPass?: boolean;
|
|
23
|
-
/** 最大重试次数 */
|
|
24
|
-
maxRetries?: number;
|
|
25
|
-
/** 重试延迟(毫秒) */
|
|
26
|
-
retryDelay?: number;
|
|
27
23
|
}
|
|
28
24
|
/**
|
|
29
25
|
* 测试结果
|
|
@@ -46,34 +42,6 @@ export interface TaskTestResult {
|
|
|
46
42
|
/** 证据路径 */
|
|
47
43
|
evidence?: string;
|
|
48
44
|
}
|
|
49
|
-
/**
|
|
50
|
-
* 测试门控结果
|
|
51
|
-
*/
|
|
52
|
-
export interface PassesGateResult {
|
|
53
|
-
/** 任务 ID */
|
|
54
|
-
taskId: string;
|
|
55
|
-
/** 是否允许设置 */
|
|
56
|
-
allowed: boolean;
|
|
57
|
-
/** 测试结果 */
|
|
58
|
-
testResult?: TaskTestResult;
|
|
59
|
-
/** 尝试次数 */
|
|
60
|
-
attempts: number;
|
|
61
|
-
/** 错误信息 */
|
|
62
|
-
error?: string;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 动态任务(用于 passes-gate)
|
|
66
|
-
*/
|
|
67
|
-
export interface DynamicTask {
|
|
68
|
-
/** 任务 ID */
|
|
69
|
-
id: string;
|
|
70
|
-
/** 任务名称 */
|
|
71
|
-
name?: string;
|
|
72
|
-
/** 是否通过 */
|
|
73
|
-
passes?: boolean;
|
|
74
|
-
/** 测试结果 */
|
|
75
|
-
testResult?: TaskTestResult;
|
|
76
|
-
}
|
|
77
45
|
/**
|
|
78
46
|
* 测试结果输入(用于 check() 方法)
|
|
79
47
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passes-gate.d.ts","sourceRoot":"","sources":["../../src/types/passes-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"passes-gate.d.ts","sourceRoot":"","sources":["../../src/types/passes-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,MAAM,EAAE,OAAO,CAAC;IAEhB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAEhB,SAAS;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,SAAS;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,UAAU;IACV,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,cAAc;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,WAAW;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,MAAM,EAAE,OAAO,CAAC;IAEhB,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IAEX,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW;IACX,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,eAAe;IACf,OAAO,EAAE,OAAO,CAAC;IAEjB,oBAAoB;IACpB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAEnC,aAAa;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB"}
|
package/package.json
CHANGED
|
@@ -95,12 +95,28 @@ describe('PassesGate.check()', () => {
|
|
|
95
95
|
});
|
|
96
96
|
|
|
97
97
|
/**
|
|
98
|
-
* AC-007
|
|
98
|
+
* AC-007(ADR-0022 改写):零消费者方法已从公共面删除
|
|
99
|
+
*
|
|
100
|
+
* 原用例断言「保留 setPasses() 向后兼容」——兼容对象经 harness+studio 双仓
|
|
101
|
+
* 核实不存在,ADR-0022 明确推翻该 AC。`@ts-expect-error` 在编译期钉住删除,
|
|
102
|
+
* 运行期断言同时钉住形状(方法不存在于原型)。
|
|
99
103
|
*/
|
|
100
|
-
it('AC-007:
|
|
104
|
+
it('AC-007: setPasses()/getTestResult()/checkTestFileChanges() are removed from the public surface', () => {
|
|
101
105
|
const gate = new PassesGate();
|
|
102
|
-
|
|
103
|
-
expect
|
|
106
|
+
|
|
107
|
+
// @ts-expect-error setPasses 已随 ADR-0022 删除
|
|
108
|
+
expect(gate.setPasses).toBeUndefined();
|
|
109
|
+
// @ts-expect-error getTestResult 已随 ADR-0022 删除
|
|
110
|
+
expect(gate.getTestResult).toBeUndefined();
|
|
111
|
+
// @ts-expect-error checkTestFileChanges 已随 ADR-0022 删除
|
|
112
|
+
expect(gate.checkTestFileChanges).toBeUndefined();
|
|
113
|
+
expect(PassesGate.prototype).not.toHaveProperty('setPasses');
|
|
114
|
+
expect(PassesGate.prototype).not.toHaveProperty('getTestResult');
|
|
115
|
+
expect(PassesGate.prototype).not.toHaveProperty('checkTestFileChanges');
|
|
116
|
+
|
|
117
|
+
// 保留面:真实消费的方法不动
|
|
118
|
+
expect(typeof gate.check).toBe('function');
|
|
119
|
+
expect(typeof gate.runTests).toBe('function');
|
|
104
120
|
});
|
|
105
121
|
|
|
106
122
|
/**
|
|
@@ -33,34 +33,6 @@ describe('PassesGate', () => {
|
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
describe('setPasses', () => {
|
|
37
|
-
it('设置为 false 应该直接允许', async () => {
|
|
38
|
-
const result = await gate.setPasses('task-1', false, tempDir);
|
|
39
|
-
|
|
40
|
-
expect(result.allowed).toBe(true);
|
|
41
|
-
expect(result.testResult?.passed).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('设置为 true 应该运行测试', async () => {
|
|
45
|
-
const result = await gate.setPasses('task-2', true, tempDir, {
|
|
46
|
-
id: 'task-2',
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// 测试命令是 echo "1 passed",所以应该通过
|
|
50
|
-
expect(result.allowed).toBe(true);
|
|
51
|
-
expect(result.testResult?.command).toContain('npm test');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('禁用时应该允许所有设置', async () => {
|
|
55
|
-
const disabledGate = createPassesGate({ enabled: false });
|
|
56
|
-
|
|
57
|
-
const result = await disabledGate.setPasses('task-3', true, tempDir);
|
|
58
|
-
|
|
59
|
-
expect(result.allowed).toBe(true);
|
|
60
|
-
expect(result.attempts).toBe(0);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
36
|
describe('runTests', () => {
|
|
65
37
|
// 执行根由调用方传入(#95):tempDir 的 package.json 测试命令是 echo,不再跑真实套件
|
|
66
38
|
it('应该返回测试结果', async () => {
|
|
@@ -72,15 +44,6 @@ describe('PassesGate', () => {
|
|
|
72
44
|
});
|
|
73
45
|
});
|
|
74
46
|
|
|
75
|
-
describe('detectTestCommand', () => {
|
|
76
|
-
it('应该检测 npm test', async () => {
|
|
77
|
-
// package.json 有 test script
|
|
78
|
-
const result = await gate.setPasses('task-4', true, tempDir);
|
|
79
|
-
|
|
80
|
-
expect(result.testResult?.command).toContain('npm');
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
47
|
// 探测正本行为钉住(架构评审 A2:CLI/core 双版收口后的统一语义,
|
|
85
48
|
// 此前 e2e 优先级、echo 排除、兜底均无测试钉住)
|
|
86
49
|
describe('detectTestCommand 正本(统一探测顺序)', () => {
|
|
@@ -153,70 +116,13 @@ describe('PassesGate', () => {
|
|
|
153
116
|
expect(await detectTestCommand(emptyDir)).toBeUndefined();
|
|
154
117
|
});
|
|
155
118
|
|
|
156
|
-
it('探测失败时 runTests
|
|
119
|
+
it('探测失败时 runTests fail-closed', async () => {
|
|
157
120
|
const emptyDir = join(detectDir, 'fail-closed');
|
|
158
121
|
mkdirSync(emptyDir, { recursive: true });
|
|
159
122
|
|
|
160
123
|
const runResult = await gate.runTests(emptyDir);
|
|
161
124
|
expect(runResult.passed).toBe(false);
|
|
162
125
|
expect(runResult.message).toBe('未检测到测试命令');
|
|
163
|
-
|
|
164
|
-
const setResult = await gate.setPasses('task-nocmd', true, emptyDir);
|
|
165
|
-
expect(setResult.allowed).toBe(false);
|
|
166
|
-
expect(setResult.testResult?.passed).toBe(false);
|
|
167
|
-
expect(setResult.testResult?.output).toBe('未检测到测试命令');
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
describe('checkTestFileChanges', () => {
|
|
172
|
-
it('应该检测测试文件变更', async () => {
|
|
173
|
-
// 无 git 变更时返回空数组
|
|
174
|
-
const changes = await gate.checkTestFileChanges(tempDir);
|
|
175
|
-
|
|
176
|
-
expect(Array.isArray(changes)).toBe(true);
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
describe('getTestResult', () => {
|
|
181
|
-
it('应该返回已存储的测试结果', async () => {
|
|
182
|
-
const result = await gate.setPasses('stored-task', true, tempDir);
|
|
183
|
-
|
|
184
|
-
if (result.allowed && result.testResult) {
|
|
185
|
-
const stored = gate.getTestResult('stored-task');
|
|
186
|
-
expect(stored).toBeDefined();
|
|
187
|
-
expect(stored?.command).toContain('npm');
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('未存储任务应返回 undefined', () => {
|
|
192
|
-
const stored = gate.getTestResult('nonexistent-task');
|
|
193
|
-
expect(stored).toBeUndefined();
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
describe('测试失败重试', () => {
|
|
198
|
-
it('测试失败后应重试', async () => {
|
|
199
|
-
const retryDir = join(process.cwd(), 'temp-test-retry');
|
|
200
|
-
mkdirSync(retryDir, { recursive: true });
|
|
201
|
-
|
|
202
|
-
writeFileSync(join(retryDir, 'package.json'), JSON.stringify({
|
|
203
|
-
name: 'retry-project',
|
|
204
|
-
scripts: { test: 'exit 1' }, // 总是失败
|
|
205
|
-
}));
|
|
206
|
-
|
|
207
|
-
const retryGate = createPassesGate({
|
|
208
|
-
enabled: true,
|
|
209
|
-
maxRetries: 1,
|
|
210
|
-
retryDelay: 100,
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
const result = await retryGate.setPasses('retry-task', true, retryDir);
|
|
214
|
-
|
|
215
|
-
expect(result.allowed).toBe(false);
|
|
216
|
-
expect(result.attempts).toBeGreaterThan(1);
|
|
217
|
-
expect(result.error).toBeDefined();
|
|
218
|
-
|
|
219
|
-
rmSync(retryDir, { recursive: true, force: true });
|
|
220
126
|
});
|
|
221
127
|
});
|
|
222
128
|
|
|
@@ -237,13 +143,13 @@ describe('PassesGate', () => {
|
|
|
237
143
|
},
|
|
238
144
|
});
|
|
239
145
|
|
|
240
|
-
it('
|
|
146
|
+
it('runTests 结果不带 coverage 字段', async () => {
|
|
241
147
|
const covGate = createPassesGate({ enabled: true, requireEvidence: false });
|
|
242
148
|
|
|
243
|
-
const result = await covGate.
|
|
149
|
+
const result = await covGate.runTests(covDir);
|
|
244
150
|
|
|
245
|
-
expect(result.
|
|
246
|
-
expect(result
|
|
151
|
+
expect(result.passed).toBe(true);
|
|
152
|
+
expect(result).not.toHaveProperty('coverage');
|
|
247
153
|
});
|
|
248
154
|
|
|
249
155
|
it('TaskTestResult 公开类型面不再接受 coverage 字段', () => {
|
|
@@ -38,7 +38,7 @@ describe('PerformanceGate', () => {
|
|
|
38
38
|
const gate = new PerformanceGate({
|
|
39
39
|
enabled: true,
|
|
40
40
|
thresholds: {
|
|
41
|
-
|
|
41
|
+
maxBundleSize: 1000,
|
|
42
42
|
},
|
|
43
43
|
});
|
|
44
44
|
|
|
@@ -55,20 +55,12 @@ describe('PerformanceGate', () => {
|
|
|
55
55
|
it('应该支持自定义阈值', () => {
|
|
56
56
|
const gate = new PerformanceGate({
|
|
57
57
|
thresholds: {
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
minCoverage: 80,
|
|
59
|
+
maxBundleSize: 1000,
|
|
60
60
|
},
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
expect(gate).toBeDefined();
|
|
64
64
|
});
|
|
65
|
-
|
|
66
|
-
it('应该支持基准测试命令', () => {
|
|
67
|
-
const gate = new PerformanceGate({
|
|
68
|
-
benchmarkCommand: 'npm run benchmark',
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
expect(gate).toBeDefined();
|
|
72
|
-
});
|
|
73
65
|
});
|
|
74
66
|
});
|
|
@@ -5,29 +5,32 @@
|
|
|
5
5
|
* 改动 src/index.ts 导出清单时同步更新本文件的 EXPECTED_RUNTIME_EXPORTS,
|
|
6
6
|
* diff 即 PR 评审材料。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* 类型面共三道闸,本文件占前两道:① 运行时(值)导出由 Object.keys 逐字冻结;② 下方「包根
|
|
9
|
+
* 类型面」闸钉的是**删完之后**——编译期 `@ts-expect-error` 钉已删类型 + 源形状钉整条 barrel 链
|
|
10
|
+
* (`PassesGateResult` 曾从 #125「关联类型导出随迁」漏删且无测试可捕获,review A2 据此补钉)。
|
|
11
|
+
* 第 ③ 道是类型面**全量清单**冻结,在 `public-type-surface.test.ts`(ADR-0022 追记 4);它刻意
|
|
12
|
+
* 不 import 包根,因为本文件的编译期钉在类型面被改动时会让整套 suite「failed to run」(实测注入
|
|
13
|
+
* 一条 `export type { DynamicTask }` 得 0 tests),拿不到可执行的清单 diff——定级阶段那句
|
|
14
|
+
* 「这个符号在不在包根导出面」由第 ③ 道回答,不由人的 grep 记忆回答。
|
|
10
15
|
*/
|
|
11
16
|
|
|
17
|
+
import * as fs from 'fs';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
|
|
12
20
|
const EXPECTED_RUNTIME_EXPORTS = [
|
|
13
|
-
'AdaptiveTokenBudget',
|
|
14
21
|
'AgentLifecycle',
|
|
15
22
|
'CONSTRAINTS_END_MARKER',
|
|
16
23
|
'CONSTRAINTS_START_MARKER',
|
|
17
24
|
'CSOValidator',
|
|
18
25
|
'CheckCache',
|
|
19
26
|
'CheckpointValidator',
|
|
20
|
-
'CleanStateManager',
|
|
21
27
|
'ColdStartImporter',
|
|
22
28
|
'CommandGate',
|
|
23
29
|
'ConstraintViolationError',
|
|
24
|
-
'ConstraintViolationHandler',
|
|
25
30
|
'ContextTracker',
|
|
26
31
|
'ContractGate',
|
|
27
32
|
'DEFAULT_CLASSIFICATION_RULES',
|
|
28
|
-
'DEFAULT_CODE_CHECKPOINTS',
|
|
29
33
|
'DEFAULT_COMMAND_BLACKLIST',
|
|
30
|
-
'DEFAULT_COMPACTION_CONFIG',
|
|
31
34
|
'DEFAULT_DECAY_CONFIG',
|
|
32
35
|
'DEFAULT_FAILURE_LOG_FILE',
|
|
33
36
|
'DEFAULT_LEVEL_MAPPING',
|
|
@@ -49,10 +52,8 @@ const EXPECTED_RUNTIME_EXPORTS = [
|
|
|
49
52
|
'KnowledgeIngest',
|
|
50
53
|
'KnowledgeInjector',
|
|
51
54
|
'KnowledgeLifecycle',
|
|
52
|
-
'KnowledgeLifecycleHooks',
|
|
53
55
|
'KnowledgeLinter',
|
|
54
56
|
'KnowledgeQuery',
|
|
55
|
-
'MINIMAL_CHECKPOINTS',
|
|
56
57
|
'PHASE_SUBJECT_RE',
|
|
57
58
|
'PROMPTS',
|
|
58
59
|
'PassesGate',
|
|
@@ -60,9 +61,7 @@ const EXPECTED_RUNTIME_EXPORTS = [
|
|
|
60
61
|
'ReferenceTracker',
|
|
61
62
|
'ReviewGate',
|
|
62
63
|
'SecurityGate',
|
|
63
|
-
'SessionCompaction',
|
|
64
64
|
'SessionManager',
|
|
65
|
-
'SessionStartup',
|
|
66
65
|
'SpecAcceptanceGate',
|
|
67
66
|
'SpecValidator',
|
|
68
67
|
'TESTED_BY_RE',
|
|
@@ -83,7 +82,6 @@ const EXPECTED_RUNTIME_EXPORTS = [
|
|
|
83
82
|
'configureTraceCollector',
|
|
84
83
|
'createAnalyzer',
|
|
85
84
|
'createCheckerGate',
|
|
86
|
-
'createCleanStateManager',
|
|
87
85
|
'createCommandGate',
|
|
88
86
|
'createContractGate',
|
|
89
87
|
'createErrorClassifier',
|
|
@@ -92,12 +90,8 @@ const EXPECTED_RUNTIME_EXPORTS = [
|
|
|
92
90
|
'createPerformanceGate',
|
|
93
91
|
'createReviewGate',
|
|
94
92
|
'createSecurityGate',
|
|
95
|
-
'createSessionStartup',
|
|
96
93
|
'createSpecAcceptanceGate',
|
|
97
94
|
'decisionFromResult',
|
|
98
|
-
'executeWithBlock',
|
|
99
|
-
'executeWithCollect',
|
|
100
|
-
'executeWithSafeBoolean',
|
|
101
95
|
'extractCodeStructure',
|
|
102
96
|
'findConstraintsByTrigger',
|
|
103
97
|
'getAllConstraints',
|
|
@@ -139,3 +133,61 @@ describe('公共导出清单(ADR-0003)', () => {
|
|
|
139
133
|
expect(Object.keys(mod).sort()).toEqual([...EXPECTED_RUNTIME_EXPORTS].sort());
|
|
140
134
|
});
|
|
141
135
|
});
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 包根类型面闸(review A2)
|
|
139
|
+
*
|
|
140
|
+
* 上一闸的 `Object.keys(mod)` 只看得到运行时(值)导出,类型面历史上无对等闸——
|
|
141
|
+
* `PassesGateResult`(已删 `setPasses` 的返回形状)正是这样从 #125 的「关联类型导出随迁」
|
|
142
|
+
* 里漏掉、经四级 barrel 存活为公开类型。手法同 #125 的 AC-007:编译期 `@ts-expect-error`
|
|
143
|
+
* 钉住删除 + 源形状钉住整条链,活类型正钉防删多。
|
|
144
|
+
*
|
|
145
|
+
* `DynamicTask` 是同案的第二个漏收项(二次复审 B1):它是 `setPasses(taskId, workDir, task?)`
|
|
146
|
+
* 的入参形状,#125 删掉 setPasses 后只剩私有 `runTest` 那个从不读取的 `_task` 形参在供养它,
|
|
147
|
+
* 而包根同名导出取自 `./types/passes-gate`(见 5959b79),所以它是**公开的**死类型。
|
|
148
|
+
*/
|
|
149
|
+
describe('包根类型面(ADR-0022 关联类型随迁)', () => {
|
|
150
|
+
const BARREL_CHAIN = [
|
|
151
|
+
'../types/passes-gate.ts',
|
|
152
|
+
'../core/validators/index.ts',
|
|
153
|
+
'../core/index.ts',
|
|
154
|
+
'../index.ts',
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
function expectAbsentAcrossBarrelChain(typeName: string): void {
|
|
158
|
+
for (const rel of BARREL_CHAIN) {
|
|
159
|
+
const source = fs.readFileSync(path.join(__dirname, rel), 'utf-8');
|
|
160
|
+
expect({ file: rel, mentions: source.includes(typeName) }).toEqual({
|
|
161
|
+
file: rel,
|
|
162
|
+
mentions: false,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
it('PassesGateResult 在整条 barrel 链四级都已消失', () => {
|
|
168
|
+
expectAbsentAcrossBarrelChain('PassesGateResult');
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('DynamicTask 在整条 barrel 链四级都已消失', () => {
|
|
172
|
+
expectAbsentAcrossBarrelChain('DynamicTask');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('PassesGateResult 不再是包根可导入类型(编译期钉)', () => {
|
|
176
|
+
// @ts-expect-error 该类型是已删 setPasses 的返回形状,随 ADR-0022 关联类型口径删除
|
|
177
|
+
const removedType: import('../index').PassesGateResult | undefined = undefined;
|
|
178
|
+
expect(removedType).toBeUndefined();
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('DynamicTask 不再是包根可导入类型(编译期钉)', () => {
|
|
182
|
+
// @ts-expect-error 该类型是已删 setPasses 的 task 入参形状,消费者净删后随 A2 同案收口
|
|
183
|
+
const removedType: import('../index').DynamicTask | undefined = undefined;
|
|
184
|
+
expect(removedType).toBeUndefined();
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('活类型仍可经包根导入(防止删多)', () => {
|
|
188
|
+
const liveCheck: import('../index').PassesGateCheckResult = { allowed: true };
|
|
189
|
+
const liveTask: import('../index').TaskTestResult = { passed: true, command: 'npm test' };
|
|
190
|
+
expect(liveCheck.allowed).toBe(true);
|
|
191
|
+
expect(liveTask.command).toBe('npm test');
|
|
192
|
+
});
|
|
193
|
+
});
|