@dommaker/harness 0.1.0 → 0.1.2
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
CHANGED
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
|
|
11
11
|
| 功能 | 说明 |
|
|
12
12
|
|------|------|
|
|
13
|
-
| **铁律系统** |
|
|
13
|
+
| **铁律系统** | 13 条内置铁律,违规则阻止操作 |
|
|
14
14
|
| **检查点验证** | 验证工作流步骤的结果是否符合预期 |
|
|
15
15
|
| **测试门控** | 禁止自评通过,必须通过真实测试 |
|
|
16
|
+
| **Session 管理** | 启动检查点 + 结束状态管理 |
|
|
16
17
|
| **预设系统** | 提供 strict/standard/relaxed 三种预设 |
|
|
17
18
|
| **CLI 工具** | 命令行工具执行检查 |
|
|
18
19
|
|
|
@@ -31,46 +32,35 @@ npx harness init --preset standard
|
|
|
31
32
|
```
|
|
32
33
|
|
|
33
34
|
这会创建:
|
|
34
|
-
- `.harness/
|
|
35
|
-
- `.
|
|
35
|
+
- `.harness/config.yml` - 预设配置
|
|
36
|
+
- `.harness/checkpoints.yml` - 示例检查点
|
|
37
|
+
- `CAPABILITIES.md` - 功能清单模板
|
|
38
|
+
- `.git/hooks/pre-commit` - Git 钩子(可选)
|
|
39
|
+
- `.github/workflows/harness-check.yml` - CI 检查(可选)
|
|
36
40
|
|
|
37
|
-
### 2.
|
|
38
|
-
|
|
39
|
-
创建 `.harness/iron-laws.yml`:
|
|
40
|
-
|
|
41
|
-
```yaml
|
|
42
|
-
iron_laws:
|
|
43
|
-
- id: no_self_approval
|
|
44
|
-
rule: "禁止自评通过"
|
|
45
|
-
message: "任务必须通过测试验证,不能自评完成"
|
|
46
|
-
severity: error
|
|
47
|
-
|
|
48
|
-
- id: test_required
|
|
49
|
-
rule: "代码变更必须有测试"
|
|
50
|
-
message: "修改代码时必须添加或更新测试"
|
|
51
|
-
severity: warning
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 3. CLI 命令
|
|
41
|
+
### 2. CLI 命令
|
|
55
42
|
|
|
56
43
|
```bash
|
|
44
|
+
# 初始化项目配置
|
|
45
|
+
harness init --preset standard
|
|
46
|
+
|
|
57
47
|
# 检查铁律
|
|
58
48
|
harness check
|
|
59
49
|
|
|
50
|
+
# 列出所有铁律
|
|
51
|
+
harness check --list
|
|
52
|
+
|
|
60
53
|
# 验证检查点
|
|
61
54
|
harness validate
|
|
62
55
|
|
|
63
56
|
# 测试门控
|
|
64
57
|
harness passes-gate
|
|
65
58
|
|
|
66
|
-
# 初始化项目
|
|
67
|
-
harness init --preset strict
|
|
68
|
-
|
|
69
59
|
# 生成报告
|
|
70
|
-
harness report
|
|
60
|
+
harness report
|
|
71
61
|
```
|
|
72
62
|
|
|
73
|
-
###
|
|
63
|
+
### 3. 在 CI 中使用
|
|
74
64
|
|
|
75
65
|
```yaml
|
|
76
66
|
# .github/workflows/ci.yml
|
|
@@ -84,50 +74,75 @@ jobs:
|
|
|
84
74
|
- run: npx harness passes-gate
|
|
85
75
|
```
|
|
86
76
|
|
|
87
|
-
###
|
|
77
|
+
### 4. 在代码中使用
|
|
88
78
|
|
|
89
79
|
```typescript
|
|
90
|
-
import {
|
|
80
|
+
import {
|
|
81
|
+
IronLawChecker,
|
|
82
|
+
CheckpointValidator,
|
|
83
|
+
PassesGate,
|
|
84
|
+
SessionStartup,
|
|
85
|
+
CleanStateManager
|
|
86
|
+
} from '@dommaker/harness';
|
|
91
87
|
|
|
92
88
|
// 检查铁律
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
console.error('Iron law violated:', violations[0].message);
|
|
96
|
-
}
|
|
89
|
+
const checker = IronLawChecker.getInstance();
|
|
90
|
+
const results = await checker.checkAll(context);
|
|
97
91
|
|
|
98
92
|
// 验证检查点
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
checks: ['test_pass', 'lint_pass'],
|
|
102
|
-
});
|
|
93
|
+
const validator = new CheckpointValidator();
|
|
94
|
+
const result = await validator.validate(checkpoints, context);
|
|
103
95
|
|
|
104
96
|
// 测试门控
|
|
105
97
|
const gate = new PassesGate({ requireEvidence: true });
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
98
|
+
const testResult = await gate.setPasses(taskId, true, workDir);
|
|
99
|
+
|
|
100
|
+
// Session 启动检查
|
|
101
|
+
const startup = new SessionStartup(workDir, checkpoints);
|
|
102
|
+
const { success, results } = await startup.run();
|
|
103
|
+
|
|
104
|
+
// Session 结束清理
|
|
105
|
+
const cleaner = new CleanStateManager();
|
|
106
|
+
const cleanResult = await cleaner.onSessionEnd(workDir, sessionInfo);
|
|
110
107
|
```
|
|
111
108
|
|
|
109
|
+
## 内置铁律(13 条)
|
|
110
|
+
|
|
111
|
+
| ID | 规则 | 严重性 |
|
|
112
|
+
|---|------|:------:|
|
|
113
|
+
| `no_simplification_without_approval` | 不能擅自简化逻辑 | 🔴 error |
|
|
114
|
+
| `no_fix_without_root_cause` | 修复前必须找到根因 | 🔴 error |
|
|
115
|
+
| `no_completion_without_verification` | 完成必须有验证证据 | 🔴 error |
|
|
116
|
+
| `no_skill_without_test` | 创建技能前必须有测试 | 🟡 warning |
|
|
117
|
+
| `no_code_without_test` | 写代码前必须有测试 | 🔴 error |
|
|
118
|
+
| `no_creation_without_reuse_check` | 创建前必须检查可复用 | 🟡 warning |
|
|
119
|
+
| `capability_sync` | 代码变更必须更新 CAPABILITIES.md | 🟡 warning |
|
|
120
|
+
| `no_any_type` | 禁止使用 any 类型 | 🟡 warning |
|
|
121
|
+
| `no_bypass_checkpoint` | 禁止跳过检查点 | 🔴 error |
|
|
122
|
+
| `test_coverage_required` | 测试覆盖率必须达标 | 🟡 warning |
|
|
123
|
+
| `no_self_approval` | 禁止自评通过 | 🔴 error |
|
|
124
|
+
| `doc_required_for_public_api` | 公共 API 必须有文档 | 🟡 warning |
|
|
125
|
+
| `readme_required` | 新模块必须有 README | 🔵 info |
|
|
126
|
+
|
|
112
127
|
## 预设系统
|
|
113
128
|
|
|
114
129
|
| 预设 | 说明 |
|
|
115
130
|
|------|------|
|
|
116
|
-
| `strict` |
|
|
131
|
+
| `strict` | 严格模式,所有检查启用 |
|
|
117
132
|
| `standard` | 标准模式,推荐使用 |
|
|
118
|
-
| `relaxed` |
|
|
133
|
+
| `relaxed` | 宽松模式,警告不阻止 |
|
|
119
134
|
|
|
120
135
|
## 项目模板
|
|
121
136
|
|
|
122
|
-
|
|
137
|
+
提供多种项目模板:
|
|
123
138
|
|
|
124
139
|
- `node-api` - Node.js API 项目
|
|
125
140
|
- `nextjs-app` - Next.js 应用
|
|
126
141
|
- `python-api` - Python API 项目
|
|
127
142
|
|
|
128
143
|
```bash
|
|
129
|
-
#
|
|
130
|
-
harness init --
|
|
144
|
+
# 指定项目类型
|
|
145
|
+
harness init --type node-api
|
|
131
146
|
```
|
|
132
147
|
|
|
133
148
|
## API 文档
|
|
@@ -135,35 +150,53 @@ harness init --template node-api
|
|
|
135
150
|
### IronLawChecker
|
|
136
151
|
|
|
137
152
|
```typescript
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
static check(context: IronLawContext): Promise<IronLawViolation[]>;
|
|
153
|
+
class IronLawChecker {
|
|
154
|
+
static getInstance(): IronLawChecker;
|
|
141
155
|
|
|
142
|
-
|
|
143
|
-
|
|
156
|
+
checkAll(context: IronLawContext): Promise<IronLawResult[]>;
|
|
157
|
+
beforeExecution(context: IronLawContext): Promise<void>;
|
|
158
|
+
checkIronLaw(lawId: string, context: IronLawContext): Promise<IronLawResult>;
|
|
144
159
|
}
|
|
145
160
|
```
|
|
146
161
|
|
|
147
162
|
### CheckpointValidator
|
|
148
163
|
|
|
149
164
|
```typescript
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
static validate(checkpoint: CheckpointInput): Promise<CheckpointResult>;
|
|
153
|
-
|
|
154
|
-
// 注册检查器
|
|
155
|
-
static register(type: string, handler: CheckHandler): void;
|
|
165
|
+
class CheckpointValidator {
|
|
166
|
+
validate(checkpoints: Checkpoint[], context: CheckpointContext): Promise<CheckpointResult>;
|
|
156
167
|
}
|
|
157
168
|
```
|
|
158
169
|
|
|
159
170
|
### PassesGate
|
|
160
171
|
|
|
161
172
|
```typescript
|
|
162
|
-
|
|
173
|
+
class PassesGate {
|
|
163
174
|
constructor(config: PassesGateConfig);
|
|
164
175
|
|
|
165
|
-
|
|
166
|
-
|
|
176
|
+
setPasses(taskId: string, value: boolean, workDir: string): Promise<PassesGateResult>;
|
|
177
|
+
runTests(): Promise<TestResult>;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### SessionStartup
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
class SessionStartup {
|
|
185
|
+
constructor(workDir: string, checkpoints: StartupCheckpoints);
|
|
186
|
+
|
|
187
|
+
run(): Promise<{ success: boolean; results: StartupCheckpointResult[] }>;
|
|
188
|
+
getCurrentTask(): Promise<{ task: any; index: number } | null>;
|
|
189
|
+
generateReport(results: StartupCheckpointResult[]): string;
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### CleanStateManager
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
class CleanStateManager {
|
|
197
|
+
constructor(config: CleanStateConfig);
|
|
198
|
+
|
|
199
|
+
onSessionEnd(workDir: string, sessionInfo: SessionInfo): Promise<CleanStateResult>;
|
|
167
200
|
}
|
|
168
201
|
```
|
|
169
202
|
|
|
@@ -178,11 +211,8 @@ npm run build
|
|
|
178
211
|
|
|
179
212
|
# 测试
|
|
180
213
|
npm test
|
|
181
|
-
|
|
182
|
-
# 监听模式
|
|
183
|
-
npm run dev
|
|
184
214
|
```
|
|
185
215
|
|
|
186
216
|
## 许可证
|
|
187
217
|
|
|
188
|
-
MIT ©
|
|
218
|
+
MIT © dommaker
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 验证器导出
|
|
3
3
|
*/
|
|
4
4
|
export { CheckpointValidator } from './checkpoint';
|
|
5
|
-
export { PassesGate } from './passes-gate';
|
|
5
|
+
export { PassesGate, createPassesGate } from './passes-gate';
|
|
6
6
|
export { CSOValidator, type CSOValidationResult, type CSOIssue } from './cso';
|
|
7
7
|
export type { Checkpoint, CheckpointCheck, CheckpointResult, CheckResult, CheckpointContext, CheckType, CheckConfig, } from '../../types/checkpoint';
|
|
8
8
|
export type { PassesGateConfig, PassesGateResult, TaskTestResult, DynamicTask, } from '../../types/passes-gate';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/validators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/validators/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG9E,YAAY,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,yBAAyB,CAAC"}
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* 验证器导出
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.CSOValidator = exports.PassesGate = exports.CheckpointValidator = void 0;
|
|
6
|
+
exports.CSOValidator = exports.createPassesGate = exports.PassesGate = exports.CheckpointValidator = void 0;
|
|
7
7
|
var checkpoint_1 = require("./checkpoint");
|
|
8
8
|
Object.defineProperty(exports, "CheckpointValidator", { enumerable: true, get: function () { return checkpoint_1.CheckpointValidator; } });
|
|
9
9
|
var passes_gate_1 = require("./passes-gate");
|
|
10
10
|
Object.defineProperty(exports, "PassesGate", { enumerable: true, get: function () { return passes_gate_1.PassesGate; } });
|
|
11
|
+
Object.defineProperty(exports, "createPassesGate", { enumerable: true, get: function () { return passes_gate_1.createPassesGate; } });
|
|
11
12
|
var cso_1 = require("./cso");
|
|
12
13
|
Object.defineProperty(exports, "CSOValidator", { enumerable: true, get: function () { return cso_1.CSOValidator; } });
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validators/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2CAAmD;AAA1C,iHAAA,mBAAmB,OAAA;AAC5B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validators/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2CAAmD;AAA1C,iHAAA,mBAAmB,OAAA;AAC5B,6CAA6D;AAApD,yGAAA,UAAU,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AACrC,6BAA8E;AAArE,mGAAA,YAAY,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dommaker/harness",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "通用工程约束框架 - 铁律系统、检查点验证、测试门控",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"harness",
|
|
@@ -71,4 +71,4 @@
|
|
|
71
71
|
"url": "https://github.com/kww/harness/issues"
|
|
72
72
|
},
|
|
73
73
|
"homepage": "https://github.com/kww/harness#readme"
|
|
74
|
-
}
|
|
74
|
+
}
|