@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.
- package/README.md +97 -114
- package/dist/file-watcher.d.ts +37 -0
- package/dist/file-watcher.js +151 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +166 -106
- package/dist/src/file-watcher.d.ts +37 -0
- package/dist/src/file-watcher.js +151 -0
- package/dist/src/index.d.ts +70 -0
- package/dist/src/index.js +192 -0
- package/package.json +4 -15
- package/openclaw.plugin.json +0 -39
|
@@ -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.
|
|
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
|
|
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
|
}
|
package/openclaw.plugin.json
DELETED
|
@@ -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
|
-
}
|