@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.
- package/README.md +188 -0
- package/bin/harness.js +104 -0
- package/dist/cli/commands/check.d.ts +25 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +166 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/index.d.ts +9 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +20 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +22 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +244 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/passes-gate.d.ts +24 -0
- package/dist/cli/commands/passes-gate.d.ts.map +1 -0
- package/dist/cli/commands/passes-gate.js +171 -0
- package/dist/cli/commands/passes-gate.js.map +1 -0
- package/dist/cli/commands/report.d.ts +18 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +205 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +22 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +175 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +23 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/iron-laws/checker.d.ts +61 -0
- package/dist/core/iron-laws/checker.d.ts.map +1 -0
- package/dist/core/iron-laws/checker.js +175 -0
- package/dist/core/iron-laws/checker.js.map +1 -0
- package/dist/core/iron-laws/definitions.d.ts +28 -0
- package/dist/core/iron-laws/definitions.d.ts.map +1 -0
- package/dist/core/iron-laws/definitions.js +180 -0
- package/dist/core/iron-laws/definitions.js.map +1 -0
- package/dist/core/iron-laws/index.d.ts +6 -0
- package/dist/core/iron-laws/index.d.ts.map +1 -0
- package/dist/core/iron-laws/index.js +22 -0
- package/dist/core/iron-laws/index.js.map +1 -0
- package/dist/core/session/clean-state.d.ts +17 -0
- package/dist/core/session/clean-state.d.ts.map +1 -0
- package/dist/core/session/clean-state.js +190 -0
- package/dist/core/session/clean-state.js.map +1 -0
- package/dist/core/session/index.d.ts +6 -0
- package/dist/core/session/index.d.ts.map +1 -0
- package/dist/core/session/index.js +15 -0
- package/dist/core/session/index.js.map +1 -0
- package/dist/core/session/startup.d.ts +47 -0
- package/dist/core/session/startup.d.ts.map +1 -0
- package/dist/core/session/startup.js +266 -0
- package/dist/core/session/startup.js.map +1 -0
- package/dist/core/validators/checkpoint.d.ts +88 -0
- package/dist/core/validators/checkpoint.d.ts.map +1 -0
- package/dist/core/validators/checkpoint.js +451 -0
- package/dist/core/validators/checkpoint.js.map +1 -0
- package/dist/core/validators/cso.d.ts +47 -0
- package/dist/core/validators/cso.d.ts.map +1 -0
- package/dist/core/validators/cso.js +88 -0
- package/dist/core/validators/cso.js.map +1 -0
- package/dist/core/validators/index.d.ts +9 -0
- package/dist/core/validators/index.d.ts.map +1 -0
- package/dist/core/validators/index.js +13 -0
- package/dist/core/validators/index.js.map +1 -0
- package/dist/core/validators/passes-gate.d.ts +76 -0
- package/dist/core/validators/passes-gate.d.ts.map +1 -0
- package/dist/core/validators/passes-gate.js +418 -0
- package/dist/core/validators/passes-gate.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/index.d.ts +14 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +25 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/relaxed.d.ts +8 -0
- package/dist/presets/relaxed.d.ts.map +1 -0
- package/dist/presets/relaxed.js +24 -0
- package/dist/presets/relaxed.js.map +1 -0
- package/dist/presets/standard.d.ts +8 -0
- package/dist/presets/standard.d.ts.map +1 -0
- package/dist/presets/standard.js +51 -0
- package/dist/presets/standard.js.map +1 -0
- package/dist/presets/strict.d.ts +8 -0
- package/dist/presets/strict.d.ts.map +1 -0
- package/dist/presets/strict.js +51 -0
- package/dist/presets/strict.js.map +1 -0
- package/dist/types/checkpoint.d.ts +120 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +6 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types/cso.d.ts +35 -0
- package/dist/types/cso.d.ts.map +1 -0
- package/dist/types/cso.js +6 -0
- package/dist/types/cso.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/iron-law.d.ts +113 -0
- package/dist/types/iron-law.d.ts.map +1 -0
- package/dist/types/iron-law.js +21 -0
- package/dist/types/iron-law.js.map +1 -0
- package/dist/types/passes-gate.d.ts +72 -0
- package/dist/types/passes-gate.d.ts.map +1 -0
- package/dist/types/passes-gate.js +6 -0
- package/dist/types/passes-gate.js.map +1 -0
- package/dist/types/session.d.ts +105 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +6 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +74 -0
- package/templates/nextjs-app/.github/workflows/ci.yml +39 -0
- package/templates/node-api/.github/workflows/ci.yml +36 -0
- package/templates/node-api/package.json +23 -0
- package/templates/node-api/src/index.ts +2 -0
- package/templates/node-api/tsconfig.json +19 -0
- package/templates/python-api/.github/workflows/ci.yml +39 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 铁律检查引擎
|
|
4
|
+
*
|
|
5
|
+
* 在执行关键操作前,强制检查铁律是否满足
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ironLawChecker = exports.IronLawChecker = void 0;
|
|
9
|
+
exports.checkIronLaw = checkIronLaw;
|
|
10
|
+
exports.checkBeforeExecution = checkBeforeExecution;
|
|
11
|
+
exports.checkAllIronLaws = checkAllIronLaws;
|
|
12
|
+
const definitions_1 = require("./definitions");
|
|
13
|
+
/**
|
|
14
|
+
* 铁律检查器
|
|
15
|
+
*/
|
|
16
|
+
class IronLawChecker {
|
|
17
|
+
static instance;
|
|
18
|
+
constructor() { }
|
|
19
|
+
/**
|
|
20
|
+
* 获取单例实例
|
|
21
|
+
*/
|
|
22
|
+
static getInstance() {
|
|
23
|
+
if (!IronLawChecker.instance) {
|
|
24
|
+
IronLawChecker.instance = new IronLawChecker();
|
|
25
|
+
}
|
|
26
|
+
return IronLawChecker.instance;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 检查单个铁律
|
|
30
|
+
*/
|
|
31
|
+
async check(lawId, context) {
|
|
32
|
+
const law = definitions_1.IRON_LAWS[lawId];
|
|
33
|
+
if (!law) {
|
|
34
|
+
return {
|
|
35
|
+
satisfied: false,
|
|
36
|
+
message: `未知的铁律: ${lawId}`,
|
|
37
|
+
checkedAt: new Date(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// 检查是否满足铁律前置条件
|
|
41
|
+
const satisfied = await this.checkPrecondition(law, context);
|
|
42
|
+
if (!satisfied) {
|
|
43
|
+
return {
|
|
44
|
+
satisfied: false,
|
|
45
|
+
law,
|
|
46
|
+
message: law.message,
|
|
47
|
+
requiredAction: law.enforcement,
|
|
48
|
+
checkedAt: new Date(),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
satisfied: true,
|
|
53
|
+
law,
|
|
54
|
+
checkedAt: new Date(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 检查铁律前置条件
|
|
59
|
+
*/
|
|
60
|
+
async checkPrecondition(law, context) {
|
|
61
|
+
switch (law.id) {
|
|
62
|
+
case 'no_fix_without_root_cause':
|
|
63
|
+
// 检查是否有根本原因调查
|
|
64
|
+
return context.hasRootCauseInvestigation === true;
|
|
65
|
+
case 'no_completion_without_verification':
|
|
66
|
+
// 检查是否有验证证据
|
|
67
|
+
return context.hasVerificationEvidence === true;
|
|
68
|
+
case 'no_skill_without_test':
|
|
69
|
+
// 检查是否有压力场景测试
|
|
70
|
+
return context.hasTest === true;
|
|
71
|
+
case 'no_code_without_test':
|
|
72
|
+
// 检查是否有失败的测试
|
|
73
|
+
return context.hasFailingTest === true;
|
|
74
|
+
case 'no_creation_without_reuse_check':
|
|
75
|
+
// 检查是否已进行复用检查
|
|
76
|
+
return context.hasReuseCheck === true;
|
|
77
|
+
case 'no_self_approval':
|
|
78
|
+
// 检查是否有测试证据
|
|
79
|
+
return context.hasTest === true;
|
|
80
|
+
case 'test_coverage_required':
|
|
81
|
+
// TODO: 检查测试覆盖率
|
|
82
|
+
return true;
|
|
83
|
+
case 'capability_sync':
|
|
84
|
+
// TODO: 检查 CAPABILITIES.md 是否更新
|
|
85
|
+
return true;
|
|
86
|
+
case 'no_any_type':
|
|
87
|
+
// TODO: 检查代码中是否有 any 类型
|
|
88
|
+
return true;
|
|
89
|
+
case 'no_bypass_checkpoint':
|
|
90
|
+
// TODO: 检查是否跳过了检查点
|
|
91
|
+
return true;
|
|
92
|
+
case 'doc_required_for_public_api':
|
|
93
|
+
// TODO: 检查公共 API 是否有文档
|
|
94
|
+
return true;
|
|
95
|
+
case 'readme_required':
|
|
96
|
+
// TODO: 检查是否有 README
|
|
97
|
+
return true;
|
|
98
|
+
default:
|
|
99
|
+
// 未知铁律,默认通过
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 查找适用于当前操作的铁律
|
|
105
|
+
*/
|
|
106
|
+
findApplicableLaws(context) {
|
|
107
|
+
const applicableLaws = [];
|
|
108
|
+
for (const [lawId, law] of Object.entries(definitions_1.IRON_LAWS)) {
|
|
109
|
+
if (law.trigger === context.operation) {
|
|
110
|
+
applicableLaws.push(lawId);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return applicableLaws;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 在执行前自动检查所有适用的铁律
|
|
117
|
+
*
|
|
118
|
+
* @throws IronLawViolationError 如果有 error 级别的铁律违规
|
|
119
|
+
*/
|
|
120
|
+
async beforeExecution(context) {
|
|
121
|
+
const applicableLaws = this.findApplicableLaws(context);
|
|
122
|
+
for (const lawId of applicableLaws) {
|
|
123
|
+
const result = await this.check(lawId, context);
|
|
124
|
+
if (!result.satisfied && result.law?.severity === 'error') {
|
|
125
|
+
throw new definitions_1.IronLawViolationError(result);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 检查并返回所有铁律状态(用于 UI 显示)
|
|
131
|
+
*/
|
|
132
|
+
async checkAll(context) {
|
|
133
|
+
const applicableLaws = this.findApplicableLaws(context);
|
|
134
|
+
const results = [];
|
|
135
|
+
for (const lawId of applicableLaws) {
|
|
136
|
+
const result = await this.check(lawId, context);
|
|
137
|
+
results.push(result);
|
|
138
|
+
}
|
|
139
|
+
return results;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 获取所有铁律定义
|
|
143
|
+
*/
|
|
144
|
+
getAllLaws() {
|
|
145
|
+
return Object.values(definitions_1.IRON_LAWS);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 获取单个铁律定义
|
|
149
|
+
*/
|
|
150
|
+
getLaw(lawId) {
|
|
151
|
+
return definitions_1.IRON_LAWS[lawId] || null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.IronLawChecker = IronLawChecker;
|
|
155
|
+
/**
|
|
156
|
+
* 快捷函数:检查铁律
|
|
157
|
+
*/
|
|
158
|
+
async function checkIronLaw(lawId, context) {
|
|
159
|
+
return IronLawChecker.getInstance().check(lawId, context);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 快捷函数:执行前检查
|
|
163
|
+
*/
|
|
164
|
+
async function checkBeforeExecution(context) {
|
|
165
|
+
return IronLawChecker.getInstance().beforeExecution(context);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 快捷函数:检查所有铁律
|
|
169
|
+
*/
|
|
170
|
+
async function checkAllIronLaws(context) {
|
|
171
|
+
return IronLawChecker.getInstance().checkAll(context);
|
|
172
|
+
}
|
|
173
|
+
// 导出单例
|
|
174
|
+
exports.ironLawChecker = IronLawChecker.getInstance();
|
|
175
|
+
//# sourceMappingURL=checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../../../src/core/iron-laws/checker.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA0LH,oCAKC;AAKD,oDAEC;AAKD,4CAEC;AArMD,+CAAoF;AAEpF;;GAEG;AACH,MAAa,cAAc;IACjB,MAAM,CAAC,QAAQ,CAAiB;IAExC,gBAAuB,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,OAAuB;QAChD,MAAM,GAAG,GAAG,uBAAS,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,UAAU,KAAK,EAAE;gBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,eAAe;QACf,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,GAAG;gBACH,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,cAAc,EAAE,GAAG,CAAC,WAAW;gBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,SAAS,EAAE,IAAI;YACf,GAAG;YACH,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,GAAY,EAAE,OAAuB;QACnE,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;YACf,KAAK,2BAA2B;gBAC9B,cAAc;gBACd,OAAO,OAAO,CAAC,yBAAyB,KAAK,IAAI,CAAC;YAEpD,KAAK,oCAAoC;gBACvC,YAAY;gBACZ,OAAO,OAAO,CAAC,uBAAuB,KAAK,IAAI,CAAC;YAElD,KAAK,uBAAuB;gBAC1B,cAAc;gBACd,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;YAElC,KAAK,sBAAsB;gBACzB,aAAa;gBACb,OAAO,OAAO,CAAC,cAAc,KAAK,IAAI,CAAC;YAEzC,KAAK,iCAAiC;gBACpC,cAAc;gBACd,OAAO,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC;YAExC,KAAK,kBAAkB;gBACrB,YAAY;gBACZ,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;YAElC,KAAK,wBAAwB;gBAC3B,gBAAgB;gBAChB,OAAO,IAAI,CAAC;YAEd,KAAK,iBAAiB;gBACpB,gCAAgC;gBAChC,OAAO,IAAI,CAAC;YAEd,KAAK,aAAa;gBAChB,wBAAwB;gBACxB,OAAO,IAAI,CAAC;YAEd,KAAK,sBAAsB;gBACzB,mBAAmB;gBACnB,OAAO,IAAI,CAAC;YAEd,KAAK,6BAA6B;gBAChC,uBAAuB;gBACvB,OAAO,IAAI,CAAC;YAEd,KAAK,iBAAiB;gBACpB,qBAAqB;gBACrB,OAAO,IAAI,CAAC;YAEd;gBACE,YAAY;gBACZ,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAuB;QACxC,MAAM,cAAc,GAAa,EAAE,CAAC;QAEpC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAS,CAAC,EAAE,CAAC;YACrD,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,OAAuB;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAExD,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC1D,MAAM,IAAI,mCAAqB,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAuB;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,MAAM,CAAC,MAAM,CAAC,uBAAS,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa;QAClB,OAAO,uBAAS,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAClC,CAAC;CACF;AAxKD,wCAwKC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAChC,KAAa,EACb,OAAuB;IAEvB,OAAO,cAAc,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB,CAAC,OAAuB;IAChE,OAAO,cAAc,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAAC,OAAuB;IAC5D,OAAO,cAAc,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,OAAO;AACM,QAAA,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 铁律定义
|
|
3
|
+
*
|
|
4
|
+
* 所有内置的铁律规则
|
|
5
|
+
*/
|
|
6
|
+
import type { IronLaw, IronLawTrigger } from '../../types/iron-law';
|
|
7
|
+
export { IronLawViolationError } from '../../types/iron-law';
|
|
8
|
+
/**
|
|
9
|
+
* 所有铁律定义
|
|
10
|
+
*/
|
|
11
|
+
export declare const IRON_LAWS: Record<string, IronLaw>;
|
|
12
|
+
/**
|
|
13
|
+
* 根据触发条件查找适用的铁律
|
|
14
|
+
*/
|
|
15
|
+
export declare function findLawsByTrigger(trigger: IronLawTrigger): IronLaw[];
|
|
16
|
+
/**
|
|
17
|
+
* 获取所有铁律
|
|
18
|
+
*/
|
|
19
|
+
export declare function getAllLaws(): IronLaw[];
|
|
20
|
+
/**
|
|
21
|
+
* 获取单个铁律
|
|
22
|
+
*/
|
|
23
|
+
export declare function getLaw(id: string): IronLaw | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* 根据严重性过滤铁律
|
|
26
|
+
*/
|
|
27
|
+
export declare function filterLawsBySeverity(severity: 'error' | 'warning' | 'info'): IronLaw[];
|
|
28
|
+
//# sourceMappingURL=definitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../../src/core/iron-laws/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAuD,MAAM,sBAAsB,CAAC;AAGzH,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CA0J7C,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,EAAE,CAEpE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,EAAE,CAEtC;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEtD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,EAAE,CAEtF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 铁律定义
|
|
4
|
+
*
|
|
5
|
+
* 所有内置的铁律规则
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.IRON_LAWS = exports.IronLawViolationError = void 0;
|
|
9
|
+
exports.findLawsByTrigger = findLawsByTrigger;
|
|
10
|
+
exports.getAllLaws = getAllLaws;
|
|
11
|
+
exports.getLaw = getLaw;
|
|
12
|
+
exports.filterLawsBySeverity = filterLawsBySeverity;
|
|
13
|
+
// 导出 IronLawViolationError 类
|
|
14
|
+
var iron_law_1 = require("../../types/iron-law");
|
|
15
|
+
Object.defineProperty(exports, "IronLawViolationError", { enumerable: true, get: function () { return iron_law_1.IronLawViolationError; } });
|
|
16
|
+
/**
|
|
17
|
+
* 所有铁律定义
|
|
18
|
+
*/
|
|
19
|
+
exports.IRON_LAWS = {
|
|
20
|
+
// ========================================
|
|
21
|
+
// 开发铁律(约束 AI 行为)
|
|
22
|
+
// ========================================
|
|
23
|
+
no_simplification_without_approval: {
|
|
24
|
+
id: 'no_simplification_without_approval',
|
|
25
|
+
rule: 'NO SIMPLIFYING LOGIC WITHOUT USER APPROVAL',
|
|
26
|
+
message: '不能为了快速完成任务而自行简化逻辑',
|
|
27
|
+
trigger: 'code_implementation',
|
|
28
|
+
enforcement: 'preserve-complexity',
|
|
29
|
+
severity: 'error',
|
|
30
|
+
description: '在实现或修改代码时,遇到复杂度问题应该向用户说明并请求指示,而不是自行简化逻辑导致功能缺失',
|
|
31
|
+
},
|
|
32
|
+
// ========================================
|
|
33
|
+
// 核心铁律(来自 Superpowers 框架)
|
|
34
|
+
// ========================================
|
|
35
|
+
no_fix_without_root_cause: {
|
|
36
|
+
id: 'no_fix_without_root_cause',
|
|
37
|
+
rule: 'NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST',
|
|
38
|
+
message: '在修复问题之前,必须先进行根本原因调查',
|
|
39
|
+
trigger: 'bug_fix_attempt',
|
|
40
|
+
enforcement: 'debug-systematic',
|
|
41
|
+
severity: 'error',
|
|
42
|
+
description: '在尝试修复 bug 或错误之前,必须先进行系统性的根本原因调查',
|
|
43
|
+
},
|
|
44
|
+
no_completion_without_verification: {
|
|
45
|
+
id: 'no_completion_without_verification',
|
|
46
|
+
rule: 'NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE',
|
|
47
|
+
message: '在声明任务完成之前,必须运行验证命令',
|
|
48
|
+
trigger: 'task_completion_claim',
|
|
49
|
+
enforcement: 'verify-completion',
|
|
50
|
+
severity: 'error',
|
|
51
|
+
description: '在声明任何任务完成之前,必须运行新鲜的、完整的验证命令',
|
|
52
|
+
},
|
|
53
|
+
no_skill_without_test: {
|
|
54
|
+
id: 'no_skill_without_test',
|
|
55
|
+
rule: 'NO SKILL WITHOUT A FAILING TEST FIRST',
|
|
56
|
+
message: '在创建新技能之前,必须先创建压力场景测试',
|
|
57
|
+
trigger: 'skill_creation',
|
|
58
|
+
enforcement: 'skill-test-scenario',
|
|
59
|
+
severity: 'warning',
|
|
60
|
+
description: '在创建新的 agent 技能之前,必须先定义压力场景测试',
|
|
61
|
+
},
|
|
62
|
+
no_code_without_test: {
|
|
63
|
+
id: 'no_code_without_test',
|
|
64
|
+
rule: 'NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST',
|
|
65
|
+
message: '在编写实现代码之前,必须先写失败的测试',
|
|
66
|
+
trigger: 'code_implementation',
|
|
67
|
+
enforcement: 'tdd-cycle',
|
|
68
|
+
severity: 'error',
|
|
69
|
+
description: '在编写生产代码之前,必须先编写失败的测试',
|
|
70
|
+
},
|
|
71
|
+
no_creation_without_reuse_check: {
|
|
72
|
+
id: 'no_creation_without_reuse_check',
|
|
73
|
+
rule: 'NO NEW CAPABILITIES WITHOUT REUSE CHECK FIRST',
|
|
74
|
+
message: '在创建新能力之前,必须先检查是否有可复用的现有能力',
|
|
75
|
+
trigger: 'step_creation',
|
|
76
|
+
enforcement: 'reuse-first',
|
|
77
|
+
severity: 'warning',
|
|
78
|
+
description: '在创建新的 step/tool/workflow 之前,必须先执行复用检查,避免重复造轮子',
|
|
79
|
+
},
|
|
80
|
+
// ========================================
|
|
81
|
+
// 功能清单铁律
|
|
82
|
+
// ========================================
|
|
83
|
+
capability_sync: {
|
|
84
|
+
id: 'capability_sync',
|
|
85
|
+
rule: 'CODE CHANGES MUST UPDATE CAPABILITIES.MD',
|
|
86
|
+
message: '核心模块变更后必须同步更新功能清单 (CAPABILITIES.md)',
|
|
87
|
+
trigger: 'module_modification',
|
|
88
|
+
enforcement: 'update-capabilities',
|
|
89
|
+
severity: 'warning',
|
|
90
|
+
description: '在创建、修改或删除核心模块时,必须同步更新 CAPABILITIES.md,确保功能清单与代码一致',
|
|
91
|
+
},
|
|
92
|
+
// ========================================
|
|
93
|
+
// 代码质量铁律
|
|
94
|
+
// ========================================
|
|
95
|
+
no_any_type: {
|
|
96
|
+
id: 'no_any_type',
|
|
97
|
+
rule: 'NO ANY TYPE IN TYPESCRIPT CODE',
|
|
98
|
+
message: '禁止在 TypeScript 代码中使用 any 类型',
|
|
99
|
+
trigger: 'code_implementation',
|
|
100
|
+
enforcement: 'type-safe',
|
|
101
|
+
severity: 'warning',
|
|
102
|
+
description: 'TypeScript 代码中应避免使用 any 类型,使用 unknown 或具体类型代替',
|
|
103
|
+
},
|
|
104
|
+
no_bypass_checkpoint: {
|
|
105
|
+
id: 'no_bypass_checkpoint',
|
|
106
|
+
rule: 'NO BYPASSING CHECKPOINTS',
|
|
107
|
+
message: '禁止跳过检查点验证',
|
|
108
|
+
trigger: 'step_execution',
|
|
109
|
+
enforcement: 'checkpoint-required',
|
|
110
|
+
severity: 'error',
|
|
111
|
+
description: '所有检查点必须通过,不能跳过验证步骤',
|
|
112
|
+
},
|
|
113
|
+
// ========================================
|
|
114
|
+
// 测试铁律
|
|
115
|
+
// ========================================
|
|
116
|
+
test_coverage_required: {
|
|
117
|
+
id: 'test_coverage_required',
|
|
118
|
+
rule: 'TEST COVERAGE MUST MEET REQUIREMENTS',
|
|
119
|
+
message: '测试覆盖率必须达到要求',
|
|
120
|
+
trigger: 'task_completion_claim',
|
|
121
|
+
enforcement: 'check-coverage',
|
|
122
|
+
severity: 'warning',
|
|
123
|
+
description: '在提交代码前,测试覆盖率必须达到项目要求(默认 80%)',
|
|
124
|
+
},
|
|
125
|
+
no_self_approval: {
|
|
126
|
+
id: 'no_self_approval',
|
|
127
|
+
rule: 'NO SELF APPROVAL WITHOUT TEST EVIDENCE',
|
|
128
|
+
message: '禁止自评通过,必须提供测试证据',
|
|
129
|
+
trigger: 'task_completion_claim',
|
|
130
|
+
enforcement: 'passes-gate',
|
|
131
|
+
severity: 'error',
|
|
132
|
+
description: '任务完成声明必须基于真实测试结果,不能由开发者自评',
|
|
133
|
+
},
|
|
134
|
+
// ========================================
|
|
135
|
+
// 文档铁律
|
|
136
|
+
// ========================================
|
|
137
|
+
doc_required_for_public_api: {
|
|
138
|
+
id: 'doc_required_for_public_api',
|
|
139
|
+
rule: 'PUBLIC API MUST HAVE DOCUMENTATION',
|
|
140
|
+
message: '公共 API 必须有文档注释',
|
|
141
|
+
trigger: 'export_change',
|
|
142
|
+
enforcement: 'add-docs',
|
|
143
|
+
severity: 'warning',
|
|
144
|
+
description: '所有导出的函数、类、接口必须有 JSDoc 注释说明用途和参数',
|
|
145
|
+
},
|
|
146
|
+
readme_required: {
|
|
147
|
+
id: 'readme_required',
|
|
148
|
+
rule: 'NEW MODULES MUST HAVE README',
|
|
149
|
+
message: '新模块必须创建 README 文档',
|
|
150
|
+
trigger: 'module_creation',
|
|
151
|
+
enforcement: 'create-readme',
|
|
152
|
+
severity: 'info',
|
|
153
|
+
description: '创建新模块时应同时创建 README.md 说明模块用途和使用方法',
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* 根据触发条件查找适用的铁律
|
|
158
|
+
*/
|
|
159
|
+
function findLawsByTrigger(trigger) {
|
|
160
|
+
return Object.values(exports.IRON_LAWS).filter(law => law.trigger === trigger);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 获取所有铁律
|
|
164
|
+
*/
|
|
165
|
+
function getAllLaws() {
|
|
166
|
+
return Object.values(exports.IRON_LAWS);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 获取单个铁律
|
|
170
|
+
*/
|
|
171
|
+
function getLaw(id) {
|
|
172
|
+
return exports.IRON_LAWS[id];
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 根据严重性过滤铁律
|
|
176
|
+
*/
|
|
177
|
+
function filterLawsBySeverity(severity) {
|
|
178
|
+
return Object.values(exports.IRON_LAWS).filter(law => law.severity === severity);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/core/iron-laws/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/iron-laws/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 铁律系统导出
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./definitions"), exports);
|
|
21
|
+
__exportStar(require("./checker"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/iron-laws/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,gDAA8B;AAC9B,4CAA0B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CleanStateManager - Session 结束状态管理
|
|
3
|
+
*
|
|
4
|
+
* 确保 Agent 结束时必须"打扫干净",不留烂代码。
|
|
5
|
+
*/
|
|
6
|
+
import type { CleanStateConfig, CleanStateResult, SessionInfo } from '../../types/session';
|
|
7
|
+
export declare class CleanStateManager {
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config?: Partial<CleanStateConfig>);
|
|
10
|
+
onSessionEnd(workDir: string, sessionInfo: SessionInfo): Promise<CleanStateResult>;
|
|
11
|
+
private hasUncommittedChanges;
|
|
12
|
+
private autoCommit;
|
|
13
|
+
private detectBugs;
|
|
14
|
+
private updateProgress;
|
|
15
|
+
}
|
|
16
|
+
export declare const createCleanStateManager: (config?: Partial<CleanStateConfig>) => CleanStateManager;
|
|
17
|
+
//# sourceMappingURL=clean-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean-state.d.ts","sourceRoot":"","sources":["../../../src/core/session/clean-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAmB7B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA6B;gBAE/B,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAI5C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAqC1E,qBAAqB;YASrB,UAAU;YAmBV,UAAU;YAmCV,cAAc;CA8B7B;AAED,eAAO,MAAM,uBAAuB,GAAI,SAAS,OAAO,CAAC,gBAAgB,CAAC,sBAC3C,CAAC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CleanStateManager - Session 结束状态管理
|
|
4
|
+
*
|
|
5
|
+
* 确保 Agent 结束时必须"打扫干净",不留烂代码。
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.createCleanStateManager = exports.CleanStateManager = void 0;
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const util_1 = require("util");
|
|
44
|
+
const fs = __importStar(require("fs/promises"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const yaml = __importStar(require("js-yaml"));
|
|
47
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
48
|
+
const DEFAULT_CONFIG = {
|
|
49
|
+
enabled: true,
|
|
50
|
+
autoCommit: true,
|
|
51
|
+
detectBugs: true,
|
|
52
|
+
updateProgress: true,
|
|
53
|
+
commitMessageTemplate: '[{taskId}] {description} - {status}',
|
|
54
|
+
};
|
|
55
|
+
const BUG_PATTERNS = [
|
|
56
|
+
{ pattern: /console\.(error|warn)\(/, severity: 'low', type: 'logic' },
|
|
57
|
+
{ pattern: /FIXME|HACK/i, severity: 'medium', type: 'logic' },
|
|
58
|
+
{ pattern: /eval\s*\(/, severity: 'high', type: 'security' },
|
|
59
|
+
{ pattern: /dangerouslySetInnerHTML/, severity: 'medium', type: 'security' },
|
|
60
|
+
];
|
|
61
|
+
class CleanStateManager {
|
|
62
|
+
config;
|
|
63
|
+
constructor(config = {}) {
|
|
64
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
65
|
+
}
|
|
66
|
+
async onSessionEnd(workDir, sessionInfo) {
|
|
67
|
+
const result = {
|
|
68
|
+
isClean: true,
|
|
69
|
+
hasUncommittedChanges: false,
|
|
70
|
+
progressUpdated: false,
|
|
71
|
+
errors: []
|
|
72
|
+
};
|
|
73
|
+
if (!this.config.enabled)
|
|
74
|
+
return result;
|
|
75
|
+
try {
|
|
76
|
+
// 1. 检查未提交变更
|
|
77
|
+
result.hasUncommittedChanges = await this.hasUncommittedChanges(workDir);
|
|
78
|
+
// 2. 自动提交(如果配置开启)
|
|
79
|
+
if (result.hasUncommittedChanges && this.config.autoCommit) {
|
|
80
|
+
result.committedFiles = await this.autoCommit(workDir, sessionInfo);
|
|
81
|
+
}
|
|
82
|
+
// 3. 检测 bug(如果配置开启)
|
|
83
|
+
if (this.config.detectBugs) {
|
|
84
|
+
result.bugs = await this.detectBugs(workDir);
|
|
85
|
+
if (result.bugs.length > 0)
|
|
86
|
+
result.isClean = false;
|
|
87
|
+
}
|
|
88
|
+
// 4. 更新 progress(如果配置开启)
|
|
89
|
+
if (this.config.updateProgress) {
|
|
90
|
+
result.progressUpdated = await this.updateProgress(workDir, sessionInfo, result);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
result.errors?.push(e.message);
|
|
95
|
+
result.isClean = false;
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
async hasUncommittedChanges(workDir) {
|
|
100
|
+
try {
|
|
101
|
+
const { stdout } = await execAsync('git status --porcelain', { cwd: workDir });
|
|
102
|
+
return stdout.trim().length > 0;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async autoCommit(workDir, sessionInfo) {
|
|
109
|
+
try {
|
|
110
|
+
const { stdout } = await execAsync('git status --porcelain', { cwd: workDir });
|
|
111
|
+
const files = stdout.split('\n').filter(Boolean).map(l => l.substring(3).trim());
|
|
112
|
+
await execAsync('git add -A', { cwd: workDir });
|
|
113
|
+
// 生成提交消息
|
|
114
|
+
const msg = sessionInfo.task
|
|
115
|
+
? `[${sessionInfo.task.id}] ${sessionInfo.task.name || sessionInfo.task.id}`
|
|
116
|
+
: `[session] ${sessionInfo.workflowId}`;
|
|
117
|
+
await execAsync(`git commit -m "${msg}"`, { cwd: workDir });
|
|
118
|
+
return files;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async detectBugs(workDir) {
|
|
125
|
+
const bugs = [];
|
|
126
|
+
try {
|
|
127
|
+
// 获取最近变更的文件
|
|
128
|
+
const { stdout } = await execAsync('git diff --name-only HEAD~1', { cwd: workDir });
|
|
129
|
+
for (const file of stdout.split('\n').filter(Boolean)) {
|
|
130
|
+
// 只检查代码文件
|
|
131
|
+
if (!['.ts', '.tsx', '.js', '.jsx', '.py', '.go'].some(e => file.endsWith(e)))
|
|
132
|
+
continue;
|
|
133
|
+
try {
|
|
134
|
+
const content = await fs.readFile(path.join(workDir, file), 'utf-8');
|
|
135
|
+
const lines = content.split('\n');
|
|
136
|
+
lines.forEach((line, i) => {
|
|
137
|
+
for (const { pattern, severity, type } of BUG_PATTERNS) {
|
|
138
|
+
if (pattern.test(line)) {
|
|
139
|
+
bugs.push({
|
|
140
|
+
file,
|
|
141
|
+
line: i + 1,
|
|
142
|
+
message: `Detected pattern: ${pattern.source}`,
|
|
143
|
+
severity,
|
|
144
|
+
type
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// 文件读取失败,跳过
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch { }
|
|
156
|
+
return bugs;
|
|
157
|
+
}
|
|
158
|
+
async updateProgress(workDir, sessionInfo, cleanResult) {
|
|
159
|
+
const progressPath = path.join(workDir, '.agent', 'progress.yml');
|
|
160
|
+
try {
|
|
161
|
+
await fs.mkdir(path.dirname(progressPath), { recursive: true });
|
|
162
|
+
// 读取现有 progress 或创建新的
|
|
163
|
+
let data = { sessions: [], last_updated: new Date().toISOString() };
|
|
164
|
+
try {
|
|
165
|
+
data = yaml.load(await fs.readFile(progressPath, 'utf-8')) || data;
|
|
166
|
+
}
|
|
167
|
+
catch { }
|
|
168
|
+
// 添加本次 session 记录
|
|
169
|
+
data.sessions.push({
|
|
170
|
+
id: sessionInfo.sessionId,
|
|
171
|
+
workflow: sessionInfo.workflowId,
|
|
172
|
+
task: sessionInfo.task?.id,
|
|
173
|
+
timestamp: new Date().toISOString(),
|
|
174
|
+
clean: cleanResult.isClean,
|
|
175
|
+
bugs: cleanResult.bugs?.length || 0,
|
|
176
|
+
committed: cleanResult.committedFiles?.length || 0,
|
|
177
|
+
});
|
|
178
|
+
data.last_updated = new Date().toISOString();
|
|
179
|
+
await fs.writeFile(progressPath, yaml.dump(data));
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.CleanStateManager = CleanStateManager;
|
|
188
|
+
const createCleanStateManager = (config) => new CleanStateManager(config);
|
|
189
|
+
exports.createCleanStateManager = createCleanStateManager;
|
|
190
|
+
//# sourceMappingURL=clean-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean-state.js","sourceRoot":"","sources":["../../../src/core/session/clean-state.ts"],"names":[],"mappings":"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"}
|