@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.
Files changed (121) hide show
  1. package/README.md +188 -0
  2. package/bin/harness.js +104 -0
  3. package/dist/cli/commands/check.d.ts +25 -0
  4. package/dist/cli/commands/check.d.ts.map +1 -0
  5. package/dist/cli/commands/check.js +166 -0
  6. package/dist/cli/commands/check.js.map +1 -0
  7. package/dist/cli/commands/index.d.ts +9 -0
  8. package/dist/cli/commands/index.d.ts.map +1 -0
  9. package/dist/cli/commands/index.js +20 -0
  10. package/dist/cli/commands/index.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +22 -0
  12. package/dist/cli/commands/init.d.ts.map +1 -0
  13. package/dist/cli/commands/init.js +244 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/passes-gate.d.ts +24 -0
  16. package/dist/cli/commands/passes-gate.d.ts.map +1 -0
  17. package/dist/cli/commands/passes-gate.js +171 -0
  18. package/dist/cli/commands/passes-gate.js.map +1 -0
  19. package/dist/cli/commands/report.d.ts +18 -0
  20. package/dist/cli/commands/report.d.ts.map +1 -0
  21. package/dist/cli/commands/report.js +205 -0
  22. package/dist/cli/commands/report.js.map +1 -0
  23. package/dist/cli/commands/validate.d.ts +22 -0
  24. package/dist/cli/commands/validate.d.ts.map +1 -0
  25. package/dist/cli/commands/validate.js +175 -0
  26. package/dist/cli/commands/validate.js.map +1 -0
  27. package/dist/core/index.d.ts +7 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +23 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/iron-laws/checker.d.ts +61 -0
  32. package/dist/core/iron-laws/checker.d.ts.map +1 -0
  33. package/dist/core/iron-laws/checker.js +175 -0
  34. package/dist/core/iron-laws/checker.js.map +1 -0
  35. package/dist/core/iron-laws/definitions.d.ts +28 -0
  36. package/dist/core/iron-laws/definitions.d.ts.map +1 -0
  37. package/dist/core/iron-laws/definitions.js +180 -0
  38. package/dist/core/iron-laws/definitions.js.map +1 -0
  39. package/dist/core/iron-laws/index.d.ts +6 -0
  40. package/dist/core/iron-laws/index.d.ts.map +1 -0
  41. package/dist/core/iron-laws/index.js +22 -0
  42. package/dist/core/iron-laws/index.js.map +1 -0
  43. package/dist/core/session/clean-state.d.ts +17 -0
  44. package/dist/core/session/clean-state.d.ts.map +1 -0
  45. package/dist/core/session/clean-state.js +190 -0
  46. package/dist/core/session/clean-state.js.map +1 -0
  47. package/dist/core/session/index.d.ts +6 -0
  48. package/dist/core/session/index.d.ts.map +1 -0
  49. package/dist/core/session/index.js +15 -0
  50. package/dist/core/session/index.js.map +1 -0
  51. package/dist/core/session/startup.d.ts +47 -0
  52. package/dist/core/session/startup.d.ts.map +1 -0
  53. package/dist/core/session/startup.js +266 -0
  54. package/dist/core/session/startup.js.map +1 -0
  55. package/dist/core/validators/checkpoint.d.ts +88 -0
  56. package/dist/core/validators/checkpoint.d.ts.map +1 -0
  57. package/dist/core/validators/checkpoint.js +451 -0
  58. package/dist/core/validators/checkpoint.js.map +1 -0
  59. package/dist/core/validators/cso.d.ts +47 -0
  60. package/dist/core/validators/cso.d.ts.map +1 -0
  61. package/dist/core/validators/cso.js +88 -0
  62. package/dist/core/validators/cso.js.map +1 -0
  63. package/dist/core/validators/index.d.ts +9 -0
  64. package/dist/core/validators/index.d.ts.map +1 -0
  65. package/dist/core/validators/index.js +13 -0
  66. package/dist/core/validators/index.js.map +1 -0
  67. package/dist/core/validators/passes-gate.d.ts +76 -0
  68. package/dist/core/validators/passes-gate.d.ts.map +1 -0
  69. package/dist/core/validators/passes-gate.js +418 -0
  70. package/dist/core/validators/passes-gate.js.map +1 -0
  71. package/dist/index.d.ts +18 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +52 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/presets/index.d.ts +14 -0
  76. package/dist/presets/index.d.ts.map +1 -0
  77. package/dist/presets/index.js +25 -0
  78. package/dist/presets/index.js.map +1 -0
  79. package/dist/presets/relaxed.d.ts +8 -0
  80. package/dist/presets/relaxed.d.ts.map +1 -0
  81. package/dist/presets/relaxed.js +24 -0
  82. package/dist/presets/relaxed.js.map +1 -0
  83. package/dist/presets/standard.d.ts +8 -0
  84. package/dist/presets/standard.d.ts.map +1 -0
  85. package/dist/presets/standard.js +51 -0
  86. package/dist/presets/standard.js.map +1 -0
  87. package/dist/presets/strict.d.ts +8 -0
  88. package/dist/presets/strict.d.ts.map +1 -0
  89. package/dist/presets/strict.js +51 -0
  90. package/dist/presets/strict.js.map +1 -0
  91. package/dist/types/checkpoint.d.ts +120 -0
  92. package/dist/types/checkpoint.d.ts.map +1 -0
  93. package/dist/types/checkpoint.js +6 -0
  94. package/dist/types/checkpoint.js.map +1 -0
  95. package/dist/types/cso.d.ts +35 -0
  96. package/dist/types/cso.d.ts.map +1 -0
  97. package/dist/types/cso.js +6 -0
  98. package/dist/types/cso.js.map +1 -0
  99. package/dist/types/index.d.ts +10 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +24 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/types/iron-law.d.ts +113 -0
  104. package/dist/types/iron-law.d.ts.map +1 -0
  105. package/dist/types/iron-law.js +21 -0
  106. package/dist/types/iron-law.js.map +1 -0
  107. package/dist/types/passes-gate.d.ts +72 -0
  108. package/dist/types/passes-gate.d.ts.map +1 -0
  109. package/dist/types/passes-gate.js +6 -0
  110. package/dist/types/passes-gate.js.map +1 -0
  111. package/dist/types/session.d.ts +105 -0
  112. package/dist/types/session.d.ts.map +1 -0
  113. package/dist/types/session.js +6 -0
  114. package/dist/types/session.js.map +1 -0
  115. package/package.json +74 -0
  116. package/templates/nextjs-app/.github/workflows/ci.yml +39 -0
  117. package/templates/node-api/.github/workflows/ci.yml +36 -0
  118. package/templates/node-api/package.json +23 -0
  119. package/templates/node-api/src/index.ts +2 -0
  120. package/templates/node-api/tsconfig.json +19 -0
  121. 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"}