@hddz/plugin-harness 0.1.18 → 0.2.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.

Potentially problematic release.


This version of @hddz/plugin-harness might be problematic. Click here for more details.

@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ // src/index.ts - Harness Plugin 主入口
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HarnessPlugin = void 0;
5
+ exports.createPlugin = createPlugin;
6
+ const harness_1 = require("@openclaw/harness");
7
+ const DEFAULT_CONFIG = {
8
+ autoValidateConfig: true,
9
+ autoAuditSkill: true,
10
+ loopDetectionEnabled: true,
11
+ protectedFiles: [
12
+ 'SOUL.md',
13
+ 'USER.md',
14
+ 'AGENTS.md',
15
+ 'TOOLS.md',
16
+ 'MEMORY.md',
17
+ 'openclaw.json',
18
+ ],
19
+ logsDir: 'logs/harness', // 相对 workspace 的路径
20
+ };
21
+ class HarnessPlugin {
22
+ name = 'harness';
23
+ version = '0.1.0';
24
+ config;
25
+ workspacePath;
26
+ configValidator;
27
+ skillAuditor;
28
+ loopDetector;
29
+ configLogger;
30
+ operationLogger;
31
+ traceLogger;
32
+ constructor(workspacePath, config = {}) {
33
+ this.workspacePath = workspacePath;
34
+ this.config = { ...DEFAULT_CONFIG, ...config };
35
+ // 初始化工具
36
+ this.configValidator = new harness_1.ConfigValidator(workspacePath);
37
+ this.skillAuditor = new harness_1.SkillAuditor(workspacePath);
38
+ this.loopDetector = new harness_1.LoopDetector(workspacePath);
39
+ this.configLogger = new harness_1.ConfigLogger(workspacePath);
40
+ this.operationLogger = new harness_1.OperationLogger(workspacePath);
41
+ this.traceLogger = new harness_1.TraceLogger(workspacePath);
42
+ }
43
+ /**
44
+ * Hook: 配置修改前验证
45
+ */
46
+ async onConfigChange(newConfig, sessionId) {
47
+ if (!this.config.autoValidateConfig) {
48
+ return { valid: true };
49
+ }
50
+ console.log('🔍 [Harness] 验证配置变更...');
51
+ const result = this.configValidator.validateContent(newConfig);
52
+ if (!result.valid) {
53
+ console.error('❌ [Harness] 配置验证失败:');
54
+ result.errors.forEach(e => console.error(` - ${e}`));
55
+ // 记录配置变更失败
56
+ this.configLogger.log({
57
+ sessionId: sessionId || 'unknown',
58
+ modifier: 'AI Agent',
59
+ file: 'openclaw.json',
60
+ reason: '配置修改(验证失败)',
61
+ verified: false,
62
+ gatewayRestarted: false,
63
+ changes: [],
64
+ });
65
+ return { valid: false, errors: result.errors };
66
+ }
67
+ console.log('✅ [Harness] 配置验证通过');
68
+ // 记录配置变更成功
69
+ this.configLogger.log({
70
+ sessionId: sessionId || 'unknown',
71
+ modifier: 'AI Agent',
72
+ file: 'openclaw.json',
73
+ reason: '配置修改',
74
+ verified: true,
75
+ gatewayRestarted: true,
76
+ changes: [],
77
+ });
78
+ return { valid: true };
79
+ }
80
+ /**
81
+ * 公开方法:记录配置变更
82
+ */
83
+ logConfigChange(entry) {
84
+ this.configLogger.log(entry);
85
+ }
86
+ /**
87
+ * Hook: Skill 安装前审核
88
+ */
89
+ async onSkillInstall(skillPath, source, sessionId) {
90
+ if (!this.config.autoAuditSkill) {
91
+ return { passed: true };
92
+ }
93
+ console.log(`🔍 [Harness] 审核 Skill: ${skillPath}`);
94
+ const result = await this.skillAuditor.audit(skillPath, source || 'unknown');
95
+ if (!result.passed) {
96
+ console.error(`❌ [Harness] Skill 审核未通过:${result.riskLevel}`);
97
+ result.warnings.forEach(w => console.error(` - ${w.message}`));
98
+ return { passed: false, warnings: result.warnings };
99
+ }
100
+ console.log(`✅ [Harness] Skill 审核通过:${result.riskLevel}`);
101
+ return { passed: true };
102
+ }
103
+ /**
104
+ * Hook: 文件编辑时循环检测
105
+ */
106
+ onFileEdit(filePath, sessionId) {
107
+ if (!this.config.loopDetectionEnabled) {
108
+ return { allowed: true };
109
+ }
110
+ const relativePath = filePath.split('/').pop() || filePath;
111
+ // 检查是否是保护文件
112
+ if (this.config.protectedFiles.some(f => filePath.endsWith(f))) {
113
+ console.warn(`⚠️ [Harness] 保护文件被修改:${filePath}`);
114
+ // 记录保护文件修改
115
+ this.operationLogger.log({
116
+ sessionId: sessionId || 'unknown',
117
+ modifier: 'AI Agent',
118
+ type: 'file_edit',
119
+ description: `保护文件修改:${filePath}`,
120
+ file: filePath,
121
+ result: 'success',
122
+ });
123
+ }
124
+ // 循环检测
125
+ const warning = this.loopDetector.onFileEdit(filePath);
126
+ if (warning) {
127
+ console.warn(`⚠️ [Harness] 循环编辑警告:${warning}`);
128
+ return { allowed: true, warning }; // 允许但警告
129
+ }
130
+ return { allowed: true };
131
+ }
132
+ /**
133
+ * Hook: 文件删除前检查
134
+ */
135
+ onFileDelete(filePath, sessionId) {
136
+ const relativePath = filePath.split('/').pop() || filePath;
137
+ // 检查是否是保护文件
138
+ if (this.config.protectedFiles.some(f => filePath.endsWith(f))) {
139
+ console.error(`🚨 [Harness] 禁止删除保护文件:${filePath}`);
140
+ this.operationLogger.log({
141
+ sessionId: sessionId || 'unknown',
142
+ modifier: 'AI Agent',
143
+ type: 'file_delete',
144
+ description: `尝试删除保护文件:${filePath}`,
145
+ file: filePath,
146
+ result: 'error',
147
+ });
148
+ return { allowed: false, reason: '保护文件禁止删除' };
149
+ }
150
+ this.operationLogger.log({
151
+ sessionId: sessionId || 'unknown',
152
+ modifier: 'AI Agent',
153
+ type: 'file_delete',
154
+ description: `删除文件:${filePath}`,
155
+ file: filePath,
156
+ result: 'success',
157
+ });
158
+ return { allowed: true };
159
+ }
160
+ /**
161
+ * Hook: 系统命令执行前
162
+ */
163
+ onExecCommand(command, sessionId) {
164
+ this.operationLogger.log({
165
+ sessionId: sessionId || 'unknown',
166
+ modifier: 'AI Agent',
167
+ type: 'system_command',
168
+ description: `执行命令:${command}`,
169
+ command,
170
+ result: 'pending',
171
+ });
172
+ }
173
+ /**
174
+ * 获取插件状态
175
+ */
176
+ getStatus() {
177
+ return {
178
+ name: this.name,
179
+ version: this.version,
180
+ enabled: true,
181
+ config: this.config,
182
+ loopStats: this.loopDetector.getStats(),
183
+ };
184
+ }
185
+ }
186
+ exports.HarnessPlugin = HarnessPlugin;
187
+ // OpenClaw 插件工厂函数
188
+ function createPlugin(workspacePath, config) {
189
+ return new HarnessPlugin(workspacePath, config);
190
+ }
191
+ exports.default = HarnessPlugin;
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9DQUFvQzs7O0FBMk9wQyxvQ0FFQztBQTNPRCwrQ0FBNEg7QUFVNUgsTUFBTSxjQUFjLEdBQXdCO0lBQzFDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsY0FBYyxFQUFFLElBQUk7SUFDcEIsb0JBQW9CLEVBQUUsSUFBSTtJQUMxQixjQUFjLEVBQUU7UUFDZCxTQUFTO1FBQ1QsU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsV0FBVztRQUNYLGVBQWU7S0FDaEI7SUFDRCxPQUFPLEVBQUUsY0FBYyxFQUFHLG1CQUFtQjtDQUM5QyxDQUFDO0FBRUYsTUFBYSxhQUFhO0lBQ3hCLElBQUksR0FBRyxTQUFTLENBQUM7SUFDakIsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUVWLE1BQU0sQ0FBc0I7SUFDNUIsYUFBYSxDQUFTO0lBQ3RCLGVBQWUsQ0FBa0I7SUFDakMsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0IsZUFBZSxDQUFrQjtJQUNqQyxXQUFXLENBQWM7SUFFakMsWUFBWSxhQUFxQixFQUFFLFNBQXVDLEVBQUU7UUFDMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFL0MsUUFBUTtRQUNSLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSx5QkFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxzQkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxzQkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFB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QVEsRUFBRSxVQUFVO1lBQ3BCLElBQUksRUFBRSxhQUFhO1lBQ25CLFdBQVcsRUFBRSxRQUFRLFFBQVEsRUFBRTtZQUMvQixJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLE9BQWUsRUFBRSxTQUFrQjtRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztZQUN2QixTQUFTLEVBQUUsU0FBUyxJQUFJLFNBQVM7WUFDakMsUUFBUSxFQUFFLFVBQVU7WUFDcEIsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixXQUFXLEVBQUUsUUFBUSxPQUFPLEVBQUU7WUFDOUIsT0FBTztZQUNQLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtTQUN4QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBN01ELHNDQTZNQztBQUVELGtCQUFrQjtBQUNsQixTQUFnQixZQUFZLENBQUMsYUFBcUIsRUFBRSxNQUFXO0lBQzdELE9BQU8sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRCxrQkFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvaW5kZXgudHMgLSBIYXJuZXNzIFBsdWdpbiDkuLvlhaXlj6NcblxuaW1wb3J0IHsgQ29uZmlnVmFsaWRhdG9yLCBTa2lsbEF1ZGl0b3IsIExvb3BEZXRlY3RvciwgQ29uZmlnTG9nZ2VyLCBPcGVyYXRpb25Mb2dnZXIsIFRyYWNlTG9nZ2VyIH0gZnJvbSAnQG9wZW5jbGF3L2hhcm5lc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhcm5lc3NQbHVnaW5Db25maWcge1xuICBhdXRvVmFsaWRhdGVDb25maWc6IGJvb2xlYW47XG4gIGF1dG9BdWRpdFNraWxsOiBib29sZWFuO1xuICBsb29wRGV0ZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkRmlsZXM6IHN0cmluZ1tdO1xuICBsb2dzRGlyOiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRfQ09ORklHOiBIYXJuZXNzUGx1Z2luQ29uZmlnID0ge1xuICBhdXRvVmFsaWRhdGVDb25maWc6IHRydWUsXG4gIGF1dG9BdWRpdFNraWxsOiB0cnVlLFxuICBsb29wRGV0ZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgcHJvdGVjdGVkRmlsZXM6IFtcbiAgICAnU09VTC5tZCcsXG4gICAgJ1VTRVIubWQnLFxuICAgICdBR0VOVFMubWQnLFxuICAgICdUT09MUy5tZCcsXG4gICAgJ01FTU9SWS5tZCcsXG4gICAgJ29wZW5jbGF3Lmpzb24nLFxuICBdLFxuICBsb2dzRGlyOiAnbG9ncy9oYXJuZXNzJywgIC8vIOebuOWvuSB3b3Jrc3BhY2Ug55qE6Lev5b6EXG59O1xuXG5leHBvcnQgY2xhc3MgSGFybmVzc1BsdWdpbiB7XG4gIG5hbWUgPSAnaGFybmVzcyc7XG4gIHZlcnNpb24gPSAnMC4xLjAnO1xuICBcbiAgcHJpdmF0ZSBjb25maWc6IEhhcm5lc3NQbHVnaW5Db25maWc7XG4gIHByaXZhdGUgd29ya3NwYWNlUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yO1xuICBwcml2YXRlIHNraWxsQXVkaXRvcjogU2tpbGxBdWRpdG9yO1xuICBwcml2YXRlIGxvb3BEZXRlY3RvcjogTG9vcERldGVjdG9yO1xuICBwcml2YXRlIGNvbmZpZ0xvZ2dlcjogQ29uZmlnTG9nZ2VyO1xuICBwcml2YXRlIG9wZXJhdGlvbkxvZ2dlcjogT3BlcmF0aW9uTG9nZ2VyO1xuICBwcml2YXRlIHRyYWNlTG9nZ2VyOiBUcmFjZUxvZ2dlcjtcblxuICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VQYXRoOiBzdHJpbmcsIGNvbmZpZzogUGFydGlhbDxIYXJuZXNzUGx1Z2luQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy53b3Jrc3BhY2VQYXRoID0gd29ya3NwYWNlUGF0aDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIFxuICAgIC8vIOWIneWni+WMluW3peWFt1xuICAgIHRoaXMuY29uZmlnVmFsaWRhdG9yID0gbmV3IENvbmZpZ1ZhbGlkYXRvcih3b3Jrc3BhY2VQYXRoKTtcbiAgICB0aGlzLnNraWxsQXVkaXRvciA9IG5ldyBTa2lsbEF1ZGl0b3Iod29ya3NwYWNlUGF0aCk7XG4gICAgdGhpcy5sb29wRGV0ZWN0b3IgPSBuZXcgTG9vcERldGVjdG9yKHdvcmtzcGFjZVBhdGgpO1xuICAgIHRoaXMuY29uZmlnTG9nZ2VyID0gbmV3IENvbmZpZ0xvZ2dlcih3b3Jrc3BhY2VQYXRoKTtcbiAgICB0aGlzLm9wZXJhdGlvbkxvZ2dlciA9IG5ldyBPcGVyYXRpb25Mb2dnZXIod29ya3NwYWNlUGF0aCk7XG4gICAgdGhpcy50cmFjZUxvZ2dlciA9IG5ldyBUcmFjZUxvZ2dlcih3b3Jrc3BhY2VQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rOiDphY3nva7kv67mlLnliY3pqozor4FcbiAgICovXG4gIGFzeW5jIG9uQ29uZmlnQ2hhbmdlKG5ld0NvbmZpZzogYW55LCBzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHsgdmFsaWQ6IGJvb2xlYW47IGVycm9ycz86IHN0cmluZ1tdIH0+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9WYWxpZGF0ZUNvbmZpZykge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygn8J+UjSBbSGFybmVzc10g6aqM6K+B6YWN572u5Y+Y5pu0Li4uJyk7XG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWdWYWxpZGF0b3IudmFsaWRhdGVDb250ZW50KG5ld0NvbmZpZyk7XG4gICAgXG4gICAgaWYgKCFyZXN1bHQudmFsaWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBbSGFybmVzc10g6YWN572u6aqM6K+B5aSx6LSlOicpO1xuICAgICAgcmVzdWx0LmVycm9ycy5mb3JFYWNoKGUgPT4gY29uc29sZS5lcnJvcihgICAgLSAke2V9YCkpO1xuICAgICAgXG4gICAgICAvLyDorrDlvZXphY3nva7lj5jmm7TlpLHotKVcbiAgICAgIHRoaXMuY29uZmlnTG9nZ2VyLmxvZyh7XG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgICAgbW9kaWZpZXI6ICdBSSBBZ2VudCcsXG4gICAgICAgIGZpbGU6ICdvcGVuY2xhdy5qc29uJyxcbiAgICAgICAgcmVhc29uOiAn6YWN572u5L+u5pS577yI6aqM6K+B5aSx6LSl77yJJyxcbiAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICBnYXRld2F5UmVzdGFydGVkOiBmYWxzZSxcbiAgICAgICAgY2hhbmdlczogW10sXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnM6IHJlc3VsdC5lcnJvcnMgfTtcbiAgICB9XG4gICAgXG4gICAgY29uc29sZS5sb2coJ+KchSBbSGFybmVzc10g6YWN572u6aqM6K+B6YCa6L+HJyk7XG4gICAgXG4gICAgLy8g6K6w5b2V6YWN572u5Y+Y5pu05oiQ5YqfXG4gICAgdGhpcy5jb25maWdMb2dnZXIubG9nKHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgZmlsZTogJ29wZW5jbGF3Lmpzb24nLFxuICAgICAgcmVhc29uOiAn6YWN572u5L+u5pS5JyxcbiAgICAgIHZlcmlmaWVkOiB0cnVlLFxuICAgICAgZ2F0ZXdheVJlc3RhcnRlZDogdHJ1ZSxcbiAgICAgIGNoYW5nZXM6IFtdLFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICog5YWs5byA5pa55rOV77ya6K6w5b2V6YWN572u5Y+Y5pu0XG4gICAqL1xuICBsb2dDb25maWdDaGFuZ2UoZW50cnk6IHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICBtb2RpZmllcjogc3RyaW5nO1xuICAgIGZpbGU6IHN0cmluZztcbiAgICByZWFzb246IHN0cmluZztcbiAgICB2ZXJpZmllZDogYm9vbGVhbjtcbiAgICBnYXRld2F5UmVzdGFydGVkOiBib29sZWFuO1xuICAgIGNoYW5nZXM6IGFueVtdO1xuICB9KSB7XG4gICAgdGhpcy5jb25maWdMb2dnZXIubG9nKGVudHJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rOiBTa2lsbCDlronoo4XliY3lrqHmoLhcbiAgICovXG4gIGFzeW5jIG9uU2tpbGxJbnN0YWxsKHNraWxsUGF0aDogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyk6IFByb21pc2U8eyBwYXNzZWQ6IGJvb2xlYW47IHdhcm5pbmdzPzogYW55W10gfT4ge1xuICAgIGlmICghdGhpcy5jb25maWcuYXV0b0F1ZGl0U2tpbGwpIHtcbiAgICAgIHJldHVybiB7IHBhc3NlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGDwn5SNIFtIYXJuZXNzXSDlrqHmoLggU2tpbGw6ICR7c2tpbGxQYXRofWApO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2tpbGxBdWRpdG9yLmF1ZGl0KHNraWxsUGF0aCwgc291cmNlIHx8ICd1bmtub3duJyk7XG4gICAgXG4gICAgaWYgKCFyZXN1bHQucGFzc2VkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGDinYwgW0hhcm5lc3NdIFNraWxsIOWuoeaguOacqumAmui/h++8miR7cmVzdWx0LnJpc2tMZXZlbH1gKTtcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKHcgPT4gY29uc29sZS5lcnJvcihgICAgLSAke3cubWVzc2FnZX1gKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IHBhc3NlZDogZmFsc2UsIHdhcm5pbmdzOiByZXN1bHQud2FybmluZ3MgfTtcbiAgICB9XG4gICAgXG4gICAgY29uc29sZS5sb2coYOKchSBbSGFybmVzc10gU2tpbGwg5a6h5qC46YCa6L+H77yaJHtyZXN1bHQucmlza0xldmVsfWApO1xuICAgIHJldHVybiB7IHBhc3NlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhvb2s6IOaWh+S7tue8lui+keaXtuW+queOr+ajgOa1i1xuICAgKi9cbiAgb25GaWxlRWRpdChmaWxlUGF0aDogc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcpOiB7IGFsbG93ZWQ6IGJvb2xlYW47IHdhcm5pbmc/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5sb29wRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnNwbGl0KCcvJykucG9wKCkgfHwgZmlsZVBhdGg7XG4gICAgXG4gICAgLy8g5qOA5p+l5piv5ZCm5piv5L+d5oqk5paH5Lu2XG4gICAgaWYgKHRoaXMuY29uZmlnLnByb3RlY3RlZEZpbGVzLnNvbWUoZiA9PiBmaWxlUGF0aC5lbmRzV2l0aChmKSkpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqg77iPIFtIYXJuZXNzXSDkv53miqTmlofku7booqvkv67mlLnvvJoke2ZpbGVQYXRofWApO1xuICAgICAgLy8g6K6w5b2V5L+d5oqk5paH5Lu25L+u5pS5XG4gICAgICB0aGlzLm9wZXJhdGlvbkxvZ2dlci5sb2coe1xuICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCB8fCAndW5rbm93bicsXG4gICAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgICB0eXBlOiAnZmlsZV9lZGl0JyxcbiAgICAgICAgZGVzY3JpcHRpb246IGDkv53miqTmlofku7bkv67mlLnvvJoke2ZpbGVQYXRofWAsXG4gICAgICAgIGZpbGU6IGZpbGVQYXRoLFxuICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyDlvqrnjq/mo4DmtYtcbiAgICBjb25zdCB3YXJuaW5nID0gdGhpcy5sb29wRGV0ZWN0b3Iub25GaWxlRWRpdChmaWxlUGF0aCk7XG4gICAgXG4gICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqg77iPIFtIYXJuZXNzXSDlvqrnjq/nvJbovpHorablkYrvvJoke3dhcm5pbmd9YCk7XG4gICAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlLCB3YXJuaW5nIH07IC8vIOWFgeiuuOS9huitpuWRilxuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSG9vazog5paH5Lu25Yig6Zmk5YmN5qOA5p+lXG4gICAqL1xuICBvbkZpbGVEZWxldGUoZmlsZVBhdGg6IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nKTogeyBhbGxvd2VkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGguc3BsaXQoJy8nKS5wb3AoKSB8fCBmaWxlUGF0aDtcbiAgICBcbiAgICAvLyDmo4Dmn6XmmK/lkKbmmK/kv53miqTmlofku7ZcbiAgICBpZiAodGhpcy5jb25maWcucHJvdGVjdGVkRmlsZXMuc29tZShmID0+IGZpbGVQYXRoLmVuZHNXaXRoKGYpKSkge1xuICAgICAgY29uc29sZS5lcnJvcihg8J+aqCBbSGFybmVzc10g56aB5q2i5Yig6Zmk5L+d5oqk5paH5Lu277yaJHtmaWxlUGF0aH1gKTtcbiAgICAgIFxuICAgICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIubG9nKHtcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQgfHwgJ3Vua25vd24nLFxuICAgICAgICBtb2RpZmllcjogJ0FJIEFnZW50JyxcbiAgICAgICAgdHlwZTogJ2ZpbGVfZGVsZXRlJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGDlsJ3or5XliKDpmaTkv53miqTmlofku7bvvJoke2ZpbGVQYXRofWAsXG4gICAgICAgIGZpbGU6IGZpbGVQYXRoLFxuICAgICAgICByZXN1bHQ6ICdlcnJvcicsXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHsgYWxsb3dlZDogZmFsc2UsIHJlYXNvbjogJ+S/neaKpOaWh+S7tuemgeatouWIoOmZpCcgfTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIubG9nKHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgdHlwZTogJ2ZpbGVfZGVsZXRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBg5Yig6Zmk5paH5Lu277yaJHtmaWxlUGF0aH1gLFxuICAgICAgZmlsZTogZmlsZVBhdGgsXG4gICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSG9vazog57O757uf5ZG95Luk5omn6KGM5YmNXG4gICAqL1xuICBvbkV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIubG9nKHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgdHlwZTogJ3N5c3RlbV9jb21tYW5kJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBg5omn6KGM5ZG95Luk77yaJHtjb21tYW5kfWAsXG4gICAgICBjb21tYW5kLFxuICAgICAgcmVzdWx0OiAncGVuZGluZycsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5o+S5Lu254q25oCBXG4gICAqL1xuICBnZXRTdGF0dXMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBsb29wU3RhdHM6IHRoaXMubG9vcERldGVjdG9yLmdldFN0YXRzKCksXG4gICAgfTtcbiAgfVxufVxuXG4vLyBPcGVuQ2xhdyDmj5Lku7blt6XljoLlh73mlbBcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbHVnaW4od29ya3NwYWNlUGF0aDogc3RyaW5nLCBjb25maWc6IGFueSk6IEhhcm5lc3NQbHVnaW4ge1xuICByZXR1cm4gbmV3IEhhcm5lc3NQbHVnaW4od29ya3NwYWNlUGF0aCwgY29uZmlnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgSGFybmVzc1BsdWdpbjtcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hddz/plugin-harness",
3
- "version": "0.1.18",
3
+ "version": "0.2.0",
4
4
  "description": "Harness Engineering plugin for OpenClaw - constraints, feedback loops, and control systems for AI agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,31 +21,20 @@
21
21
  "author": "蓝山",
22
22
  "license": "MIT",
23
23
  "dependencies": {
24
- "@hddz/harness": "^0.1.0"
24
+ "@hddz/harness": "^1.0.1"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "^20.0.0",
28
- "typescript": "^5.0.0",
29
- "jest": "^29.0.0",
30
- "eslint": "^8.0.0"
28
+ "typescript": "^5.0.0"
31
29
  },
32
30
  "engines": {
33
31
  "node": ">=18.0.0"
34
32
  },
35
33
  "files": [
36
34
  "dist",
37
- "README.md",
38
- "openclaw.plugin.json"
35
+ "README.md"
39
36
  ],
40
37
  "peerDependencies": {
41
38
  "openclaw": ">=2026.3.0"
42
- },
43
- "openclaw": {
44
- "extensions": [
45
- {
46
- "id": "harness",
47
- "path": "./dist/index.js"
48
- }
49
- ]
50
39
  }
51
40
  }
@@ -1,39 +0,0 @@
1
- {
2
- "id": "harness",
3
- "name": "Harness Engineering",
4
- "description": "Constraints, feedback loops, and control systems for AI agents",
5
- "version": "0.1.18",
6
- "kind": "engineering",
7
- "configSchema": {
8
- "type": "object",
9
- "additionalProperties": false,
10
- "properties": {
11
- "autoValidateConfig": {
12
- "type": "boolean",
13
- "default": true,
14
- "description": "Automatically validate openclaw.json before writes"
15
- },
16
- "autoAuditSkill": {
17
- "type": "boolean",
18
- "default": true,
19
- "description": "Automatically audit skills before installation"
20
- },
21
- "loopDetectionEnabled": {
22
- "type": "boolean",
23
- "default": true,
24
- "description": "Detect and prevent infinite edit loops"
25
- },
26
- "protectedFiles": {
27
- "type": "array",
28
- "items": { "type": "string" },
29
- "default": ["SOUL.md", "USER.md", "AGENTS.md", "TOOLS.md", "MEMORY.md", "openclaw.json"],
30
- "description": "Files protected from deletion/modification"
31
- },
32
- "logsDir": {
33
- "type": "string",
34
- "default": "workspace/logs/harness",
35
- "description": "Directory for harness operation logs"
36
- }
37
- }
38
- }
39
- }