@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/presets.yml` - 预设配置
35
- - `.github/workflows/harness-check.yml` - CI 检查
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 --output html
60
+ harness report
71
61
  ```
72
62
 
73
- ### 4. 在 CI 中使用
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
- ### 5. 在代码中使用
77
+ ### 4. 在代码中使用
88
78
 
89
79
  ```typescript
90
- import { IronLawChecker, CheckpointValidator, PassesGate } from '@dommaker/harness';
80
+ import {
81
+ IronLawChecker,
82
+ CheckpointValidator,
83
+ PassesGate,
84
+ SessionStartup,
85
+ CleanStateManager
86
+ } from '@dommaker/harness';
91
87
 
92
88
  // 检查铁律
93
- const violations = await IronLawChecker.check(context);
94
- if (violations.length > 0) {
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 checkpoint = await CheckpointValidator.validate({
100
- id: 'pre-commit',
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 result = await gate.verify();
107
- if (!result.passed) {
108
- throw new Error('Passes gate failed');
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` | 严格模式,所有检查都是 error 级别 |
131
+ | `strict` | 严格模式,所有检查启用 |
117
132
  | `standard` | 标准模式,推荐使用 |
118
- | `relaxed` | 宽松模式,适合原型开发 |
133
+ | `relaxed` | 宽松模式,警告不阻止 |
119
134
 
120
135
  ## 项目模板
121
136
 
122
- 提供多种项目模板,预置 harness 配置:
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 --template node-api
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
- interface IronLawChecker {
139
- // 检查铁律
140
- static check(context: IronLawContext): Promise<IronLawViolation[]>;
153
+ class IronLawChecker {
154
+ static getInstance(): IronLawChecker;
141
155
 
142
- // 加载配置
143
- static loadConfig(path: string): Promise<IronLawConfig>;
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
- interface CheckpointValidator {
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
- interface PassesGate {
173
+ class PassesGate {
163
174
  constructor(config: PassesGateConfig);
164
175
 
165
- // 验证是否通过
166
- verify(): Promise<PassesGateResult>;
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 © kww
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;AAC3C,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"}
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,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,6BAA8E;AAArE,mGAAA,YAAY,OAAA"}
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.0",
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
+ }