@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
package/README.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# @dommaker/harness
|
|
2
|
+
|
|
3
|
+
> 通用工程约束框架 - 铁律系统、检查点验证、测试门控
|
|
4
|
+
|
|
5
|
+
## 简介
|
|
6
|
+
|
|
7
|
+
`@dommaker/harness` 是一个通用的工程约束框架,帮助团队建立和强制执行代码质量标准。
|
|
8
|
+
|
|
9
|
+
### 核心功能
|
|
10
|
+
|
|
11
|
+
| 功能 | 说明 |
|
|
12
|
+
|------|------|
|
|
13
|
+
| **铁律系统** | 定义和检查强制规则,违规则阻止操作 |
|
|
14
|
+
| **检查点验证** | 验证工作流步骤的结果是否符合预期 |
|
|
15
|
+
| **测试门控** | 禁止自评通过,必须通过真实测试 |
|
|
16
|
+
| **预设系统** | 提供 strict/standard/relaxed 三种预设 |
|
|
17
|
+
| **CLI 工具** | 命令行工具执行检查 |
|
|
18
|
+
|
|
19
|
+
## 安装
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @dommaker/harness
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 快速开始
|
|
26
|
+
|
|
27
|
+
### 1. 初始化项目
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx harness init --preset standard
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
这会创建:
|
|
34
|
+
- `.harness/presets.yml` - 预设配置
|
|
35
|
+
- `.github/workflows/harness-check.yml` - CI 检查
|
|
36
|
+
|
|
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 命令
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# 检查铁律
|
|
58
|
+
harness check
|
|
59
|
+
|
|
60
|
+
# 验证检查点
|
|
61
|
+
harness validate
|
|
62
|
+
|
|
63
|
+
# 测试门控
|
|
64
|
+
harness passes-gate
|
|
65
|
+
|
|
66
|
+
# 初始化项目
|
|
67
|
+
harness init --preset strict
|
|
68
|
+
|
|
69
|
+
# 生成报告
|
|
70
|
+
harness report --output html
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 4. 在 CI 中使用
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
# .github/workflows/ci.yml
|
|
77
|
+
jobs:
|
|
78
|
+
harness-check:
|
|
79
|
+
runs-on: ubuntu-latest
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/checkout@v4
|
|
82
|
+
- run: npm ci
|
|
83
|
+
- run: npx harness check
|
|
84
|
+
- run: npx harness passes-gate
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 5. 在代码中使用
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
import { IronLawChecker, CheckpointValidator, PassesGate } from '@dommaker/harness';
|
|
91
|
+
|
|
92
|
+
// 检查铁律
|
|
93
|
+
const violations = await IronLawChecker.check(context);
|
|
94
|
+
if (violations.length > 0) {
|
|
95
|
+
console.error('Iron law violated:', violations[0].message);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 验证检查点
|
|
99
|
+
const checkpoint = await CheckpointValidator.validate({
|
|
100
|
+
id: 'pre-commit',
|
|
101
|
+
checks: ['test_pass', 'lint_pass'],
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// 测试门控
|
|
105
|
+
const gate = new PassesGate({ requireEvidence: true });
|
|
106
|
+
const result = await gate.verify();
|
|
107
|
+
if (!result.passed) {
|
|
108
|
+
throw new Error('Passes gate failed');
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 预设系统
|
|
113
|
+
|
|
114
|
+
| 预设 | 说明 |
|
|
115
|
+
|------|------|
|
|
116
|
+
| `strict` | 严格模式,所有检查都是 error 级别 |
|
|
117
|
+
| `standard` | 标准模式,推荐使用 |
|
|
118
|
+
| `relaxed` | 宽松模式,适合原型开发 |
|
|
119
|
+
|
|
120
|
+
## 项目模板
|
|
121
|
+
|
|
122
|
+
提供多种项目模板,预置 harness 配置:
|
|
123
|
+
|
|
124
|
+
- `node-api` - Node.js API 项目
|
|
125
|
+
- `nextjs-app` - Next.js 应用
|
|
126
|
+
- `python-api` - Python API 项目
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 从模板创建项目
|
|
130
|
+
harness init --template node-api
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## API 文档
|
|
134
|
+
|
|
135
|
+
### IronLawChecker
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
interface IronLawChecker {
|
|
139
|
+
// 检查铁律
|
|
140
|
+
static check(context: IronLawContext): Promise<IronLawViolation[]>;
|
|
141
|
+
|
|
142
|
+
// 加载配置
|
|
143
|
+
static loadConfig(path: string): Promise<IronLawConfig>;
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### CheckpointValidator
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
interface CheckpointValidator {
|
|
151
|
+
// 验证检查点
|
|
152
|
+
static validate(checkpoint: CheckpointInput): Promise<CheckpointResult>;
|
|
153
|
+
|
|
154
|
+
// 注册检查器
|
|
155
|
+
static register(type: string, handler: CheckHandler): void;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### PassesGate
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
interface PassesGate {
|
|
163
|
+
constructor(config: PassesGateConfig);
|
|
164
|
+
|
|
165
|
+
// 验证是否通过
|
|
166
|
+
verify(): Promise<PassesGateResult>;
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 开发
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# 安装依赖
|
|
174
|
+
npm install
|
|
175
|
+
|
|
176
|
+
# 构建
|
|
177
|
+
npm run build
|
|
178
|
+
|
|
179
|
+
# 测试
|
|
180
|
+
npm test
|
|
181
|
+
|
|
182
|
+
# 监听模式
|
|
183
|
+
npm run dev
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## 许可证
|
|
187
|
+
|
|
188
|
+
MIT © kww
|
package/bin/harness.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @dommaker/harness CLI 入口
|
|
5
|
+
*
|
|
6
|
+
* 通用工程约束框架
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { Command } = require('commander');
|
|
10
|
+
const { check, listLaws, validate, runPassesGate, init, report } = require('../dist/cli/commands/index');
|
|
11
|
+
|
|
12
|
+
const program = new Command();
|
|
13
|
+
|
|
14
|
+
program
|
|
15
|
+
.name('harness')
|
|
16
|
+
.description('通用工程约束框架 - 铁律系统、检查点验证、测试门控')
|
|
17
|
+
.version('0.1.0');
|
|
18
|
+
|
|
19
|
+
// ========================================
|
|
20
|
+
// harness check
|
|
21
|
+
// ========================================
|
|
22
|
+
program
|
|
23
|
+
.command('check')
|
|
24
|
+
.description('检查铁律是否满足')
|
|
25
|
+
.option('-p, --preset <preset>', '预设名称', 'standard')
|
|
26
|
+
.option('-s, --staged', '只检查暂存文件', false)
|
|
27
|
+
.option('-t, --trigger <trigger>', '触发条件')
|
|
28
|
+
.option('--project-path <path>', '项目路径')
|
|
29
|
+
.option('--list', '列出所有铁律')
|
|
30
|
+
.action(async (options) => {
|
|
31
|
+
if (options.list) {
|
|
32
|
+
listLaws();
|
|
33
|
+
} else {
|
|
34
|
+
await check(options);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// ========================================
|
|
39
|
+
// harness validate
|
|
40
|
+
// ========================================
|
|
41
|
+
program
|
|
42
|
+
.command('validate')
|
|
43
|
+
.description('验证检查点是否满足')
|
|
44
|
+
.option('-f, --file <path>', '检查点文件路径')
|
|
45
|
+
.option('-p, --project-path <path>', '项目路径')
|
|
46
|
+
.option('--strict', '严格模式(任何失败都退出)', false)
|
|
47
|
+
.action(async (options) => {
|
|
48
|
+
await validate(options);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// ========================================
|
|
52
|
+
// harness passes-gate
|
|
53
|
+
// ========================================
|
|
54
|
+
program
|
|
55
|
+
.command('passes-gate')
|
|
56
|
+
.description('运行测试门控,确保测试通过')
|
|
57
|
+
.alias('pg')
|
|
58
|
+
.option('-t, --test-command <command>', '测试命令')
|
|
59
|
+
.option('-p, --project-path <path>', '项目路径')
|
|
60
|
+
.option('--allow-partial', '允许部分测试通过', false)
|
|
61
|
+
.option('--max-retries <n>', '最大重试次数', '2')
|
|
62
|
+
.option('--coverage', '检查测试覆盖率')
|
|
63
|
+
.option('--coverage-threshold <n>', '覆盖率阈值', '80')
|
|
64
|
+
.action(async (options) => {
|
|
65
|
+
if (options.coverage) {
|
|
66
|
+
const threshold = parseInt(options.coverageThreshold, 10);
|
|
67
|
+
await runPassesGate(options);
|
|
68
|
+
const projectPath = options.projectPath || process.cwd();
|
|
69
|
+
await checkCoverage(projectPath, threshold);
|
|
70
|
+
} else {
|
|
71
|
+
await runPassesGate(options);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// ========================================
|
|
76
|
+
// harness init
|
|
77
|
+
// ========================================
|
|
78
|
+
program
|
|
79
|
+
.command('init')
|
|
80
|
+
.description('初始化项目的 harness 配置')
|
|
81
|
+
.option('-p, --preset <preset>', '预设名称 (strict/standard/relaxed)', 'standard')
|
|
82
|
+
.option('-t, --type <type>', '项目类型 (node-api/nextjs-app/python-api/custom)')
|
|
83
|
+
.option('--project-path <path>', '项目路径')
|
|
84
|
+
.option('--no-git-hooks', '不创建 Git hooks')
|
|
85
|
+
.option('--no-github-actions', '不创建 GitHub Actions')
|
|
86
|
+
.action(async (options) => {
|
|
87
|
+
await init(options);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// ========================================
|
|
91
|
+
// harness report
|
|
92
|
+
// ========================================
|
|
93
|
+
program
|
|
94
|
+
.command('report')
|
|
95
|
+
.description('生成检查报告')
|
|
96
|
+
.option('-o, --output <path>', '输出文件路径')
|
|
97
|
+
.option('-f, --format <format>', '输出格式 (json/markdown)', 'markdown')
|
|
98
|
+
.option('-p, --project-path <path>', '项目路径')
|
|
99
|
+
.action(async (options) => {
|
|
100
|
+
await report(options);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// 解析命令行参数
|
|
104
|
+
program.parse();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* harness check 命令
|
|
3
|
+
*
|
|
4
|
+
* 检查铁律是否满足
|
|
5
|
+
*/
|
|
6
|
+
import type { IronLawTrigger } from '../../types/iron-law';
|
|
7
|
+
export interface CheckOptions {
|
|
8
|
+
/** 预设名称 */
|
|
9
|
+
preset: string;
|
|
10
|
+
/** 是否只检查暂存文件 */
|
|
11
|
+
staged: boolean;
|
|
12
|
+
/** 触发条件 */
|
|
13
|
+
trigger?: IronLawTrigger;
|
|
14
|
+
/** 项目路径 */
|
|
15
|
+
projectPath?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 执行铁律检查
|
|
19
|
+
*/
|
|
20
|
+
export declare function check(options: CheckOptions): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* 列出所有铁律
|
|
23
|
+
*/
|
|
24
|
+
export declare function listLaws(): void;
|
|
25
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAiC,MAAM,sBAAsB,CAAC;AAE1F,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW;IACX,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiDD;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EhE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAY/B"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* harness check 命令
|
|
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 __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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.check = check;
|
|
45
|
+
exports.listLaws = listLaws;
|
|
46
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
47
|
+
const checker_1 = require("../../core/iron-laws/checker");
|
|
48
|
+
const definitions_1 = require("../../core/iron-laws/definitions");
|
|
49
|
+
/**
|
|
50
|
+
* 从 git diff 获取变更的文件
|
|
51
|
+
*/
|
|
52
|
+
async function getChangedFiles(staged) {
|
|
53
|
+
const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
54
|
+
const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
|
|
55
|
+
const execAsync = promisify(exec);
|
|
56
|
+
try {
|
|
57
|
+
const command = staged ? 'git diff --cached --name-only' : 'git diff --name-only';
|
|
58
|
+
const { stdout } = await execAsync(command);
|
|
59
|
+
return stdout.trim().split('\n').filter(Boolean);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 检测触发条件
|
|
67
|
+
*/
|
|
68
|
+
function detectTrigger(changedFiles, options) {
|
|
69
|
+
// 如果指定了触发条件,直接使用
|
|
70
|
+
if (options.trigger) {
|
|
71
|
+
return options.trigger;
|
|
72
|
+
}
|
|
73
|
+
// 根据变更文件推断触发条件
|
|
74
|
+
const hasCodeChange = changedFiles.some(f => f.endsWith('.ts') || f.endsWith('.tsx') || f.endsWith('.js') || f.endsWith('.jsx'));
|
|
75
|
+
const hasTestChange = changedFiles.some(f => f.includes('.test.') || f.includes('.spec.') || f.includes('__tests__'));
|
|
76
|
+
const hasModuleChange = changedFiles.some(f => f.includes('src/') && !f.includes('__tests__'));
|
|
77
|
+
if (hasCodeChange && !hasTestChange) {
|
|
78
|
+
return 'code_implementation';
|
|
79
|
+
}
|
|
80
|
+
if (hasModuleChange) {
|
|
81
|
+
return 'module_modification';
|
|
82
|
+
}
|
|
83
|
+
return 'file_modification';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 执行铁律检查
|
|
87
|
+
*/
|
|
88
|
+
async function check(options) {
|
|
89
|
+
console.log(chalk_1.default.blue('🔍 检查铁律...'));
|
|
90
|
+
console.log(chalk_1.default.gray(`预设: ${options.preset}`));
|
|
91
|
+
const checker = checker_1.IronLawChecker.getInstance();
|
|
92
|
+
const allLaws = (0, definitions_1.getAllLaws)();
|
|
93
|
+
// 获取变更文件
|
|
94
|
+
const changedFiles = await getChangedFiles(options.staged);
|
|
95
|
+
if (changedFiles.length > 0) {
|
|
96
|
+
console.log(chalk_1.default.gray(`变更文件: ${changedFiles.length} 个`));
|
|
97
|
+
}
|
|
98
|
+
// 检测触发条件
|
|
99
|
+
const trigger = detectTrigger(changedFiles, options);
|
|
100
|
+
console.log(chalk_1.default.gray(`触发条件: ${trigger}`));
|
|
101
|
+
// 构建上下文
|
|
102
|
+
const context = {
|
|
103
|
+
operation: trigger,
|
|
104
|
+
projectPath: options.projectPath || process.cwd(),
|
|
105
|
+
changedFiles,
|
|
106
|
+
hasTest: changedFiles.some(f => f.includes('.test.') || f.includes('.spec.')),
|
|
107
|
+
hasFailingTest: false, // TODO: 实际检查测试状态
|
|
108
|
+
hasRootCauseInvestigation: false, // TODO: 检查是否有根因分析文档
|
|
109
|
+
hasVerificationEvidence: false, // TODO: 检查是否有验证证据
|
|
110
|
+
hasReuseCheck: false, // TODO: 检查是否有复用检查
|
|
111
|
+
};
|
|
112
|
+
// 执行检查
|
|
113
|
+
const results = await checker.checkAll(context);
|
|
114
|
+
// 统计结果
|
|
115
|
+
const passed = results.filter(r => r.satisfied);
|
|
116
|
+
const violations = results.filter(r => !r.satisfied);
|
|
117
|
+
const errors = violations.filter(r => r.law?.severity === 'error');
|
|
118
|
+
const warnings = violations.filter(r => r.law?.severity === 'warning');
|
|
119
|
+
// 输出结果
|
|
120
|
+
console.log();
|
|
121
|
+
if (passed.length > 0) {
|
|
122
|
+
console.log(chalk_1.default.green(`✅ 通过: ${passed.length} 条`));
|
|
123
|
+
passed.forEach(r => {
|
|
124
|
+
if (r.law) {
|
|
125
|
+
console.log(chalk_1.default.gray(` - ${r.law.id}`));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (warnings.length > 0) {
|
|
130
|
+
console.log(chalk_1.default.yellow(`⚠️ 警告: ${warnings.length} 条`));
|
|
131
|
+
warnings.forEach(r => {
|
|
132
|
+
if (r.law) {
|
|
133
|
+
console.log(chalk_1.default.yellow(` - ${r.law.id}: ${r.law.message}`));
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (errors.length > 0) {
|
|
138
|
+
console.log(chalk_1.default.red(`❌ 违规: ${errors.length} 条`));
|
|
139
|
+
errors.forEach(r => {
|
|
140
|
+
if (r.law) {
|
|
141
|
+
console.log(chalk_1.default.red(` - ${r.law.id}: ${r.law.message}`));
|
|
142
|
+
console.log(chalk_1.default.red(` ${r.law.rule}`));
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
console.log();
|
|
146
|
+
console.log(chalk_1.default.red('🛑 铁律检查失败,请修复后再提交'));
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
console.log();
|
|
150
|
+
console.log(chalk_1.default.green('✅ 所有铁律检查通过'));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 列出所有铁律
|
|
154
|
+
*/
|
|
155
|
+
function listLaws() {
|
|
156
|
+
const laws = (0, definitions_1.getAllLaws)();
|
|
157
|
+
console.log(chalk_1.default.blue('\n📜 所有铁律:\n'));
|
|
158
|
+
laws.forEach(law => {
|
|
159
|
+
const icon = law.severity === 'error' ? '🔴' : law.severity === 'warning' ? '🟡' : '🔵';
|
|
160
|
+
console.log(`${icon} ${chalk_1.default.bold(law.id)}`);
|
|
161
|
+
console.log(chalk_1.default.gray(` ${law.rule}`));
|
|
162
|
+
console.log(chalk_1.default.gray(` ${law.message}`));
|
|
163
|
+
console.log();
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 命令导出
|
|
3
|
+
*/
|
|
4
|
+
export { check, listLaws, type CheckOptions } from './check';
|
|
5
|
+
export { validate, createExampleCheckpoint, type ValidateOptions } from './validate';
|
|
6
|
+
export { runPassesGate, checkCoverage, type PassesGateOptions } from './passes-gate';
|
|
7
|
+
export { init, type InitOptions } from './init';
|
|
8
|
+
export { report, type ReportOptions } from './report';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI 命令导出
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.report = exports.init = exports.checkCoverage = exports.runPassesGate = exports.createExampleCheckpoint = exports.validate = exports.listLaws = exports.check = void 0;
|
|
7
|
+
var check_1 = require("./check");
|
|
8
|
+
Object.defineProperty(exports, "check", { enumerable: true, get: function () { return check_1.check; } });
|
|
9
|
+
Object.defineProperty(exports, "listLaws", { enumerable: true, get: function () { return check_1.listLaws; } });
|
|
10
|
+
var validate_1 = require("./validate");
|
|
11
|
+
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return validate_1.validate; } });
|
|
12
|
+
Object.defineProperty(exports, "createExampleCheckpoint", { enumerable: true, get: function () { return validate_1.createExampleCheckpoint; } });
|
|
13
|
+
var passes_gate_1 = require("./passes-gate");
|
|
14
|
+
Object.defineProperty(exports, "runPassesGate", { enumerable: true, get: function () { return passes_gate_1.runPassesGate; } });
|
|
15
|
+
Object.defineProperty(exports, "checkCoverage", { enumerable: true, get: function () { return passes_gate_1.checkCoverage; } });
|
|
16
|
+
var init_1 = require("./init");
|
|
17
|
+
Object.defineProperty(exports, "init", { enumerable: true, get: function () { return init_1.init; } });
|
|
18
|
+
var report_1 = require("./report");
|
|
19
|
+
Object.defineProperty(exports, "report", { enumerable: true, get: function () { return report_1.report; } });
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iCAA6D;AAApD,8FAAA,KAAK,OAAA;AAAE,iGAAA,QAAQ,OAAA;AACxB,uCAAqF;AAA5E,oGAAA,QAAQ,OAAA;AAAE,mHAAA,uBAAuB,OAAA;AAC1C,6CAAqF;AAA5E,4GAAA,aAAa,OAAA;AAAE,4GAAA,aAAa,OAAA;AACrC,+BAAgD;AAAvC,4FAAA,IAAI,OAAA;AACb,mCAAsD;AAA7C,gGAAA,MAAM,OAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* harness init 命令
|
|
3
|
+
*
|
|
4
|
+
* 初始化项目的 harness 配置
|
|
5
|
+
*/
|
|
6
|
+
export interface InitOptions {
|
|
7
|
+
/** 项目路径 */
|
|
8
|
+
projectPath?: string;
|
|
9
|
+
/** 预设名称 */
|
|
10
|
+
preset: 'strict' | 'standard' | 'relaxed';
|
|
11
|
+
/** 项目类型 */
|
|
12
|
+
type?: 'node-api' | 'nextjs-app' | 'python-api' | 'custom';
|
|
13
|
+
/** 是否创建 Git hooks */
|
|
14
|
+
gitHooks?: boolean;
|
|
15
|
+
/** 是否创建 GitHub Actions */
|
|
16
|
+
githubActions?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 初始化项目
|
|
20
|
+
*/
|
|
21
|
+
export declare function init(options: InitOptions): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,WAAW;IAC1B,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C,WAAW;IACX,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC3D,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAkDD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2E9D"}
|