@okclaw-build/cli 1.0.0-beta.50 → 1.0.0-beta.53
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/commands/backup.js +31 -4
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/install.js +30 -17
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/restore.js +31 -4
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/skill.js +37 -14
- package/dist/commands/skill.js.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/installers/base.d.ts +2 -1
- package/dist/installers/channel.d.ts +3 -2
- package/dist/installers/channel.js +32 -26
- package/dist/installers/channel.js.map +1 -1
- package/dist/installers/openclaw.js +25 -12
- package/dist/installers/openclaw.js.map +1 -1
- package/dist/installers/skill.d.ts +3 -2
- package/dist/installers/skill.js +39 -20
- package/dist/installers/skill.js.map +1 -1
- package/dist/openclaw-user-data.d.ts +22 -2
- package/dist/openclaw-user-data.js +165 -26
- package/dist/openclaw-user-data.js.map +1 -1
- package/dist/utils/constants.d.ts +0 -8
- package/dist/utils/constants.js +0 -14
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/install-safety.d.ts +25 -0
- package/dist/utils/install-safety.js +95 -0
- package/dist/utils/install-safety.js.map +1 -0
- package/dist/utils/shell.d.ts +11 -0
- package/dist/utils/shell.js +58 -0
- package/dist/utils/shell.js.map +1 -1
- package/package.json +4 -3
package/dist/commands/backup.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { error, info } from '../utils/logger.js';
|
|
2
|
-
import { createOpenclawUserDataArchive } from '../openclaw-user-data.js';
|
|
2
|
+
import { createOpenclawUserDataArchive, } from '../openclaw-user-data.js';
|
|
3
3
|
export async function backupCommand(args, deps = {}) {
|
|
4
4
|
const parsed = parseBackupArgs(args);
|
|
5
5
|
const emit = deps.emit ?? defaultEmit;
|
|
6
6
|
const createArchive = deps.createArchive ?? createOpenclawUserDataArchive;
|
|
7
7
|
if (parsed.target !== 'openclaw-user-data' || !parsed.archive) {
|
|
8
|
-
error('Usage: okclaw backup openclaw-user-data --archive [--archive-path <path>] [--output=ndjson]');
|
|
8
|
+
error('Usage: okclaw backup openclaw-user-data --archive [--archive-path <path>] [--scope user-data|clone] [--include-workspace-extra] [--output=ndjson]');
|
|
9
9
|
process.exit(1);
|
|
10
10
|
}
|
|
11
11
|
try {
|
|
12
|
-
const result = await createArchive({
|
|
12
|
+
const result = await createArchive({
|
|
13
|
+
archivePath: parsed.archivePath,
|
|
14
|
+
scope: parsed.scope,
|
|
15
|
+
includeWorkspaceExtra: parsed.includeWorkspaceExtra,
|
|
16
|
+
});
|
|
13
17
|
emit({
|
|
14
18
|
ok: true,
|
|
15
19
|
code: 'OK',
|
|
@@ -39,6 +43,8 @@ function parseBackupArgs(args) {
|
|
|
39
43
|
let target;
|
|
40
44
|
let archive = false;
|
|
41
45
|
let archivePath;
|
|
46
|
+
let scope = 'user-data';
|
|
47
|
+
let includeWorkspaceExtra = false;
|
|
42
48
|
let ndjson = false;
|
|
43
49
|
for (let i = 0; i < args.length; i++) {
|
|
44
50
|
const arg = args[i];
|
|
@@ -58,13 +64,34 @@ function parseBackupArgs(args) {
|
|
|
58
64
|
archivePath = arg.slice('--archive-path='.length);
|
|
59
65
|
continue;
|
|
60
66
|
}
|
|
67
|
+
if (arg === '--scope') {
|
|
68
|
+
if (!args[i + 1]) {
|
|
69
|
+
throw new Error('missing value for --scope');
|
|
70
|
+
}
|
|
71
|
+
scope = parseScope(args[++i]);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (arg.startsWith('--scope=')) {
|
|
75
|
+
scope = parseScope(arg.slice('--scope='.length));
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (arg === '--include-workspace-extra') {
|
|
79
|
+
includeWorkspaceExtra = true;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
61
82
|
if (arg === '--output=ndjson' || (arg === '--output' && args[i + 1] === 'ndjson')) {
|
|
62
83
|
ndjson = true;
|
|
63
84
|
if (arg === '--output')
|
|
64
85
|
i += 1;
|
|
65
86
|
}
|
|
66
87
|
}
|
|
67
|
-
return { target, archive, archivePath, ndjson };
|
|
88
|
+
return { target, archive, archivePath, scope, includeWorkspaceExtra, ndjson };
|
|
89
|
+
}
|
|
90
|
+
function parseScope(value) {
|
|
91
|
+
if (value === 'user-data' || value === 'clone') {
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`unsupported openclaw user data scope: ${value}`);
|
|
68
95
|
}
|
|
69
96
|
function defaultEmit(event) {
|
|
70
97
|
process.stdout.write(JSON.stringify(event) + '\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,6BAA6B,GAG9B,MAAM,0BAA0B,CAAC;AAiBlC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,OAA0B,EAAE;IAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,6BAA6B,CAAC;IAE1E,IAAI,MAAM,CAAC,MAAM,KAAK,oBAAoB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9D,KAAK,CAAC,mJAAmJ,CAAC,CAAC;QAC3J,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAkB,MAAM,aAAa,CAAC;YAChD,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;SACpD,CAAC,CAAC;QACH,IAAI,CAAC;YACH,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,6BAA6B;YAClG,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,kCAAkC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAuE,CAAC;QACpF,IAAI,CAAC;YACH,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,kCAAkC;YAC3C,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW;YAClD,KAAK,EAAE,GAAG,CAAC,OAAO;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAc;IAQrC,IAAI,MAA0B,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAA+B,CAAC;IACpC,IAAI,KAAK,GAA0B,WAAW,CAAC;IAC/C,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAClC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,gBAAgB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5C,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YACD,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,2BAA2B,EAAE,CAAC;YACxC,qBAAqB,GAAG,IAAI,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,iBAAiB,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YAClF,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,GAAG,KAAK,UAAU;gBAAE,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/commands/install.js
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { OpenclawInstaller } from '../installers/openclaw.js';
|
|
3
|
-
import { OpenvikingInstaller } from '../installers/openviking.js';
|
|
4
3
|
import { ChannelInstaller } from '../installers/channel.js';
|
|
5
4
|
import { SkillInstaller } from '../installers/skill.js';
|
|
6
5
|
import { detectOpenviking, purgePhaseA } from '../installers/openviking-purge.js';
|
|
7
6
|
import { configureMirrors } from '../utils/mirror.js';
|
|
8
7
|
import { info, error, success } from '../utils/logger.js';
|
|
9
8
|
import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
|
|
9
|
+
import { assertSafePackageVersion, parseInstallComponent, parsePackageSource, } from '../utils/install-safety.js';
|
|
10
10
|
function getInstaller(component) {
|
|
11
|
-
switch (component) {
|
|
11
|
+
switch (component.kind) {
|
|
12
12
|
case 'openclaw': return new OpenclawInstaller();
|
|
13
|
-
case '
|
|
14
|
-
|
|
15
|
-
if (component.startsWith('skill:')) {
|
|
16
|
-
return new SkillInstaller(component.substring('skill:'.length));
|
|
17
|
-
}
|
|
18
|
-
return new ChannelInstaller(component);
|
|
13
|
+
case 'skill': return new SkillInstaller(component.skillName);
|
|
14
|
+
case 'channel': return new ChannelInstaller(component.channelName);
|
|
19
15
|
}
|
|
20
16
|
}
|
|
21
17
|
export async function installCommand(args) {
|
|
@@ -69,17 +65,34 @@ export async function installCommand(args) {
|
|
|
69
65
|
emitter.end(false, 1, 'E_VERSION_REQUIRED');
|
|
70
66
|
process.exit(1);
|
|
71
67
|
}
|
|
72
|
-
|
|
73
|
-
|
|
68
|
+
let parsed;
|
|
69
|
+
let safeVersion;
|
|
70
|
+
let packageSource;
|
|
71
|
+
try {
|
|
72
|
+
parsed = parseInstallComponent(component);
|
|
73
|
+
safeVersion = assertSafePackageVersion(version);
|
|
74
|
+
packageSource = packageUrl ? parsePackageSource(packageUrl) : undefined;
|
|
75
|
+
if (parsed.kind === 'channel' && parsed.channelName === 's3' && !packageSource) {
|
|
76
|
+
throw new Error('--package-url is required for s3');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
81
|
+
error(msg);
|
|
82
|
+
emitter.end(false, 1, 'E_INVALID_ARGS', { error: msg });
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
emitter.start(`installing ${parsed.raw}@${safeVersion}`, { component: parsed.raw, version: safeVersion });
|
|
86
|
+
info(`Installing ${parsed.raw}@${safeVersion}...`);
|
|
74
87
|
try {
|
|
75
88
|
emitter.stepStart('check-deps', 'checking system dependencies');
|
|
76
|
-
const installer = getInstaller(
|
|
89
|
+
const installer = getInstaller(parsed);
|
|
77
90
|
await installer.checkDeps();
|
|
78
91
|
emitter.stepDone('check-deps', 'dependencies ok');
|
|
79
92
|
emitter.stepStart('mirrors', 'configuring npm/pip mirrors');
|
|
80
93
|
await configureMirrors();
|
|
81
94
|
emitter.stepDone('mirrors', 'mirrors configured');
|
|
82
|
-
if (
|
|
95
|
+
if (parsed.kind === 'openclaw') {
|
|
83
96
|
emitter.stepStart('preflight:purge-openviking', 'checking openviking residue');
|
|
84
97
|
try {
|
|
85
98
|
const detection = detectOpenviking();
|
|
@@ -101,9 +114,9 @@ export async function installCommand(args) {
|
|
|
101
114
|
process.exit(1);
|
|
102
115
|
}
|
|
103
116
|
}
|
|
104
|
-
emitter.stepStart('install', `installing ${
|
|
105
|
-
await installer.install(
|
|
106
|
-
emitter.stepDone('install', `${
|
|
117
|
+
emitter.stepStart('install', `installing ${parsed.raw}@${safeVersion}`);
|
|
118
|
+
await installer.install(safeVersion, packageSource);
|
|
119
|
+
emitter.stepDone('install', `${parsed.raw}@${safeVersion} installed`);
|
|
107
120
|
if (config) {
|
|
108
121
|
emitter.stepStart('configure', 'applying configuration');
|
|
109
122
|
await installer.configure(config);
|
|
@@ -112,8 +125,8 @@ export async function installCommand(args) {
|
|
|
112
125
|
else {
|
|
113
126
|
info('No config provided, keeping existing configuration.');
|
|
114
127
|
}
|
|
115
|
-
success(`${
|
|
116
|
-
emitter.end(true, 0, undefined, { component, version });
|
|
128
|
+
success(`${parsed.raw}@${safeVersion} installed.`);
|
|
129
|
+
emitter.end(true, 0, undefined, { component: parsed.raw, version: safeVersion });
|
|
117
130
|
}
|
|
118
131
|
catch (e) {
|
|
119
132
|
const msg = e instanceof Error ? e.message : String(e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/restore.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { error, info } from '../utils/logger.js';
|
|
2
|
-
import { restoreOpenclawUserDataArchive } from '../openclaw-user-data.js';
|
|
2
|
+
import { restoreOpenclawUserDataArchive, } from '../openclaw-user-data.js';
|
|
3
3
|
export async function restoreCommand(args, deps = {}) {
|
|
4
4
|
const parsed = parseRestoreArgs(args);
|
|
5
5
|
const emit = deps.emit ?? defaultEmit;
|
|
6
6
|
const restoreArchive = deps.restoreArchive ?? restoreOpenclawUserDataArchive;
|
|
7
7
|
if (parsed.target !== 'openclaw-user-data' || !parsed.archivePath) {
|
|
8
|
-
error('Usage: okclaw restore openclaw-user-data --archive <path> [--output=ndjson]');
|
|
8
|
+
error('Usage: okclaw restore openclaw-user-data --archive <path> [--scope user-data|clone] [--include-workspace-extra] [--output=ndjson]');
|
|
9
9
|
process.exit(1);
|
|
10
10
|
}
|
|
11
11
|
try {
|
|
12
|
-
const result = await restoreArchive({
|
|
12
|
+
const result = await restoreArchive({
|
|
13
|
+
archivePath: parsed.archivePath,
|
|
14
|
+
scope: parsed.scope,
|
|
15
|
+
includeWorkspaceExtra: parsed.includeWorkspaceExtra,
|
|
16
|
+
});
|
|
13
17
|
emit({
|
|
14
18
|
ok: true,
|
|
15
19
|
code: 'OK',
|
|
@@ -38,6 +42,8 @@ export async function restoreCommand(args, deps = {}) {
|
|
|
38
42
|
function parseRestoreArgs(args) {
|
|
39
43
|
let target;
|
|
40
44
|
let archivePath;
|
|
45
|
+
let scope = 'user-data';
|
|
46
|
+
let includeWorkspaceExtra = false;
|
|
41
47
|
let ndjson = false;
|
|
42
48
|
for (let i = 0; i < args.length; i++) {
|
|
43
49
|
const arg = args[i];
|
|
@@ -53,13 +59,34 @@ function parseRestoreArgs(args) {
|
|
|
53
59
|
archivePath = arg.slice('--archive='.length);
|
|
54
60
|
continue;
|
|
55
61
|
}
|
|
62
|
+
if (arg === '--scope') {
|
|
63
|
+
if (!args[i + 1]) {
|
|
64
|
+
throw new Error('missing value for --scope');
|
|
65
|
+
}
|
|
66
|
+
scope = parseScope(args[++i]);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (arg.startsWith('--scope=')) {
|
|
70
|
+
scope = parseScope(arg.slice('--scope='.length));
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (arg === '--include-workspace-extra') {
|
|
74
|
+
includeWorkspaceExtra = true;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
56
77
|
if (arg === '--output=ndjson' || (arg === '--output' && args[i + 1] === 'ndjson')) {
|
|
57
78
|
ndjson = true;
|
|
58
79
|
if (arg === '--output')
|
|
59
80
|
i += 1;
|
|
60
81
|
}
|
|
61
82
|
}
|
|
62
|
-
return { target, archivePath, ndjson };
|
|
83
|
+
return { target, archivePath, scope, includeWorkspaceExtra, ndjson };
|
|
84
|
+
}
|
|
85
|
+
function parseScope(value) {
|
|
86
|
+
if (value === 'user-data' || value === 'clone') {
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`unsupported openclaw user data scope: ${value}`);
|
|
63
90
|
}
|
|
64
91
|
function defaultEmit(event) {
|
|
65
92
|
process.stdout.write(JSON.stringify(event) + '\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/skill.js
CHANGED
|
@@ -3,6 +3,7 @@ import { SkillInstaller } from '../installers/skill.js';
|
|
|
3
3
|
import { configureMirrors } from '../utils/mirror.js';
|
|
4
4
|
import { info, error, success } from '../utils/logger.js';
|
|
5
5
|
import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
|
|
6
|
+
import { assertSafeInstallName, assertSafePackageVersion, parsePackageSource, } from '../utils/install-safety.js';
|
|
6
7
|
export async function skillCommand(args) {
|
|
7
8
|
const subCommand = args[0];
|
|
8
9
|
const skillName = args[1];
|
|
@@ -21,19 +22,29 @@ export async function skillCommand(args) {
|
|
|
21
22
|
emitter.end(false, 1, 'E_USAGE');
|
|
22
23
|
process.exit(1);
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
+
let safeSkillName;
|
|
26
|
+
try {
|
|
27
|
+
safeSkillName = assertSafeInstallName('skill', skillName);
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
31
|
+
error(msg);
|
|
32
|
+
emitter.end(false, 1, 'E_INVALID_ARGS', { error: msg });
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const installer = new SkillInstaller(safeSkillName);
|
|
25
36
|
if (subCommand === 'uninstall') {
|
|
26
|
-
emitter.start(`uninstalling skill ${
|
|
27
|
-
info(`Uninstalling skill ${
|
|
37
|
+
emitter.start(`uninstalling skill ${safeSkillName}`, { skillName: safeSkillName });
|
|
38
|
+
info(`Uninstalling skill ${safeSkillName}...`);
|
|
28
39
|
try {
|
|
29
|
-
emitter.stepStart('validate', `validating skill name ${
|
|
40
|
+
emitter.stepStart('validate', `validating skill name ${safeSkillName}`);
|
|
30
41
|
// installer 内部校验名称,SkillInstaller.uninstall 会在目标不存在时快速返回
|
|
31
42
|
emitter.stepDone('validate', 'skill name ok');
|
|
32
|
-
emitter.stepStart('uninstall', `removing ${
|
|
43
|
+
emitter.stepStart('uninstall', `removing ${safeSkillName}`);
|
|
33
44
|
await installer.uninstall();
|
|
34
45
|
emitter.stepDone('uninstall', 'skill removed');
|
|
35
|
-
success(`Skill ${
|
|
36
|
-
emitter.end(true, 0, undefined, { skillName });
|
|
46
|
+
success(`Skill ${safeSkillName} uninstalled.`);
|
|
47
|
+
emitter.end(true, 0, undefined, { skillName: safeSkillName });
|
|
37
48
|
}
|
|
38
49
|
catch (e) {
|
|
39
50
|
const msg = e instanceof Error ? e.message : String(e);
|
|
@@ -86,23 +97,35 @@ export async function skillCommand(args) {
|
|
|
86
97
|
emitter.end(false, 1, 'E_VERSION_REQUIRED');
|
|
87
98
|
process.exit(1);
|
|
88
99
|
}
|
|
89
|
-
|
|
90
|
-
|
|
100
|
+
let safeVersion;
|
|
101
|
+
let packageSource;
|
|
102
|
+
try {
|
|
103
|
+
safeVersion = assertSafePackageVersion(version);
|
|
104
|
+
packageSource = packageUrl ? parsePackageSource(packageUrl) : undefined;
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
108
|
+
error(msg);
|
|
109
|
+
emitter.end(false, 1, 'E_INVALID_ARGS', { error: msg });
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
emitter.start(`installing skill ${safeSkillName}@${safeVersion}`, { skillName: safeSkillName, version: safeVersion });
|
|
113
|
+
info(`Installing skill ${safeSkillName}@${safeVersion}...`);
|
|
91
114
|
try {
|
|
92
115
|
emitter.stepStart('validate', 'validating install args');
|
|
93
116
|
await installer.checkDeps();
|
|
94
117
|
emitter.stepDone('validate', 'args ok, deps ready');
|
|
95
|
-
emitter.stepStart('download', `downloading skill ${
|
|
118
|
+
emitter.stepStart('download', `downloading skill ${safeSkillName}@${safeVersion}`);
|
|
96
119
|
await configureMirrors();
|
|
97
|
-
await installer.install(
|
|
120
|
+
await installer.install(safeVersion, packageSource);
|
|
98
121
|
emitter.stepDone('download', 'skill downloaded');
|
|
99
|
-
emitter.stepStart('install', `applying skill ${
|
|
122
|
+
emitter.stepStart('install', `applying skill ${safeSkillName}`);
|
|
100
123
|
if (config) {
|
|
101
124
|
await installer.configure(config);
|
|
102
125
|
}
|
|
103
126
|
emitter.stepDone('install', 'skill installed');
|
|
104
|
-
success(`Skill ${
|
|
105
|
-
emitter.end(true, 0, undefined, { skillName, version });
|
|
127
|
+
success(`Skill ${safeSkillName}@${safeVersion} installed.`);
|
|
128
|
+
emitter.end(true, 0, undefined, { skillName: safeSkillName, version: safeVersion });
|
|
106
129
|
}
|
|
107
130
|
catch (e) {
|
|
108
131
|
const msg = e instanceof Error ? e.message : String(e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -141,12 +141,11 @@ Global flags (before the command):
|
|
|
141
141
|
okclaw edit <target> --file <path> Write config file (user/identity/soul/agents/memory/tools/openclaw-json)
|
|
142
142
|
okclaw show <target...> Read config file content to stdout (batch requires --output=ndjson)
|
|
143
143
|
okclaw feed --file <path> Feed file into knowledge base
|
|
144
|
-
okclaw backup openclaw-user-data --archive [--archive-path <path>]
|
|
145
|
-
okclaw restore openclaw-user-data --archive <path>
|
|
144
|
+
okclaw backup openclaw-user-data --archive [--archive-path <path>] [--scope user-data|clone] [--include-workspace-extra]
|
|
145
|
+
okclaw restore openclaw-user-data --archive <path> [--scope user-data|clone] [--include-workspace-extra]
|
|
146
146
|
|
|
147
147
|
Components:
|
|
148
148
|
openclaw Core AI Agent framework (npm install)
|
|
149
|
-
openviking Long-term memory plugin (pip + openclaw plugin, needs --package-url)
|
|
150
149
|
dingtalk DingTalk channel (npm: @soimy/dingtalk)
|
|
151
150
|
feishu Feishu/Lark channel (bundled with OpenClaw, config only)
|
|
152
151
|
wechat WeChat channel (npm: @tencent-weixin/openclaw-weixin)
|
|
@@ -154,7 +153,6 @@ Components:
|
|
|
154
153
|
|
|
155
154
|
Examples:
|
|
156
155
|
okclaw install openclaw --version 2026.3.24 --config-file /root/okclaw/config/openclaw.json
|
|
157
|
-
okclaw install openviking --version 0.2.15 --package-url /tmp/ov-plugin.tar.gz --config-file /root/okclaw/config/openviking.json
|
|
158
156
|
okclaw install dingtalk --version 2.0.1 --config '{"clientId":"xxx","clientSecret":"xxx"}'
|
|
159
157
|
okclaw install s3 --version 1.0.0 --package-url /tmp/channel-s3.tar.gz
|
|
160
158
|
okclaw uninstall openclaw
|
|
@@ -168,6 +166,9 @@ Notes:
|
|
|
168
166
|
- All paths are anchored to /root/ (forced HOME=/root)
|
|
169
167
|
- npm uses npmmirror, pip uses tsinghua mirror (China acceleration)
|
|
170
168
|
- Node.js >= 24 (LTS) is auto-installed/upgraded via nvm if missing or too old
|
|
169
|
+
- openclaw-user-data defaults to core workspace files and skills only
|
|
170
|
+
- --scope clone backs up/restores only IDENTITY.md, SOUL.md, TOOLS.md, AGENTS.md, and workspace/skills
|
|
171
|
+
- --include-workspace-extra also migrates other OpenClaw workspace root entries, but never /root/.openclaw/openclaw.json
|
|
171
172
|
`);
|
|
172
173
|
}
|
|
173
174
|
main().catch((err) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { PackageSource, SafePackageVersion } from '../utils/install-safety.js';
|
|
1
2
|
export interface Installer {
|
|
2
3
|
checkDeps(): Promise<void>;
|
|
3
|
-
install(version:
|
|
4
|
+
install(version: SafePackageVersion, packageSource?: PackageSource): Promise<void>;
|
|
4
5
|
configure(config: Record<string, unknown>): Promise<void>;
|
|
5
6
|
uninstall?(): Promise<void>;
|
|
6
7
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { Installer } from './base.js';
|
|
2
|
+
import type { PackageSource } from '../utils/install-safety.js';
|
|
2
3
|
export declare class ChannelInstaller implements Installer {
|
|
3
|
-
private channelName;
|
|
4
|
+
private readonly channelName;
|
|
4
5
|
constructor(channelName: string);
|
|
5
6
|
checkDeps(): Promise<void>;
|
|
6
|
-
install(version: string,
|
|
7
|
+
install(version: string, packageSource?: PackageSource): Promise<void>;
|
|
7
8
|
private verifyInstalled;
|
|
8
9
|
configure(config: Record<string, unknown>): Promise<void>;
|
|
9
10
|
/**
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, rmSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import {
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, rmSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { runCommand, runCommandCapture } from '../utils/shell.js';
|
|
3
3
|
import { ensureCommand, checkDiskSpace } from '../utils/deps.js';
|
|
4
4
|
import { info, warn } from '../utils/logger.js';
|
|
5
5
|
import { stopDaemonForExclusiveAccess } from '../utils/openclaw-daemon.js';
|
|
6
6
|
import { CHANNEL_NPM_PACKAGES, BUNDLED_PLUGINS, OKCLAW_TMP_DIR, OPENCLAW_HOME, NPM_REGISTRY } from '../utils/constants.js';
|
|
7
|
+
import { assertSafeInstallName, channelExtensionDir, tmpInstallPath } from '../utils/install-safety.js';
|
|
7
8
|
export class ChannelInstaller {
|
|
8
9
|
channelName;
|
|
9
10
|
constructor(channelName) {
|
|
10
|
-
this.channelName = channelName;
|
|
11
|
+
this.channelName = assertSafeInstallName('channel', channelName);
|
|
11
12
|
}
|
|
12
13
|
async checkDeps() {
|
|
13
14
|
await checkDiskSpace(200);
|
|
14
15
|
await ensureCommand('openclaw');
|
|
15
16
|
}
|
|
16
|
-
async install(version,
|
|
17
|
+
async install(version, packageSource) {
|
|
17
18
|
if (BUNDLED_PLUGINS.has(this.channelName)) {
|
|
18
19
|
info(`${this.channelName} is bundled with openclaw, skipping install (config only).`);
|
|
19
20
|
return;
|
|
@@ -32,8 +33,8 @@ export class ChannelInstaller {
|
|
|
32
33
|
// Clean up any stale state (both the extension dir AND config entries) so openclaw's
|
|
33
34
|
// config validation passes when `openclaw plugins install` runs.
|
|
34
35
|
this.cleanupStaleState();
|
|
35
|
-
if (
|
|
36
|
-
await this.installFromLocalPackage(
|
|
36
|
+
if (packageSource) {
|
|
37
|
+
await this.installFromLocalPackage(packageSource);
|
|
37
38
|
}
|
|
38
39
|
else {
|
|
39
40
|
await this.installViaNpmPack(version);
|
|
@@ -50,7 +51,7 @@ export class ChannelInstaller {
|
|
|
50
51
|
info(`${this.channelName}@${version} installed.`);
|
|
51
52
|
}
|
|
52
53
|
verifyInstalled() {
|
|
53
|
-
const pluginDir =
|
|
54
|
+
const pluginDir = channelExtensionDir(this.channelName);
|
|
54
55
|
if (!existsSync(pluginDir)) {
|
|
55
56
|
throw new Error(`Install verification failed: ${pluginDir} not found after "openclaw plugins install". ` +
|
|
56
57
|
`The install command may have silently skipped due to stale config; aborting before configure() runs.`);
|
|
@@ -81,7 +82,7 @@ export class ChannelInstaller {
|
|
|
81
82
|
* `openclaw ...` commands ("unknown channel id: <name>").
|
|
82
83
|
*/
|
|
83
84
|
cleanupStaleState() {
|
|
84
|
-
const pluginDir =
|
|
85
|
+
const pluginDir = channelExtensionDir(this.channelName);
|
|
85
86
|
const configFile = `${OPENCLAW_HOME}/openclaw.json`;
|
|
86
87
|
const hadDir = existsSync(pluginDir);
|
|
87
88
|
const hadJsonRef = this.hasJsonRef(configFile);
|
|
@@ -145,22 +146,22 @@ export class ChannelInstaller {
|
|
|
145
146
|
}
|
|
146
147
|
return false;
|
|
147
148
|
}
|
|
148
|
-
async installFromLocalPackage(
|
|
149
|
+
async installFromLocalPackage(packageSource) {
|
|
150
|
+
const archive = tmpInstallPath(`${this.channelName}-plugin.tgz`);
|
|
149
151
|
mkdirSync(OKCLAW_TMP_DIR, { recursive: true });
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
await shell(`curl -fsSL --connect-timeout 30 --retry 3 -o "${archive}" "${packageUrl}"`);
|
|
152
|
+
if (packageSource.kind === 'remote') {
|
|
153
|
+
info(`Downloading ${this.channelName} from ${packageSource.url}...`);
|
|
154
|
+
await runCommand('curl', ['-fsSL', '--connect-timeout', '30', '--retry', '3', '-o', archive, packageSource.url]);
|
|
154
155
|
}
|
|
155
|
-
else if (existsSync(
|
|
156
|
-
|
|
156
|
+
else if (existsSync(packageSource.path)) {
|
|
157
|
+
copyFileSync(packageSource.path, archive);
|
|
157
158
|
}
|
|
158
159
|
else {
|
|
159
|
-
throw new Error(`Package not found: ${
|
|
160
|
+
throw new Error(`Package not found: ${packageSource.path}`);
|
|
160
161
|
}
|
|
161
162
|
info(`Installing ${this.channelName} from local package...`);
|
|
162
|
-
await
|
|
163
|
-
|
|
163
|
+
await runCommand('openclaw', ['plugins', 'install', archive]);
|
|
164
|
+
rmSync(archive, { force: true });
|
|
164
165
|
}
|
|
165
166
|
/**
|
|
166
167
|
* Download tgz from npm (npmmirror) first, then install locally.
|
|
@@ -175,17 +176,23 @@ export class ChannelInstaller {
|
|
|
175
176
|
const pkgSpec = `${npmPkg}@${version}`;
|
|
176
177
|
mkdirSync(OKCLAW_TMP_DIR, { recursive: true });
|
|
177
178
|
info(`Downloading ${pkgSpec} from npm...`);
|
|
178
|
-
const packResult = await
|
|
179
|
+
const packResult = await runCommandCapture('npm', ['pack', pkgSpec, '--registry', NPM_REGISTRY], {
|
|
180
|
+
cwd: OKCLAW_TMP_DIR,
|
|
181
|
+
});
|
|
179
182
|
if (packResult.code !== 0) {
|
|
180
183
|
throw new Error(`npm pack failed for ${pkgSpec}: ${packResult.stderr}`);
|
|
181
184
|
}
|
|
182
|
-
const
|
|
185
|
+
const tgzName = packResult.stdout.split('\n').map((line) => line.trim()).filter(Boolean).at(-1);
|
|
186
|
+
if (!tgzName) {
|
|
187
|
+
throw new Error(`npm pack did not report an output file for ${pkgSpec}`);
|
|
188
|
+
}
|
|
189
|
+
const tgzFile = tmpInstallPath(tgzName);
|
|
183
190
|
if (!existsSync(tgzFile)) {
|
|
184
191
|
throw new Error(`npm pack did not produce expected file: ${tgzFile}`);
|
|
185
192
|
}
|
|
186
193
|
info(`Installing ${this.channelName} from ${tgzFile}...`);
|
|
187
|
-
await
|
|
188
|
-
|
|
194
|
+
await runCommand('openclaw', ['plugins', 'install', tgzFile]);
|
|
195
|
+
rmSync(tgzFile, { force: true });
|
|
189
196
|
}
|
|
190
197
|
async addToPluginsAllow() {
|
|
191
198
|
const configFile = `${OPENCLAW_HOME}/openclaw.json`;
|
|
@@ -250,12 +257,11 @@ export class ChannelInstaller {
|
|
|
250
257
|
}
|
|
251
258
|
else {
|
|
252
259
|
const isJsonValue = Array.isArray(value);
|
|
253
|
-
const strVal = (isJsonValue ? JSON.stringify(value) : String(value)).replace(/'/g, "'\\''");
|
|
254
260
|
// Let errors propagate — silently skipping a config set leaves openclaw.json
|
|
255
261
|
// in a half-written state that breaks config validation at runtime.
|
|
256
|
-
await
|
|
257
|
-
?
|
|
258
|
-
:
|
|
262
|
+
await runCommand('openclaw', isJsonValue
|
|
263
|
+
? ['config', 'set', path, JSON.stringify(value), '--strict-json']
|
|
264
|
+
: ['config', 'set', path, '--', String(value)]);
|
|
259
265
|
}
|
|
260
266
|
}
|
|
261
267
|
}
|