@dommaker/harness 0.8.0 → 0.8.3

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
@@ -78,6 +78,12 @@ harness contract --contract-path api/openapi.yaml
78
78
  harness review # PR 审查状态检查
79
79
  harness review --min-reviewers 2 # 要求 2 个审批
80
80
  harness review status # PR 详情
81
+
82
+ # 命令黑名单
83
+ harness command "rm -rf /" # 检查命令
84
+ harness command --level "DROP TABLE" # 显示风险等级
85
+ harness command --list # 列出所有规则
86
+ harness cmd # 别名
81
87
  ```
82
88
 
83
89
  ### Spec 验证
@@ -135,7 +141,7 @@ harness flow --auto-apply # 自动应用低风险提案
135
141
  | `verify_external_capability` | 外部能力先验证 |
136
142
  | `no_implementation_without_requirement_review` | 实现后对比需求 |
137
143
 
138
- ### 7 种门禁(均有 CLI 命令)
144
+ ### 8 种门禁(均有 CLI 命令)
139
145
 
140
146
  | 门禁 | CLI 命令 | 用途 |
141
147
  |------|:--------:|------|
@@ -145,9 +151,8 @@ harness flow --auto-apply # 自动应用低风险提案
145
151
  | SecurityGate | `security` / `sec` | 安全检查 |
146
152
  | ContractGate | `contract` | API 契约验证 |
147
153
  | ReviewGate | `review` | PR 审核检查 |
154
+ | CommandGate | `command` / `cmd` | 命令黑名单 |
148
155
  | CheckpointValidator | `validate` | 检查点验证 |
149
- | CheckpointValidator | 检查点验证 |
150
- | SpecAcceptanceGate | 验收标准检查 |
151
156
 
152
157
  ---
153
158
 
@@ -157,8 +162,8 @@ harness flow --auto-apply # 自动应用低风险提案
157
162
  import {
158
163
  IronLawChecker,
159
164
  PassesGate,
165
+ CommandGate,
160
166
  CheckpointValidator,
161
- interceptOperation,
162
167
  } from '@dommaker/harness';
163
168
 
164
169
  // 铁律检查
@@ -169,17 +174,15 @@ const results = await checker.checkAll(context);
169
174
  const gate = new PassesGate({ requireEvidence: true });
170
175
  const passed = await gate.runTests();
171
176
 
172
- // 检查点验证
173
- const validator = CheckpointValidator.getInstance();
174
- const result = await validator.validate(checkpoints, context);
175
-
176
- // 拦截器(自动执行 enforcement)
177
- await interceptOperation('task_completion_claim', context);
177
+ // 命令黑名单
178
+ const commandGate = new CommandGate();
179
+ const result = await commandGate.check('rm -rf /');
180
+ // { passed: false, message: '命令被禁止执行...' }
178
181
  ```
179
182
 
180
- ---
183
+ > 详细 API 参考:[capabilities/](capabilities/) 目录
181
184
 
182
- ## 📁 项目配置
185
+ ---
183
186
 
184
187
  ### .harness/config.yml
185
188
 
package/bin/harness.js CHANGED
@@ -27,7 +27,9 @@ const {
27
27
  contract,
28
28
  validateSchema,
29
29
  review,
30
- reviewStatus
30
+ reviewStatus,
31
+ command,
32
+ cmd
31
33
  } = require('../dist/cli/commands/index');
32
34
 
33
35
  const program = new Command();
@@ -295,5 +297,70 @@ program
295
297
  }
296
298
  });
297
299
 
300
+ // ========================================
301
+ // harness command
302
+ // ========================================
303
+ program
304
+ .command('command [cmd]')
305
+ .description('检查命令是否在黑名单中')
306
+ .alias('cmd')
307
+ .option('-l, --level', '显示风险等级')
308
+ .option('--list', '列出所有黑名单规则')
309
+ .option('--json', 'JSON 格式输出')
310
+ .option('--strict', '严格模式(warn 也阻止)')
311
+ .action(async (cmd, options, command) => {
312
+ const gate = require('../dist/gates/command').createCommandGate({ strict: options.strict });
313
+
314
+ if (options.list) {
315
+ const { DEFAULT_COMMAND_BLACKLIST } = require('../dist/gates/command');
316
+ if (options.json) {
317
+ console.log(JSON.stringify(DEFAULT_COMMAND_BLACKLIST.map(r => ({
318
+ id: r.id,
319
+ level: r.level,
320
+ message: r.message,
321
+ category: r.category,
322
+ })), null, 2));
323
+ } else {
324
+ console.log('\n命令黑名单规则:\n');
325
+ console.log(`共 ${DEFAULT_COMMAND_BLACKLIST.length} 条规则`);
326
+ console.log('使用 harness command --list --json 查看详情');
327
+ }
328
+ return;
329
+ }
330
+
331
+ if (!cmd) {
332
+ console.error('错误:请提供要检查的命令');
333
+ console.error('用法:harness command "your command"');
334
+ process.exit(1);
335
+ }
336
+
337
+ const result = await gate.check(cmd);
338
+
339
+ if (options.level) {
340
+ const { getCommandRiskLevel } = require('../dist/gates/command');
341
+ const level = getCommandRiskLevel(cmd);
342
+ if (options.json) {
343
+ console.log(JSON.stringify({ level, command: cmd }));
344
+ } else {
345
+ const levelColors = { high: '\x1b[31m', medium: '\x1b[33m', low: '\x1b[32m' };
346
+ console.log(`${levelColors[level]}${level}\x1b[0m ${cmd}`);
347
+ }
348
+ process.exit(level === 'high' ? 1 : 0);
349
+ }
350
+
351
+ if (options.json) {
352
+ console.log(JSON.stringify({
353
+ command: cmd,
354
+ passed: result.passed,
355
+ message: result.message,
356
+ details: result.details,
357
+ }, null, 2));
358
+ } else {
359
+ console.log(result.passed ? `\x1b[32m✓\x1b[0m ${result.message}` : `\x1b[31m✗\x1b[0m ${result.message}`);
360
+ }
361
+
362
+ process.exit(result.passed ? 0 : 1);
363
+ });
364
+
298
365
  // 解析命令行参数
299
366
  program.parse();
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 命令黑名单检查
3
+ *
4
+ * 用法:
5
+ * harness command "rm -rf /"
6
+ * harness command --level "DROP TABLE users"
7
+ * harness command --list
8
+ */
9
+ import { Command } from 'commander';
10
+ export declare const command: Command;
11
+ export declare const cmd: Command;
12
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,OAAO,SAoFhB,CAAC;AAGL,eAAO,MAAM,GAAG,SAmDZ,CAAC"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * 命令黑名单检查
4
+ *
5
+ * 用法:
6
+ * harness command "rm -rf /"
7
+ * harness command --level "DROP TABLE users"
8
+ * harness command --list
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.cmd = exports.command = void 0;
12
+ const commander_1 = require("commander");
13
+ const gates_1 = require("../../gates");
14
+ exports.command = new commander_1.Command('command')
15
+ .description('检查命令是否在黑名单中')
16
+ .argument('[cmd]', '要检查的命令')
17
+ .option('-l, --level', '显示风险等级')
18
+ .option('--list', '列出所有黑名单规则')
19
+ .option('--json', 'JSON 格式输出')
20
+ .option('--strict', '严格模式(warn 也阻止)')
21
+ .action(async (cmd, options) => {
22
+ // 列出所有规则
23
+ if (options.list) {
24
+ if (options.json) {
25
+ console.log(JSON.stringify(gates_1.DEFAULT_COMMAND_BLACKLIST.map((r) => ({
26
+ id: r.id,
27
+ level: r.level,
28
+ message: r.message,
29
+ category: r.category,
30
+ })), null, 2));
31
+ }
32
+ else {
33
+ console.log('\n命令黑名单规则:\n');
34
+ const byCategory = gates_1.DEFAULT_COMMAND_BLACKLIST.reduce((acc, rule) => {
35
+ if (!acc[rule.category])
36
+ acc[rule.category] = [];
37
+ acc[rule.category].push(rule);
38
+ return acc;
39
+ }, {});
40
+ for (const [category, rules] of Object.entries(byCategory)) {
41
+ console.log(`[${category}]`);
42
+ for (const rule of rules) {
43
+ const levelIcon = rule.level === 'block' ? '🚫' : rule.level === 'warn' ? '⚠️' : '📋';
44
+ console.log(` ${levelIcon} ${rule.id}: ${rule.message} (${rule.level})`);
45
+ }
46
+ console.log();
47
+ }
48
+ console.log(`共 ${gates_1.DEFAULT_COMMAND_BLACKLIST.length} 条规则`);
49
+ }
50
+ return;
51
+ }
52
+ // 需要命令参数
53
+ if (!cmd) {
54
+ console.error('错误:请提供要检查的命令');
55
+ console.error('用法:harness command "your command"');
56
+ process.exit(1);
57
+ }
58
+ // 创建门禁
59
+ const gate = (0, gates_1.createCommandGate)({ strict: options.strict });
60
+ const result = await gate.check(cmd);
61
+ if (options.level) {
62
+ // 只显示风险等级
63
+ const level = (0, gates_1.getCommandRiskLevel)(cmd);
64
+ if (options.json) {
65
+ console.log(JSON.stringify({ level, command: cmd }));
66
+ }
67
+ else {
68
+ const levelColors = {
69
+ high: '\x1b[31m',
70
+ medium: '\x1b[33m',
71
+ low: '\x1b[32m',
72
+ };
73
+ console.log(`${levelColors[level]}${level}\x1b[0m ${cmd}`);
74
+ }
75
+ process.exit(level === 'high' ? 1 : 0);
76
+ }
77
+ // 完整检查
78
+ if (options.json) {
79
+ console.log(JSON.stringify({
80
+ command: cmd,
81
+ passed: result.passed,
82
+ message: result.message,
83
+ details: result.details,
84
+ }, null, 2));
85
+ }
86
+ else {
87
+ if (result.passed) {
88
+ console.log(`\x1b[32m✓\x1b[0m ${result.message}`);
89
+ }
90
+ else {
91
+ console.log(`\x1b[31m✗\x1b[0m ${result.message}`);
92
+ }
93
+ }
94
+ process.exit(result.passed ? 0 : 1);
95
+ });
96
+ // 别名
97
+ exports.cmd = new commander_1.Command('cmd')
98
+ .description('命令黑名单检查(command 的别名)')
99
+ .argument('[cmd]', '要检查的命令')
100
+ .option('-l, --level', '显示风险等级')
101
+ .option('--list', '列出所有黑名单规则')
102
+ .option('--json', 'JSON 格式输出')
103
+ .option('--strict', '严格模式(warn 也阻止)')
104
+ .action(async (cmd, options) => {
105
+ // 复用 command 的逻辑
106
+ const gate = (0, gates_1.createCommandGate)({ strict: options.strict });
107
+ if (options.list) {
108
+ if (options.json) {
109
+ console.log(JSON.stringify(gates_1.DEFAULT_COMMAND_BLACKLIST.map((r) => ({
110
+ id: r.id,
111
+ level: r.level,
112
+ message: r.message,
113
+ category: r.category,
114
+ })), null, 2));
115
+ }
116
+ else {
117
+ console.log('\n命令黑名单规则:\n');
118
+ console.log(`共 ${gates_1.DEFAULT_COMMAND_BLACKLIST.length} 条规则`);
119
+ console.log('使用 harness command --list 查看详情');
120
+ }
121
+ return;
122
+ }
123
+ if (!cmd) {
124
+ console.error('错误:请提供要检查的命令');
125
+ process.exit(1);
126
+ }
127
+ const result = await gate.check(cmd);
128
+ if (options.level) {
129
+ const level = (0, gates_1.getCommandRiskLevel)(cmd);
130
+ console.log(level);
131
+ process.exit(level === 'high' ? 1 : 0);
132
+ }
133
+ if (options.json) {
134
+ console.log(JSON.stringify({
135
+ command: cmd,
136
+ passed: result.passed,
137
+ message: result.message,
138
+ }, null, 2));
139
+ }
140
+ else {
141
+ console.log(result.passed ? `\x1b[32m✓\x1b[0m` : `\x1b[31m✗\x1b[0m ${result.message}`);
142
+ }
143
+ process.exit(result.passed ? 0 : 1);
144
+ });
145
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/commands/command.ts"],"names":[],"mappings":"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"}
@@ -14,4 +14,5 @@ export { performance, type PerformanceOptions } from './performance';
14
14
  export { security, auditDetails, type SecurityOptions } from './security';
15
15
  export { contract, validateSchema, type ContractOptions } from './contract';
16
16
  export { review, reviewStatus, type ReviewOptions } from './review';
17
+ export { command, cmd } from './command';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC"}
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;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * CLI 命令导出
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.reviewStatus = exports.review = exports.validateSchema = exports.contract = exports.auditDetails = exports.security = exports.performance = exports.listAcceptanceCriteria = exports.acceptance = exports.listSpecTypes = exports.specValidate = exports.flow = exports.status = exports.report = exports.init = exports.checkCoverage = exports.runPassesGate = exports.createExampleCheckpoint = exports.validate = exports.listLaws = exports.check = void 0;
6
+ exports.cmd = exports.command = exports.reviewStatus = exports.review = exports.validateSchema = exports.contract = exports.auditDetails = exports.security = exports.performance = exports.listAcceptanceCriteria = exports.acceptance = exports.listSpecTypes = exports.specValidate = exports.flow = exports.status = exports.report = exports.init = exports.checkCoverage = exports.runPassesGate = exports.createExampleCheckpoint = exports.validate = exports.listLaws = exports.check = void 0;
7
7
  var check_1 = require("./check");
8
8
  Object.defineProperty(exports, "check", { enumerable: true, get: function () { return check_1.check; } });
9
9
  Object.defineProperty(exports, "listLaws", { enumerable: true, get: function () { return check_1.listLaws; } });
@@ -38,4 +38,7 @@ Object.defineProperty(exports, "validateSchema", { enumerable: true, get: functi
38
38
  var review_1 = require("./review");
39
39
  Object.defineProperty(exports, "review", { enumerable: true, get: function () { return review_1.review; } });
40
40
  Object.defineProperty(exports, "reviewStatus", { enumerable: true, get: function () { return review_1.reviewStatus; } });
41
+ var command_1 = require("./command");
42
+ Object.defineProperty(exports, "command", { enumerable: true, get: function () { return command_1.command; } });
43
+ Object.defineProperty(exports, "cmd", { enumerable: true, get: function () { return command_1.cmd; } });
41
44
  //# sourceMappingURL=index.js.map
@@ -1 +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;AACf,mCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,+BAAgD;AAAvC,4FAAA,IAAI,OAAA;AACb,+BAA+E;AAAtE,oGAAA,YAAY,OAAA;AAAE,qGAAA,aAAa,OAAA;AACpC,2CAA0F;AAAjF,wGAAA,UAAU,OAAA;AAAE,oHAAA,sBAAsB,OAAA;AAC3C,6CAAqE;AAA5D,0GAAA,WAAW,OAAA;AACpB,uCAA0E;AAAjE,oGAAA,QAAQ,OAAA;AAAE,wGAAA,YAAY,OAAA;AAC/B,uCAA4E;AAAnE,oGAAA,QAAQ,OAAA;AAAE,0GAAA,cAAc,OAAA;AACjC,mCAAoE;AAA3D,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA"}
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;AACf,mCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,+BAAgD;AAAvC,4FAAA,IAAI,OAAA;AACb,+BAA+E;AAAtE,oGAAA,YAAY,OAAA;AAAE,qGAAA,aAAa,OAAA;AACpC,2CAA0F;AAAjF,wGAAA,UAAU,OAAA;AAAE,oHAAA,sBAAsB,OAAA;AAC3C,6CAAqE;AAA5D,0GAAA,WAAW,OAAA;AACpB,uCAA0E;AAAjE,oGAAA,QAAQ,OAAA;AAAE,wGAAA,YAAY,OAAA;AAC/B,uCAA4E;AAAnE,oGAAA,QAAQ,OAAA;AAAE,0GAAA,cAAc,OAAA;AACjC,mCAAoE;AAA3D,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC7B,qCAAyC;AAAhC,kGAAA,OAAO,OAAA;AAAE,8FAAA,GAAG,OAAA"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * 命令门禁 - Command Gate
3
+ * SEC-006: 命令黑名单
4
+ *
5
+ * 检查命令是否安全,防止执行危险操作
6
+ */
7
+ import type { GateResult, CommandGateConfig, CommandBlacklistRule } from './types';
8
+ /**
9
+ * 黑名单级别
10
+ */
11
+ export type BlacklistLevel = 'block' | 'warn' | 'audit';
12
+ /**
13
+ * 默认黑名单规则
14
+ *
15
+ * 级别说明:
16
+ * - block: 禁止执行,直接拒绝
17
+ * - warn: 允许执行,但记录警告
18
+ * - audit: 允许执行,但记录审计日志
19
+ */
20
+ export declare const DEFAULT_COMMAND_BLACKLIST: CommandBlacklistRule[];
21
+ /**
22
+ * 命令门禁
23
+ */
24
+ export declare class CommandGate {
25
+ private config;
26
+ private blacklist;
27
+ constructor(config?: Partial<CommandGateConfig>);
28
+ /**
29
+ * 检查命令
30
+ */
31
+ check(command: string): Promise<GateResult>;
32
+ /**
33
+ * 检查黑名单
34
+ */
35
+ private checkBlacklist;
36
+ /**
37
+ * 格式化成功消息
38
+ */
39
+ private formatSuccessMessage;
40
+ /**
41
+ * 格式化阻止消息
42
+ */
43
+ private formatBlockMessage;
44
+ /**
45
+ * 快速检查(不生成完整 GateResult)
46
+ */
47
+ isAllowed(command: string): boolean;
48
+ /**
49
+ * 获取命令风险等级
50
+ */
51
+ getRiskLevel(command: string): 'high' | 'medium' | 'low';
52
+ /**
53
+ * 获取黑名单规则
54
+ */
55
+ getBlacklist(): CommandBlacklistRule[];
56
+ /**
57
+ * 添加自定义规则
58
+ */
59
+ addRule(rule: CommandBlacklistRule): void;
60
+ /**
61
+ * 移除规则
62
+ */
63
+ removeRule(id: string): boolean;
64
+ /**
65
+ * 获取配置
66
+ */
67
+ getConfig(): Required<CommandGateConfig>;
68
+ }
69
+ /**
70
+ * 创建命令门禁
71
+ */
72
+ export declare function createCommandGate(config?: Partial<CommandGateConfig>): CommandGate;
73
+ /**
74
+ * 获取默认命令门禁
75
+ */
76
+ export declare function getCommandGate(): CommandGate;
77
+ /**
78
+ * 快速检查命令是否允许
79
+ */
80
+ export declare function isCommandAllowed(command: string): boolean;
81
+ /**
82
+ * 快速获取命令风险等级
83
+ */
84
+ export declare function getCommandRiskLevel(command: string): 'high' | 'medium' | 'low';
85
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/gates/command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEnF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAExD;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,EA0K3D,CAAC;AAEF;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,SAAS,CAAyB;gBAE9B,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAenD;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgCjD;;OAEG;IACH,OAAO,CAAC,cAAc;IAuCtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAgBnC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;IAoBxD;;OAEG;IACH,YAAY,IAAI,oBAAoB,EAAE;IAItC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAIzC;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS/B;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,iBAAiB,CAAC;CAGzC;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAElF;AAOD;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAE9E"}
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+ /**
3
+ * 命令门禁 - Command Gate
4
+ * SEC-006: 命令黑名单
5
+ *
6
+ * 检查命令是否安全,防止执行危险操作
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CommandGate = exports.DEFAULT_COMMAND_BLACKLIST = void 0;
10
+ exports.createCommandGate = createCommandGate;
11
+ exports.getCommandGate = getCommandGate;
12
+ exports.isCommandAllowed = isCommandAllowed;
13
+ exports.getCommandRiskLevel = getCommandRiskLevel;
14
+ /**
15
+ * 默认黑名单规则
16
+ *
17
+ * 级别说明:
18
+ * - block: 禁止执行,直接拒绝
19
+ * - warn: 允许执行,但记录警告
20
+ * - audit: 允许执行,但记录审计日志
21
+ */
22
+ exports.DEFAULT_COMMAND_BLACKLIST = [
23
+ // ========== 系统级破坏命令 ==========
24
+ {
25
+ id: 'rm-rf-root',
26
+ pattern: /\brm\s+(-[rf]+\s+)*\/\s*$/i,
27
+ level: 'block',
28
+ message: '禁止删除根目录',
29
+ category: 'system',
30
+ },
31
+ {
32
+ id: 'rm-rf-star',
33
+ pattern: /\brm\s+(-[rf]+\s+)*\*+/i,
34
+ level: 'block',
35
+ message: '禁止通配符删除',
36
+ category: 'system',
37
+ },
38
+ {
39
+ id: 'rm-rf-home',
40
+ pattern: /\brm\s+(-[rf]+\s+)*(~|\/home)/i,
41
+ level: 'block',
42
+ message: '禁止删除用户目录',
43
+ category: 'system',
44
+ },
45
+ {
46
+ id: 'rm-rf-project',
47
+ pattern: /\brm\s+(-[rf]+\s+)*\.\s*$/i,
48
+ level: 'block',
49
+ message: '禁止删除当前目录',
50
+ category: 'system',
51
+ },
52
+ // ========== 权限相关 ==========
53
+ {
54
+ id: 'chmod-777',
55
+ pattern: /\bchmod\s+(-R\s+)?777\b/i,
56
+ level: 'block',
57
+ message: '禁止设置 777 权限',
58
+ category: 'permission',
59
+ },
60
+ {
61
+ id: 'chown-root',
62
+ pattern: /\bchown\s+(-R\s+)?root\b/i,
63
+ level: 'warn',
64
+ message: '谨慎修改所有者为 root',
65
+ category: 'permission',
66
+ },
67
+ // ========== 数据库危险命令 ==========
68
+ {
69
+ id: 'drop-database',
70
+ pattern: /\bDROP\s+(DATABASE|SCHEMA)\b/i,
71
+ level: 'block',
72
+ message: '禁止删除数据库/Schema',
73
+ category: 'database',
74
+ },
75
+ {
76
+ id: 'drop-table',
77
+ pattern: /\bDROP\s+TABLE\b/i,
78
+ level: 'warn',
79
+ message: '删除表操作需要确认',
80
+ category: 'database',
81
+ },
82
+ {
83
+ id: 'truncate-table',
84
+ pattern: /\bTRUNCATE\s+TABLE?\b/i,
85
+ level: 'warn',
86
+ message: '清空表操作需要确认',
87
+ category: 'database',
88
+ },
89
+ {
90
+ id: 'delete-all',
91
+ pattern: /\bDELETE\s+FROM\b(?!.*\bWHERE\b)/i,
92
+ level: 'block',
93
+ message: '禁止无条件删除',
94
+ category: 'database',
95
+ },
96
+ // ========== 网络相关 ==========
97
+ {
98
+ id: 'iptables-flush',
99
+ pattern: /\biptables\s+(-F|--flush)\b/i,
100
+ level: 'block',
101
+ message: '禁止清空防火墙规则',
102
+ category: 'network',
103
+ },
104
+ {
105
+ id: 'curl-bash',
106
+ pattern: /\bcurl\b.*\|\s*(sudo\s+)?bash\b/i,
107
+ level: 'block',
108
+ message: '禁止从网络直接执行脚本',
109
+ category: 'network',
110
+ },
111
+ {
112
+ id: 'wget-bash',
113
+ pattern: /\bwget\b.*\|\s*(sudo\s+)?bash\b/i,
114
+ level: 'block',
115
+ message: '禁止从网络直接执行脚本',
116
+ category: 'network',
117
+ },
118
+ // ========== 特权命令 ==========
119
+ {
120
+ id: 'sudo-rm',
121
+ pattern: /\bsudo\s+.*\brm\s+/i,
122
+ level: 'block',
123
+ message: '禁止 sudo rm',
124
+ category: 'privilege',
125
+ },
126
+ {
127
+ id: 'sudo-dd',
128
+ pattern: /\bsudo\s+.*\bdd\b/i,
129
+ level: 'block',
130
+ message: '禁止 sudo dd',
131
+ category: 'privilege',
132
+ },
133
+ {
134
+ id: 'sudo-fdisk',
135
+ pattern: /\bsudo\s+.*\b(fdisk|parted)\b/i,
136
+ level: 'block',
137
+ message: '禁止 sudo 磁盘分区操作',
138
+ category: 'privilege',
139
+ },
140
+ // ========== 敏感文件 ==========
141
+ {
142
+ id: 'read-ssh-key',
143
+ pattern: /\bcat\s+.*\/\.ssh\/(id_rsa|id_ed25519)/i,
144
+ level: 'audit',
145
+ message: '读取 SSH 私钥',
146
+ category: 'sensitive',
147
+ },
148
+ {
149
+ id: 'read-env',
150
+ pattern: /\bcat\s+.*\.env\b/i,
151
+ level: 'audit',
152
+ message: '读取 .env 文件',
153
+ category: 'sensitive',
154
+ },
155
+ // ========== 进程管理 ==========
156
+ {
157
+ id: 'kill-all',
158
+ pattern: /\bkill\s+(-9\s+)?-1\b/i,
159
+ level: 'block',
160
+ message: '禁止杀死所有进程',
161
+ category: 'process',
162
+ },
163
+ {
164
+ id: 'killall',
165
+ pattern: /\bkillall\s+/i,
166
+ level: 'warn',
167
+ message: '批量杀死进程需要确认',
168
+ category: 'process',
169
+ },
170
+ // ========== 包管理 ==========
171
+ {
172
+ id: 'npm-uninstall-global',
173
+ pattern: /\bnpm\s+(uninstall|remove)\s+(-g|--global)\b/i,
174
+ level: 'warn',
175
+ message: '卸载全局包需要确认',
176
+ category: 'package',
177
+ },
178
+ {
179
+ id: 'pip-uninstall',
180
+ pattern: /\bpip\s+uninstall\s+/i,
181
+ level: 'warn',
182
+ message: '卸载 Python 包需要确认',
183
+ category: 'package',
184
+ },
185
+ ];
186
+ /**
187
+ * 命令门禁
188
+ */
189
+ class CommandGate {
190
+ config;
191
+ blacklist;
192
+ constructor(config = {}) {
193
+ this.config = {
194
+ enabled: config.enabled ?? true,
195
+ strict: config.strict ?? false,
196
+ customBlacklist: config.customBlacklist ?? [],
197
+ ignoreCategories: config.ignoreCategories ?? [],
198
+ };
199
+ // 合并默认黑名单和自定义黑名单
200
+ this.blacklist = [
201
+ ...exports.DEFAULT_COMMAND_BLACKLIST,
202
+ ...this.config.customBlacklist,
203
+ ];
204
+ }
205
+ /**
206
+ * 检查命令
207
+ */
208
+ async check(command) {
209
+ const startTime = Date.now();
210
+ if (!this.config.enabled) {
211
+ return {
212
+ gate: 'command',
213
+ passed: true,
214
+ message: '命令门禁已禁用',
215
+ timestamp: new Date().toISOString(),
216
+ duration: Date.now() - startTime,
217
+ };
218
+ }
219
+ const result = this.checkBlacklist(command);
220
+ return {
221
+ gate: 'command',
222
+ passed: result.allowed,
223
+ message: result.allowed
224
+ ? this.formatSuccessMessage(result)
225
+ : this.formatBlockMessage(result),
226
+ details: {
227
+ blocked: result.blocked,
228
+ warnings: result.warnings,
229
+ audits: result.audits,
230
+ command,
231
+ },
232
+ timestamp: new Date().toISOString(),
233
+ duration: Date.now() - startTime,
234
+ };
235
+ }
236
+ /**
237
+ * 检查黑名单
238
+ */
239
+ checkBlacklist(command) {
240
+ const blocked = [];
241
+ const warnings = [];
242
+ const audits = [];
243
+ for (const rule of this.blacklist) {
244
+ // 跳过忽略的类别
245
+ if (this.config.ignoreCategories.includes(rule.category)) {
246
+ continue;
247
+ }
248
+ if (rule.pattern.test(command)) {
249
+ switch (rule.level) {
250
+ case 'block':
251
+ blocked.push(rule);
252
+ break;
253
+ case 'warn':
254
+ warnings.push(rule);
255
+ break;
256
+ case 'audit':
257
+ audits.push(rule);
258
+ break;
259
+ }
260
+ }
261
+ }
262
+ return {
263
+ allowed: blocked.length === 0,
264
+ blocked,
265
+ warnings,
266
+ audits,
267
+ };
268
+ }
269
+ /**
270
+ * 格式化成功消息
271
+ */
272
+ formatSuccessMessage(result) {
273
+ const parts = ['命令检查通过'];
274
+ if (result.warnings.length > 0) {
275
+ parts.push(`,${result.warnings.length} 个警告`);
276
+ }
277
+ if (result.audits.length > 0) {
278
+ parts.push(`,${result.audits.length} 个审计记录`);
279
+ }
280
+ return parts.join('');
281
+ }
282
+ /**
283
+ * 格式化阻止消息
284
+ */
285
+ formatBlockMessage(result) {
286
+ const lines = [];
287
+ lines.push('命令被禁止执行:');
288
+ for (const rule of result.blocked) {
289
+ lines.push(` - [${rule.id}] ${rule.message} (${rule.category})`);
290
+ }
291
+ return lines.join('\n');
292
+ }
293
+ /**
294
+ * 快速检查(不生成完整 GateResult)
295
+ */
296
+ isAllowed(command) {
297
+ if (!this.config.enabled)
298
+ return true;
299
+ for (const rule of this.blacklist) {
300
+ if (this.config.ignoreCategories.includes(rule.category)) {
301
+ continue;
302
+ }
303
+ if (rule.level === 'block' && rule.pattern.test(command)) {
304
+ return false;
305
+ }
306
+ }
307
+ return true;
308
+ }
309
+ /**
310
+ * 获取命令风险等级
311
+ */
312
+ getRiskLevel(command) {
313
+ if (!this.config.enabled)
314
+ return 'low';
315
+ for (const rule of this.blacklist) {
316
+ if (this.config.ignoreCategories.includes(rule.category)) {
317
+ continue;
318
+ }
319
+ if (rule.pattern.test(command)) {
320
+ switch (rule.level) {
321
+ case 'block': return 'high';
322
+ case 'warn': return 'medium';
323
+ case 'audit': return 'low';
324
+ }
325
+ }
326
+ }
327
+ return 'low';
328
+ }
329
+ /**
330
+ * 获取黑名单规则
331
+ */
332
+ getBlacklist() {
333
+ return [...this.blacklist];
334
+ }
335
+ /**
336
+ * 添加自定义规则
337
+ */
338
+ addRule(rule) {
339
+ this.blacklist.push(rule);
340
+ }
341
+ /**
342
+ * 移除规则
343
+ */
344
+ removeRule(id) {
345
+ const index = this.blacklist.findIndex(r => r.id === id);
346
+ if (index >= 0) {
347
+ this.blacklist.splice(index, 1);
348
+ return true;
349
+ }
350
+ return false;
351
+ }
352
+ /**
353
+ * 获取配置
354
+ */
355
+ getConfig() {
356
+ return { ...this.config };
357
+ }
358
+ }
359
+ exports.CommandGate = CommandGate;
360
+ // ========== 便捷函数 ==========
361
+ /**
362
+ * 创建命令门禁
363
+ */
364
+ function createCommandGate(config) {
365
+ return new CommandGate(config);
366
+ }
367
+ /**
368
+ * 默认实例
369
+ */
370
+ let defaultCommandGate = null;
371
+ /**
372
+ * 获取默认命令门禁
373
+ */
374
+ function getCommandGate() {
375
+ if (!defaultCommandGate) {
376
+ defaultCommandGate = new CommandGate();
377
+ }
378
+ return defaultCommandGate;
379
+ }
380
+ /**
381
+ * 快速检查命令是否允许
382
+ */
383
+ function isCommandAllowed(command) {
384
+ return getCommandGate().isAllowed(command);
385
+ }
386
+ /**
387
+ * 快速获取命令风险等级
388
+ */
389
+ function getCommandRiskLevel(command) {
390
+ return getCommandGate().getRiskLevel(command);
391
+ }
392
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/gates/command.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,13 @@
3
3
  *
4
4
  * 统一导出所有门禁类型
5
5
  */
6
- export type { GateResult, GateContext, PerformanceThresholds, ReviewGateConfig, SecurityGateConfig, PerformanceGateConfig, ContractGateConfig, SpecAcceptanceGateConfig, AcceptanceGateContext, AcceptanceCriteria, } from './types';
6
+ export type { GateResult, GateContext, PerformanceThresholds, ReviewGateConfig, SecurityGateConfig, PerformanceGateConfig, ContractGateConfig, SpecAcceptanceGateConfig, AcceptanceGateContext, AcceptanceCriteria, CommandBlacklistRule, CommandGateConfig, } from './types';
7
7
  export { ReviewGate } from './review';
8
8
  export { SecurityGate } from './security';
9
9
  export { PerformanceGate } from './performance';
10
10
  export { ContractGate } from './contract';
11
11
  export { SpecAcceptanceGate } from './acceptance';
12
+ export { CommandGate, createCommandGate, getCommandGate, isCommandAllowed, getCommandRiskLevel, DEFAULT_COMMAND_BLACKLIST } from './command';
12
13
  import { ReviewGate } from './review';
13
14
  import { SecurityGate } from './security';
14
15
  import { PerformanceGate } from './performance';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAE/E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAErF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAE9F;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAErF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,kBAAkB,CAEvG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAG7I,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAE/E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAErF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAE9F;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAErF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,kBAAkB,CAEvG"}
@@ -5,7 +5,7 @@
5
5
  * 统一导出所有门禁类型
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.SpecAcceptanceGate = exports.ContractGate = exports.PerformanceGate = exports.SecurityGate = exports.ReviewGate = void 0;
8
+ exports.DEFAULT_COMMAND_BLACKLIST = exports.getCommandRiskLevel = exports.isCommandAllowed = exports.getCommandGate = exports.createCommandGate = exports.CommandGate = exports.SpecAcceptanceGate = exports.ContractGate = exports.PerformanceGate = exports.SecurityGate = exports.ReviewGate = void 0;
9
9
  exports.createReviewGate = createReviewGate;
10
10
  exports.createSecurityGate = createSecurityGate;
11
11
  exports.createPerformanceGate = createPerformanceGate;
@@ -22,6 +22,13 @@ var contract_1 = require("./contract");
22
22
  Object.defineProperty(exports, "ContractGate", { enumerable: true, get: function () { return contract_1.ContractGate; } });
23
23
  var acceptance_1 = require("./acceptance");
24
24
  Object.defineProperty(exports, "SpecAcceptanceGate", { enumerable: true, get: function () { return acceptance_1.SpecAcceptanceGate; } });
25
+ var command_1 = require("./command");
26
+ Object.defineProperty(exports, "CommandGate", { enumerable: true, get: function () { return command_1.CommandGate; } });
27
+ Object.defineProperty(exports, "createCommandGate", { enumerable: true, get: function () { return command_1.createCommandGate; } });
28
+ Object.defineProperty(exports, "getCommandGate", { enumerable: true, get: function () { return command_1.getCommandGate; } });
29
+ Object.defineProperty(exports, "isCommandAllowed", { enumerable: true, get: function () { return command_1.isCommandAllowed; } });
30
+ Object.defineProperty(exports, "getCommandRiskLevel", { enumerable: true, get: function () { return command_1.getCommandRiskLevel; } });
31
+ Object.defineProperty(exports, "DEFAULT_COMMAND_BLACKLIST", { enumerable: true, get: function () { return command_1.DEFAULT_COMMAND_BLACKLIST; } });
25
32
  // 便捷工厂函数
26
33
  const review_2 = require("./review");
27
34
  const security_2 = require("./security");
@@ -43,4 +50,5 @@ function createContractGate(config) {
43
50
  function createSpecAcceptanceGate(config) {
44
51
  return new acceptance_2.SpecAcceptanceGate(config);
45
52
  }
53
+ // CommandGate 已在 command.ts 中导出 createCommandGate
46
54
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gates/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAqCH,4CAEC;AAED,gDAEC;AAED,sDAEC;AAED,gDAEC;AAED,4DAEC;AAvCD,QAAQ;AACR,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,6CAAgD;AAAvC,8GAAA,eAAe,OAAA;AACxB,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,2CAAkD;AAAzC,gHAAA,kBAAkB,OAAA;AAE3B,SAAS;AACT,qCAAsC;AACtC,yCAA0C;AAC1C,+CAAgD;AAChD,yCAA0C;AAC1C,6CAAkD;AASlD,SAAgB,gBAAgB,CAAC,MAAkC;IACjE,OAAO,IAAI,mBAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAoC;IACrE,OAAO,IAAI,uBAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAuC;IAC3E,OAAO,IAAI,6BAAe,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAoC;IACrE,OAAO,IAAI,uBAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,wBAAwB,CAAC,MAA0C;IACjF,OAAO,IAAI,+BAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gates/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA0CH,4CAEC;AAED,gDAEC;AAED,sDAEC;AAED,gDAEC;AAED,4DAEC;AA1CD,QAAQ;AACR,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,6CAAgD;AAAvC,8GAAA,eAAe,OAAA;AACxB,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,2CAAkD;AAAzC,gHAAA,kBAAkB,OAAA;AAC3B,qCAA6I;AAApI,sGAAA,WAAW,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAAE,yGAAA,cAAc,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,oHAAA,yBAAyB,OAAA;AAEzH,SAAS;AACT,qCAAsC;AACtC,yCAA0C;AAC1C,+CAAgD;AAChD,yCAA0C;AAC1C,6CAAkD;AAWlD,SAAgB,gBAAgB,CAAC,MAAkC;IACjE,OAAO,IAAI,mBAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAoC;IACrE,OAAO,IAAI,uBAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAuC;IAC3E,OAAO,IAAI,6BAAe,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAoC;IACrE,OAAO,IAAI,uBAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,wBAAwB,CAAC,MAA0C;IACjF,OAAO,IAAI,+BAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,kDAAkD"}
@@ -112,4 +112,27 @@ export interface AcceptanceCriteria {
112
112
  checked?: boolean;
113
113
  notes?: string;
114
114
  }
115
+ /**
116
+ * 命令黑名单规则
117
+ */
118
+ export interface CommandBlacklistRule {
119
+ id: string;
120
+ pattern: RegExp;
121
+ level: 'block' | 'warn' | 'audit';
122
+ message: string;
123
+ category: string;
124
+ }
125
+ /**
126
+ * 命令门禁配置
127
+ */
128
+ export interface CommandGateConfig {
129
+ /** 是否启用 */
130
+ enabled?: boolean;
131
+ /** 严格模式(warn 也阻止) */
132
+ strict?: boolean;
133
+ /** 自定义黑名单规则 */
134
+ customBlacklist?: CommandBlacklistRule[];
135
+ /** 忽略的类别 */
136
+ ignoreCategories?: string[];
137
+ }
115
138
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gates/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gates/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dommaker/harness",
3
- "version": "0.8.0",
3
+ "version": "0.8.3",
4
4
  "description": "通用工程约束框架 - 铁律系统、检查点验证、测试门控、拦截器",
5
5
  "keywords": [
6
6
  "harness",