@clawstore/clawstore 1.0.7 → 1.0.8
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/dist/src/core/agent-register.d.ts +2 -2
- package/dist/src/core/agent-register.d.ts.map +1 -1
- package/dist/src/core/agent-register.js +54 -29
- package/dist/src/core/agent-register.js.map +1 -1
- package/dist/src/core/skill-installer.d.ts +1 -1
- package/dist/src/core/skill-installer.d.ts.map +1 -1
- package/dist/src/core/skill-installer.js +5 -25
- package/dist/src/core/skill-installer.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/src/core/agent-register.ts +59 -37
- package/src/core/skill-installer.ts +6 -27
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Ensure a non-main agent exists in openclaw.json (file-only; avoids shell subprocesses for plugin safety scans).
|
|
3
|
+
* Creates workspace-{agent} and merges `agents.entries` / `agents.list` as needed.
|
|
4
4
|
*/
|
|
5
5
|
export declare function ensureAgentRegistered(agent: string, log?: (msg: string) => void): Promise<boolean>;
|
|
6
6
|
//# sourceMappingURL=agent-register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-register.d.ts","sourceRoot":"","sources":["../../../src/core/agent-register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-register.d.ts","sourceRoot":"","sources":["../../../src/core/agent-register.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAkB,GACvC,OAAO,CAAC,OAAO,CAAC,CAsDlB"}
|
|
@@ -1,48 +1,73 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { join } from "node:path";
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
4
3
|
import { OPENCLAW_HOME, DEFAULT_AGENT } from "../constants.js";
|
|
4
|
+
function isRegistered(config, agent) {
|
|
5
|
+
const agents = config.agents;
|
|
6
|
+
if (!agents || typeof agents !== "object")
|
|
7
|
+
return false;
|
|
8
|
+
if (agents[agent] !== undefined)
|
|
9
|
+
return true;
|
|
10
|
+
const entries = agents.entries;
|
|
11
|
+
if (entries && typeof entries === "object" && !Array.isArray(entries) && entries[agent] !== undefined) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
const list = agents.list;
|
|
15
|
+
if (Array.isArray(list) && list.some((e) => e?.id === agent))
|
|
16
|
+
return true;
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
5
19
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
20
|
+
* Ensure a non-main agent exists in openclaw.json (file-only; avoids shell subprocesses for plugin safety scans).
|
|
21
|
+
* Creates workspace-{agent} and merges `agents.entries` / `agents.list` as needed.
|
|
8
22
|
*/
|
|
9
23
|
export async function ensureAgentRegistered(agent, log = console.log) {
|
|
10
24
|
if (agent === DEFAULT_AGENT)
|
|
11
25
|
return true;
|
|
12
26
|
const configFile = join(OPENCLAW_HOME, "openclaw.json");
|
|
27
|
+
let config = {};
|
|
13
28
|
try {
|
|
14
29
|
const raw = await readFile(configFile, "utf-8");
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
config?.agents?.entries?.[agent] !== undefined;
|
|
18
|
-
const inList = Array.isArray(config?.agents?.list) &&
|
|
19
|
-
config.agents.list.some((e) => e?.id === agent);
|
|
20
|
-
if (inMap || inList)
|
|
30
|
+
config = JSON.parse(raw);
|
|
31
|
+
if (isRegistered(config, agent))
|
|
21
32
|
return true;
|
|
22
33
|
}
|
|
23
34
|
catch {
|
|
24
|
-
//
|
|
35
|
+
// missing or invalid — rewrite below
|
|
25
36
|
}
|
|
26
37
|
const workspace = join(OPENCLAW_HOME, `workspace-${agent}`);
|
|
27
38
|
try {
|
|
28
39
|
await mkdir(workspace, { recursive: true });
|
|
29
40
|
}
|
|
30
|
-
catch { /*
|
|
31
|
-
log(`\n OpenClaw agent "${agent}" is not registered.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
41
|
+
catch { /* may exist */ }
|
|
42
|
+
log(`\n OpenClaw agent "${agent}" is not registered. Updating ${configFile} ...`);
|
|
43
|
+
try {
|
|
44
|
+
const raw = await readFile(configFile, "utf-8");
|
|
45
|
+
config = JSON.parse(raw);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
config = {};
|
|
49
|
+
}
|
|
50
|
+
if (!config.agents || typeof config.agents !== "object" || Array.isArray(config.agents)) {
|
|
51
|
+
config.agents = {};
|
|
52
|
+
}
|
|
53
|
+
const agents = config.agents;
|
|
54
|
+
const entry = { workspace };
|
|
55
|
+
const prevEntries = agents.entries && typeof agents.entries === "object" && !Array.isArray(agents.entries)
|
|
56
|
+
? { ...agents.entries }
|
|
57
|
+
: {};
|
|
58
|
+
prevEntries[agent] = entry;
|
|
59
|
+
agents.entries = prevEntries;
|
|
60
|
+
if (Array.isArray(agents.list)) {
|
|
61
|
+
const list = agents.list;
|
|
62
|
+
const idx = list.findIndex((e) => e?.id === agent);
|
|
63
|
+
if (idx >= 0)
|
|
64
|
+
list[idx] = { ...list[idx], id: agent, workspace };
|
|
65
|
+
else
|
|
66
|
+
list.push({ id: agent, workspace });
|
|
67
|
+
}
|
|
68
|
+
await mkdir(dirname(configFile), { recursive: true });
|
|
69
|
+
await writeFile(configFile, `${JSON.stringify(config, null, 2)}\n`, "utf-8");
|
|
70
|
+
log(` Registered agent "${agent}" → ${workspace}`);
|
|
71
|
+
return true;
|
|
47
72
|
}
|
|
48
73
|
//# sourceMappingURL=agent-register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-register.js","sourceRoot":"","sources":["../../../src/core/agent-register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-register.js","sourceRoot":"","sources":["../../../src/core/agent-register.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export declare function checkSkillDependencies(skills: SkillDependency[]): Skill
|
|
|
12
12
|
*
|
|
13
13
|
* Strategy:
|
|
14
14
|
* 1. Try bundled skills/ in the package directory first
|
|
15
|
-
* 2.
|
|
15
|
+
* 2. If not bundled: return instructions to run `openclaw plugins install` manually (no shell from this plugin).
|
|
16
16
|
*/
|
|
17
17
|
export declare function installSkill(skillId: string, version: string, packagePath?: string, agent?: string): Promise<{
|
|
18
18
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installer.d.ts","sourceRoot":"","sources":["../../../src/core/skill-installer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill-installer.d.ts","sourceRoot":"","sources":["../../../src/core/skill-installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAuC,MAAM,aAAa,CAAC;AAkDxF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,gBAAgB,EAAE,CA4BpF;AA+BD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,GAAE,MAAsB,GAC5B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB3C;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EAAE,EACzB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC3B,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,GAAE,MAAsB,GAC5B,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC,gBAAgB,GAAG;QAAE,aAAa,CAAC,EAAE;YAAE,EAAE,EAAE,OAAO,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAgCtH"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { access, readFile, writeFile, mkdir, cp } from "node:fs/promises";
|
|
2
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import { join, dirname } from "node:path";
|
|
4
|
-
import { exec } from "node:child_process";
|
|
5
|
-
import { promisify } from "node:util";
|
|
6
4
|
import semver from "semver";
|
|
7
5
|
import { OPENCLAW_HOME, DEFAULT_AGENT, agentSkillRegistryFile } from "../constants.js";
|
|
8
6
|
import { resolveWorkspace } from "./workspace.js";
|
|
9
|
-
const execAsync = promisify(exec);
|
|
10
7
|
async function exists(p) {
|
|
11
8
|
try {
|
|
12
9
|
await access(p);
|
|
@@ -103,7 +100,7 @@ async function installSkillFromBundle(skillId, packagePath, agent = DEFAULT_AGEN
|
|
|
103
100
|
*
|
|
104
101
|
* Strategy:
|
|
105
102
|
* 1. Try bundled skills/ in the package directory first
|
|
106
|
-
* 2.
|
|
103
|
+
* 2. If not bundled: return instructions to run `openclaw plugins install` manually (no shell from this plugin).
|
|
107
104
|
*/
|
|
108
105
|
export async function installSkill(skillId, version, packagePath, agent = DEFAULT_AGENT) {
|
|
109
106
|
if (packagePath) {
|
|
@@ -122,27 +119,10 @@ export async function installSkill(skillId, version, packagePath, agent = DEFAUL
|
|
|
122
119
|
}
|
|
123
120
|
}
|
|
124
121
|
const spec = version && version !== "latest" ? `${skillId}@${version}` : skillId;
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const reg = await loadSkillRegistry(agent);
|
|
130
|
-
reg.skills[skillId] = {
|
|
131
|
-
skill_id: skillId,
|
|
132
|
-
version,
|
|
133
|
-
installed_at: new Date().toISOString(),
|
|
134
|
-
installed_by: "clawstore",
|
|
135
|
-
source: `npm:${spec}`,
|
|
136
|
-
};
|
|
137
|
-
await saveSkillRegistry(reg, agent);
|
|
138
|
-
return { ok: true, message: output.trim() || `installed ${spec}` };
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
return {
|
|
142
|
-
ok: false,
|
|
143
|
-
message: `failed to install ${spec}: ${err.message}`,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
message: `not found in Persona bundle; install manually: openclaw plugins install ${JSON.stringify(spec)}`,
|
|
125
|
+
};
|
|
146
126
|
}
|
|
147
127
|
/**
|
|
148
128
|
* Install all required skills for an agent.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../../src/core/skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../../src/core/skill-installer.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { join } from "node:path";
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
4
3
|
import { OPENCLAW_HOME, DEFAULT_AGENT } from "../constants.js";
|
|
5
4
|
|
|
5
|
+
function isRegistered(config: Record<string, unknown>, agent: string): boolean {
|
|
6
|
+
const agents = config.agents as Record<string, unknown> | undefined;
|
|
7
|
+
if (!agents || typeof agents !== "object") return false;
|
|
8
|
+
if (agents[agent] !== undefined) return true;
|
|
9
|
+
const entries = agents.entries as Record<string, unknown> | undefined;
|
|
10
|
+
if (entries && typeof entries === "object" && !Array.isArray(entries) && entries[agent] !== undefined) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
const list = agents.list;
|
|
14
|
+
if (Array.isArray(list) && list.some((e: { id?: string }) => e?.id === agent)) return true;
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
6
18
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
19
|
+
* Ensure a non-main agent exists in openclaw.json (file-only; avoids shell subprocesses for plugin safety scans).
|
|
20
|
+
* Creates workspace-{agent} and merges `agents.entries` / `agents.list` as needed.
|
|
9
21
|
*/
|
|
10
22
|
export async function ensureAgentRegistered(
|
|
11
23
|
agent: string,
|
|
@@ -14,44 +26,54 @@ export async function ensureAgentRegistered(
|
|
|
14
26
|
if (agent === DEFAULT_AGENT) return true;
|
|
15
27
|
|
|
16
28
|
const configFile = join(OPENCLAW_HOME, "openclaw.json");
|
|
29
|
+
let config: Record<string, unknown> = {};
|
|
30
|
+
|
|
17
31
|
try {
|
|
18
32
|
const raw = await readFile(configFile, "utf-8");
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const inMap =
|
|
22
|
-
config?.agents?.[agent] !== undefined ||
|
|
23
|
-
config?.agents?.entries?.[agent] !== undefined;
|
|
24
|
-
const inList = Array.isArray(config?.agents?.list) &&
|
|
25
|
-
config.agents.list.some((e: { id?: string }) => e?.id === agent);
|
|
26
|
-
|
|
27
|
-
if (inMap || inList) return true;
|
|
33
|
+
config = JSON.parse(raw) as Record<string, unknown>;
|
|
34
|
+
if (isRegistered(config, agent)) return true;
|
|
28
35
|
} catch {
|
|
29
|
-
//
|
|
36
|
+
// missing or invalid — rewrite below
|
|
30
37
|
}
|
|
31
38
|
|
|
32
39
|
const workspace = join(OPENCLAW_HOME, `workspace-${agent}`);
|
|
33
40
|
try {
|
|
34
41
|
await mkdir(workspace, { recursive: true });
|
|
35
|
-
} catch { /*
|
|
36
|
-
|
|
37
|
-
log(`\n OpenClaw agent "${agent}" is not registered.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
42
|
+
} catch { /* may exist */ }
|
|
43
|
+
|
|
44
|
+
log(`\n OpenClaw agent "${agent}" is not registered. Updating ${configFile} ...`);
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const raw = await readFile(configFile, "utf-8");
|
|
48
|
+
config = JSON.parse(raw) as Record<string, unknown>;
|
|
49
|
+
} catch {
|
|
50
|
+
config = {};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!config.agents || typeof config.agents !== "object" || Array.isArray(config.agents)) {
|
|
54
|
+
config.agents = {};
|
|
55
|
+
}
|
|
56
|
+
const agents = config.agents as Record<string, unknown>;
|
|
57
|
+
|
|
58
|
+
const entry = { workspace };
|
|
59
|
+
|
|
60
|
+
const prevEntries =
|
|
61
|
+
agents.entries && typeof agents.entries === "object" && !Array.isArray(agents.entries)
|
|
62
|
+
? { ...(agents.entries as Record<string, { workspace: string }>) }
|
|
63
|
+
: {};
|
|
64
|
+
prevEntries[agent] = entry;
|
|
65
|
+
agents.entries = prevEntries;
|
|
66
|
+
|
|
67
|
+
if (Array.isArray(agents.list)) {
|
|
68
|
+
const list = agents.list as Array<{ id?: string; workspace?: string }>;
|
|
69
|
+
const idx = list.findIndex((e) => e?.id === agent);
|
|
70
|
+
if (idx >= 0) list[idx] = { ...list[idx], id: agent, workspace };
|
|
71
|
+
else list.push({ id: agent, workspace });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
await mkdir(dirname(configFile), { recursive: true });
|
|
75
|
+
await writeFile(configFile, `${JSON.stringify(config, null, 2)}\n`, "utf-8");
|
|
76
|
+
|
|
77
|
+
log(` Registered agent "${agent}" → ${workspace}`);
|
|
78
|
+
return true;
|
|
57
79
|
}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { access, readFile, writeFile, mkdir, cp } from "node:fs/promises";
|
|
2
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import { join, dirname } from "node:path";
|
|
4
|
-
import { exec } from "node:child_process";
|
|
5
|
-
import { promisify } from "node:util";
|
|
6
4
|
import semver from "semver";
|
|
7
5
|
import { OPENCLAW_HOME, DEFAULT_AGENT, agentSkillRegistryFile } from "../constants.js";
|
|
8
6
|
import type { SkillDependency, SkillRegistry, InstalledSkillRecord } from "../types.js";
|
|
9
7
|
import { resolveWorkspace } from "./workspace.js";
|
|
10
8
|
|
|
11
|
-
const execAsync = promisify(exec);
|
|
12
|
-
|
|
13
9
|
async function exists(p: string): Promise<boolean> {
|
|
14
10
|
try {
|
|
15
11
|
await access(p);
|
|
@@ -129,7 +125,7 @@ async function installSkillFromBundle(
|
|
|
129
125
|
*
|
|
130
126
|
* Strategy:
|
|
131
127
|
* 1. Try bundled skills/ in the package directory first
|
|
132
|
-
* 2.
|
|
128
|
+
* 2. If not bundled: return instructions to run `openclaw plugins install` manually (no shell from this plugin).
|
|
133
129
|
*/
|
|
134
130
|
export async function installSkill(
|
|
135
131
|
skillId: string,
|
|
@@ -154,28 +150,11 @@ export async function installSkill(
|
|
|
154
150
|
}
|
|
155
151
|
|
|
156
152
|
const spec = version && version !== "latest" ? `${skillId}@${version}` : skillId;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const reg = await loadSkillRegistry(agent);
|
|
163
|
-
reg.skills[skillId] = {
|
|
164
|
-
skill_id: skillId,
|
|
165
|
-
version,
|
|
166
|
-
installed_at: new Date().toISOString(),
|
|
167
|
-
installed_by: "clawstore",
|
|
168
|
-
source: `npm:${spec}`,
|
|
169
|
-
};
|
|
170
|
-
await saveSkillRegistry(reg, agent);
|
|
171
|
-
|
|
172
|
-
return { ok: true, message: output.trim() || `installed ${spec}` };
|
|
173
|
-
} catch (err) {
|
|
174
|
-
return {
|
|
175
|
-
ok: false,
|
|
176
|
-
message: `failed to install ${spec}: ${(err as Error).message}`,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
153
|
+
return {
|
|
154
|
+
ok: false,
|
|
155
|
+
message:
|
|
156
|
+
`not found in Persona bundle; install manually: openclaw plugins install ${JSON.stringify(spec)}`,
|
|
157
|
+
};
|
|
179
158
|
}
|
|
180
159
|
|
|
181
160
|
/**
|