@okclaw-build/cli 1.0.0-beta.1 → 1.0.0-beta.12
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/check.js +1 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/edit.d.ts +2 -7
- package/dist/commands/edit.js +8 -13
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/feed.d.ts +0 -9
- package/dist/commands/feed.js +42 -97
- package/dist/commands/feed.js.map +1 -1
- package/dist/commands/install.js +6 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/show.d.ts +11 -0
- package/dist/commands/show.js +27 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/skill.d.ts +1 -0
- package/dist/commands/skill.js +72 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.js +28 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/index.js +26 -4
- package/dist/index.js.map +1 -1
- package/dist/installers/base.d.ts +1 -0
- package/dist/installers/channel.d.ts +10 -1
- package/dist/installers/channel.js +69 -8
- package/dist/installers/channel.js.map +1 -1
- package/dist/installers/openclaw.d.ts +1 -0
- package/dist/installers/openclaw.js +27 -4
- package/dist/installers/openclaw.js.map +1 -1
- package/dist/installers/openviking.js +1 -2
- package/dist/installers/openviking.js.map +1 -1
- package/dist/installers/skill.d.ts +9 -0
- package/dist/installers/skill.js +65 -0
- package/dist/installers/skill.js.map +1 -0
- package/dist/utils/constants.d.ts +0 -2
- package/dist/utils/constants.js +1 -4
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/deps.d.ts +0 -5
- package/dist/utils/deps.js +1 -88
- package/dist/utils/deps.js.map +1 -1
- package/package.json +3 -2
package/dist/commands/check.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { ensureNodeVersion
|
|
1
|
+
import { ensureNodeVersion } from '../utils/deps.js';
|
|
2
2
|
import { configureMirrors } from '../utils/mirror.js';
|
|
3
3
|
import { info, success } from '../utils/logger.js';
|
|
4
4
|
export async function checkCommand() {
|
|
5
5
|
info('Checking system dependencies...');
|
|
6
6
|
await ensureNodeVersion();
|
|
7
|
-
await ensurePython();
|
|
8
7
|
await configureMirrors();
|
|
9
8
|
success('All dependencies satisfied.');
|
|
10
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACxC,MAAM,iBAAiB,EAAE,CAAC;IAC1B,MAAM,gBAAgB,EAAE,CAAC;IACzB,OAAO,CAAC,6BAA6B,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/commands/edit.d.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Copies a file to the openclaw workspace directory.
|
|
5
|
-
* user → ~/.openclaw/workspace/USER.md
|
|
6
|
-
* identity → ~/.openclaw/workspace/IDENTITY.md
|
|
7
|
-
* soul → ~/.openclaw/workspace/SOUL.md
|
|
8
|
-
* agents → ~/.openclaw/workspace/AGENTS.md
|
|
2
|
+
* 7 个受支持的编辑目标:6 个 markdown 位于 workspace,openclaw.json 位于 OPENCLAW_HOME。
|
|
9
3
|
*/
|
|
4
|
+
export declare const TARGETS: Record<string, string>;
|
|
10
5
|
export declare function editCommand(args: string[]): Promise<void>;
|
package/dist/commands/edit.js
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
2
3
|
import { shell } from '../utils/shell.js';
|
|
3
4
|
import { info, error } from '../utils/logger.js';
|
|
4
|
-
import { OPENCLAW_WORKSPACE } from '../utils/constants.js';
|
|
5
|
+
import { OPENCLAW_HOME, OPENCLAW_WORKSPACE } from '../utils/constants.js';
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* 7 个受支持的编辑目标:6 个 markdown 位于 workspace,openclaw.json 位于 OPENCLAW_HOME。
|
|
7
8
|
*/
|
|
8
|
-
const TARGETS = {
|
|
9
|
+
export const TARGETS = {
|
|
9
10
|
user: `${OPENCLAW_WORKSPACE}/USER.md`,
|
|
10
11
|
identity: `${OPENCLAW_WORKSPACE}/IDENTITY.md`,
|
|
11
12
|
soul: `${OPENCLAW_WORKSPACE}/SOUL.md`,
|
|
12
13
|
agents: `${OPENCLAW_WORKSPACE}/AGENTS.md`,
|
|
14
|
+
memory: `${OPENCLAW_WORKSPACE}/MEMORY.md`,
|
|
15
|
+
tools: `${OPENCLAW_WORKSPACE}/TOOLS.md`,
|
|
16
|
+
'openclaw-json': `${OPENCLAW_HOME}/openclaw.json`,
|
|
13
17
|
};
|
|
14
|
-
/**
|
|
15
|
-
* okclaw edit <target> --file <path>
|
|
16
|
-
*
|
|
17
|
-
* Copies a file to the openclaw workspace directory.
|
|
18
|
-
* user → ~/.openclaw/workspace/USER.md
|
|
19
|
-
* identity → ~/.openclaw/workspace/IDENTITY.md
|
|
20
|
-
* soul → ~/.openclaw/workspace/SOUL.md
|
|
21
|
-
* agents → ~/.openclaw/workspace/AGENTS.md
|
|
22
|
-
*/
|
|
23
18
|
export async function editCommand(args) {
|
|
24
19
|
const target = args[0];
|
|
25
20
|
if (!target || !TARGETS[target]) {
|
|
@@ -37,7 +32,7 @@ export async function editCommand(args) {
|
|
|
37
32
|
process.exit(1);
|
|
38
33
|
}
|
|
39
34
|
const dest = TARGETS[target];
|
|
40
|
-
mkdirSync(
|
|
35
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
41
36
|
await shell(`cp -f '${filePath}' '${dest}'`);
|
|
42
37
|
info(`Written to ${dest}`);
|
|
43
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE1E;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,IAAI,EAAa,GAAG,kBAAkB,UAAU;IAChD,QAAQ,EAAS,GAAG,kBAAkB,cAAc;IACpD,IAAI,EAAa,GAAG,kBAAkB,UAAU;IAChD,MAAM,EAAW,GAAG,kBAAkB,YAAY;IAClD,MAAM,EAAW,GAAG,kBAAkB,YAAY;IAClD,KAAK,EAAY,GAAG,kBAAkB,WAAW;IACjD,eAAe,EAAE,GAAG,aAAa,gBAAgB;CAClD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,CAAC,UAAU,QAAQ,MAAM,IAAI,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/commands/feed.d.ts
CHANGED
|
@@ -1,10 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* okclaw feed --file <path>
|
|
3
|
-
*
|
|
4
|
-
* Feeds file content into OpenViking's memory system.
|
|
5
|
-
*
|
|
6
|
-
* - If the file is a .zip/.tar.gz, extract first then process each file.
|
|
7
|
-
* - For each text file, submit the entire file content as one session and extract memories.
|
|
8
|
-
* - Non-text files are added as resources (ov add-resource).
|
|
9
|
-
*/
|
|
10
1
|
export declare function feedCommand(args: string[]): Promise<void>;
|
package/dist/commands/feed.js
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, mkdirSync, rmSync
|
|
2
|
-
import { join, extname } from 'node:path';
|
|
3
|
-
import {
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, appendFileSync, readdirSync, statSync, mkdirSync, rmSync } from 'node:fs';
|
|
2
|
+
import { join, extname, basename } from 'node:path';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
4
|
import { info, warn, error, success } from '../utils/logger.js';
|
|
5
|
-
|
|
5
|
+
import { OPENCLAW_WORKSPACE } from '../utils/constants.js';
|
|
6
|
+
function run(cmd, args) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const child = spawn(cmd, args, { stdio: 'inherit' });
|
|
9
|
+
child.on('error', reject);
|
|
10
|
+
child.on('close', (code) => {
|
|
11
|
+
if (code === 0)
|
|
12
|
+
resolve();
|
|
13
|
+
else
|
|
14
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
const MEMORY_FILE = `${OPENCLAW_WORKSPACE}/MEMORY.md`;
|
|
6
19
|
const TEXT_EXTENSIONS = new Set(['.md', '.txt', '.text', '.csv', '.json', '.xml', '.yaml', '.yml', '.log']);
|
|
7
|
-
/**
|
|
8
|
-
* okclaw feed --file <path>
|
|
9
|
-
*
|
|
10
|
-
* Feeds file content into OpenViking's memory system.
|
|
11
|
-
*
|
|
12
|
-
* - If the file is a .zip/.tar.gz, extract first then process each file.
|
|
13
|
-
* - For each text file, submit the entire file content as one session and extract memories.
|
|
14
|
-
* - Non-text files are added as resources (ov add-resource).
|
|
15
|
-
*/
|
|
16
20
|
export async function feedCommand(args) {
|
|
17
21
|
const fileIdx = args.indexOf('--file');
|
|
18
22
|
const filePath = fileIdx >= 0 ? args[fileIdx + 1] : undefined;
|
|
@@ -24,17 +28,23 @@ export async function feedCommand(args) {
|
|
|
24
28
|
error(`File not found: ${filePath}`);
|
|
25
29
|
process.exit(1);
|
|
26
30
|
}
|
|
31
|
+
mkdirSync(OPENCLAW_WORKSPACE, { recursive: true });
|
|
27
32
|
const ext = extname(filePath).toLowerCase();
|
|
28
33
|
if (ext === '.zip' || ext === '.gz' || ext === '.tgz' || filePath.endsWith('.tar.gz')) {
|
|
29
34
|
await feedArchive(filePath);
|
|
30
35
|
}
|
|
31
36
|
else if (isTextFile(ext)) {
|
|
32
|
-
|
|
37
|
+
const content = readFileSync(filePath, 'utf-8').trim();
|
|
38
|
+
if (!content) {
|
|
39
|
+
warn('Empty file, skipping');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
writeFileSync(MEMORY_FILE, `# Memory\n\n## ${basename(filePath)}\n\n${content}\n`);
|
|
43
|
+
success(`MEMORY.md written (${content.length} chars)`);
|
|
33
44
|
}
|
|
34
45
|
else {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
success('Resource added.');
|
|
46
|
+
error(`Unsupported file type: ${ext}`);
|
|
47
|
+
process.exit(1);
|
|
38
48
|
}
|
|
39
49
|
}
|
|
40
50
|
async function feedArchive(archivePath) {
|
|
@@ -43,99 +53,34 @@ async function feedArchive(archivePath) {
|
|
|
43
53
|
try {
|
|
44
54
|
const ext = extname(archivePath).toLowerCase();
|
|
45
55
|
if (ext === '.zip') {
|
|
46
|
-
await
|
|
56
|
+
await run('unzip', ['-o', archivePath, '-d', tmpDir]);
|
|
47
57
|
}
|
|
48
58
|
else {
|
|
49
|
-
await
|
|
59
|
+
await run('tar', ['xzf', archivePath, '-C', tmpDir]);
|
|
50
60
|
}
|
|
51
61
|
const files = collectFiles(tmpDir);
|
|
52
62
|
info(`Extracted ${files.length} file(s) from archive`);
|
|
53
|
-
|
|
54
|
-
|
|
63
|
+
writeFileSync(MEMORY_FILE, '# Memory\n');
|
|
64
|
+
let count = 0;
|
|
65
|
+
for (const file of files) {
|
|
55
66
|
const fileExt = extname(file).toLowerCase();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
await shell(`ov add-resource '${file}' -o json`);
|
|
62
|
-
info(' Added as resource');
|
|
67
|
+
if (!isTextFile(fileExt)) {
|
|
68
|
+
warn(`Skipping non-text file: ${basename(file)}`);
|
|
69
|
+
continue;
|
|
63
70
|
}
|
|
71
|
+
const content = readFileSync(file, 'utf-8').trim();
|
|
72
|
+
if (!content)
|
|
73
|
+
continue;
|
|
74
|
+
appendFileSync(MEMORY_FILE, `\n## ${basename(file)}\n\n${content}\n`);
|
|
75
|
+
count++;
|
|
76
|
+
info(`[${count}] Appended: ${basename(file)} (${content.length} chars)`);
|
|
64
77
|
}
|
|
65
|
-
success(`
|
|
78
|
+
success(`MEMORY.md written with ${count} file(s)`);
|
|
66
79
|
}
|
|
67
80
|
finally {
|
|
68
81
|
rmSync(tmpDir, { recursive: true, force: true });
|
|
69
82
|
}
|
|
70
83
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Feed an entire text file as one session → extract memories.
|
|
73
|
-
* Whole-file submission gives LLM full context for better memory extraction.
|
|
74
|
-
*/
|
|
75
|
-
async function feedTextFile(filePath) {
|
|
76
|
-
const content = readFileSync(filePath, 'utf-8').trim();
|
|
77
|
-
if (!content) {
|
|
78
|
-
warn(`Skipping empty file: ${filePath}`);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
info(` Feeding file content (${content.length} chars)...`);
|
|
82
|
-
// 1. Create session
|
|
83
|
-
const createResult = await curlJson('POST', `${OV_API}/api/v1/sessions`, {});
|
|
84
|
-
const sessionId = createResult?.result?.session_id;
|
|
85
|
-
if (!sessionId) {
|
|
86
|
-
throw new Error('Failed to create session');
|
|
87
|
-
}
|
|
88
|
-
try {
|
|
89
|
-
// 2. Add entire file as one user message
|
|
90
|
-
await curlJson('POST', `${OV_API}/api/v1/sessions/${sessionId}/messages`, {
|
|
91
|
-
role: 'user',
|
|
92
|
-
content,
|
|
93
|
-
});
|
|
94
|
-
// 3. Extract memories (sync — waits for LLM to analyze and extract, may take minutes)
|
|
95
|
-
const extractResult = await curlJson('POST', `${OV_API}/api/v1/sessions/${sessionId}/extract`, {});
|
|
96
|
-
const memories = Array.isArray(extractResult?.result) ? extractResult.result : [];
|
|
97
|
-
info(` Extracted ${memories.length} memories`);
|
|
98
|
-
}
|
|
99
|
-
finally {
|
|
100
|
-
// 4. Cleanup session (ignore errors — best effort)
|
|
101
|
-
try {
|
|
102
|
-
await curlJson('DELETE', `${OV_API}/api/v1/sessions/${sessionId}`, null);
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// session cleanup is best-effort
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
-
async function curlJson(method, url, body) {
|
|
111
|
-
let cmd;
|
|
112
|
-
let tmpFile = null;
|
|
113
|
-
if (body === null) {
|
|
114
|
-
cmd = `curl -s -X ${method} '${url}'`;
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
tmpFile = `/tmp/okclaw_curl_${process.pid}_${Date.now()}.json`;
|
|
118
|
-
writeFileSync(tmpFile, JSON.stringify(body), 'utf-8');
|
|
119
|
-
cmd = `curl -s -X ${method} '${url}' -H 'Content-Type: application/json' -d @'${tmpFile}'`;
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
const result = await shellCapture(cmd);
|
|
123
|
-
if (result.code !== 0) {
|
|
124
|
-
throw new Error(`curl failed: ${result.stderr}`);
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
return JSON.parse(result.stdout);
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
throw new Error(`Invalid JSON response: ${result.stdout}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
if (tmpFile && existsSync(tmpFile)) {
|
|
135
|
-
unlinkSync(tmpFile);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
84
|
function isTextFile(ext) {
|
|
140
85
|
return TEXT_EXTENSIONS.has(ext);
|
|
141
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/commands/feed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/commands/feed.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -2,13 +2,18 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { OpenclawInstaller } from '../installers/openclaw.js';
|
|
3
3
|
import { OpenvikingInstaller } from '../installers/openviking.js';
|
|
4
4
|
import { ChannelInstaller } from '../installers/channel.js';
|
|
5
|
+
import { SkillInstaller } from '../installers/skill.js';
|
|
5
6
|
import { configureMirrors } from '../utils/mirror.js';
|
|
6
7
|
import { info, error, success } from '../utils/logger.js';
|
|
7
8
|
function getInstaller(component) {
|
|
8
9
|
switch (component) {
|
|
9
10
|
case 'openclaw': return new OpenclawInstaller();
|
|
10
11
|
case 'openviking': return new OpenvikingInstaller();
|
|
11
|
-
default:
|
|
12
|
+
default:
|
|
13
|
+
if (component.startsWith('skill:')) {
|
|
14
|
+
return new SkillInstaller(component.substring('skill:'.length));
|
|
15
|
+
}
|
|
16
|
+
return new ChannelInstaller(component);
|
|
12
17
|
}
|
|
13
18
|
}
|
|
14
19
|
export async function installCommand(args) {
|
|
@@ -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,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE1D,SAAS,YAAY,CAAC,SAAiB;IACrC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAChD,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;QACpD,OAAO,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* okclaw show <target>
|
|
3
|
+
*
|
|
4
|
+
* 把 target 对应的文件内容原样输出到 stdout。
|
|
5
|
+
* - 文件存在 → 输出文件内容,exit 0
|
|
6
|
+
* - 文件不存在 → 输出空内容,exit 0(视为尚未创建)
|
|
7
|
+
* - target 非法 → stderr 提示,exit 1
|
|
8
|
+
*
|
|
9
|
+
* `targets` 参数用于测试注入;生产调用不传第二个参数,使用 edit.ts 导出的 TARGETS。
|
|
10
|
+
*/
|
|
11
|
+
export declare function showCommand(args: string[], targets?: Record<string, string>): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { error } from '../utils/logger.js';
|
|
3
|
+
import { TARGETS as DEFAULT_TARGETS } from './edit.js';
|
|
4
|
+
/**
|
|
5
|
+
* okclaw show <target>
|
|
6
|
+
*
|
|
7
|
+
* 把 target 对应的文件内容原样输出到 stdout。
|
|
8
|
+
* - 文件存在 → 输出文件内容,exit 0
|
|
9
|
+
* - 文件不存在 → 输出空内容,exit 0(视为尚未创建)
|
|
10
|
+
* - target 非法 → stderr 提示,exit 1
|
|
11
|
+
*
|
|
12
|
+
* `targets` 参数用于测试注入;生产调用不传第二个参数,使用 edit.ts 导出的 TARGETS。
|
|
13
|
+
*/
|
|
14
|
+
export async function showCommand(args, targets = DEFAULT_TARGETS) {
|
|
15
|
+
const target = args[0];
|
|
16
|
+
if (!target || !targets[target]) {
|
|
17
|
+
error(`Usage: okclaw show <${Object.keys(targets).join('|')}>`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const path = targets[target];
|
|
21
|
+
if (!existsSync(path)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const content = readFileSync(path, 'utf8');
|
|
25
|
+
process.stdout.write(content);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AAEvD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAc,EACd,UAAkC,eAAe;IAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function skillCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { SkillInstaller } from '../installers/skill.js';
|
|
3
|
+
import { configureMirrors } from '../utils/mirror.js';
|
|
4
|
+
import { info, error, success } from '../utils/logger.js';
|
|
5
|
+
export async function skillCommand(args) {
|
|
6
|
+
const subCommand = args[0];
|
|
7
|
+
const skillName = args[1];
|
|
8
|
+
if (!subCommand || !['install', 'uninstall'].includes(subCommand)) {
|
|
9
|
+
error('Usage: okclaw skill <install|uninstall> <name> [options]');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
if (!skillName) {
|
|
13
|
+
error(`Usage: okclaw skill ${subCommand} <name>${subCommand === 'install' ? ' --version <ver> [--package-url <url>]' : ''}`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const installer = new SkillInstaller(skillName);
|
|
17
|
+
if (subCommand === 'uninstall') {
|
|
18
|
+
info(`Uninstalling skill ${skillName}...`);
|
|
19
|
+
await installer.uninstall();
|
|
20
|
+
success(`Skill ${skillName} uninstalled.`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// install
|
|
24
|
+
let version = '';
|
|
25
|
+
let config;
|
|
26
|
+
let packageUrl;
|
|
27
|
+
for (let i = 2; i < args.length; i++) {
|
|
28
|
+
const arg = args[i];
|
|
29
|
+
if ((arg === '--version' || arg.startsWith('--version=')) && !version) {
|
|
30
|
+
version = arg.includes('=') ? arg.split('=')[1] : args[++i];
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (arg === '--config' && args[i + 1]) {
|
|
34
|
+
try {
|
|
35
|
+
config = JSON.parse(args[++i]);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
error('Invalid --config JSON');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if ((arg === '--config-file' || arg.startsWith('--config-file=')) && !config) {
|
|
44
|
+
const filePath = arg.includes('=') ? arg.split('=')[1] : args[++i];
|
|
45
|
+
try {
|
|
46
|
+
config = JSON.parse(readFileSync(filePath, 'utf8'));
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
error(`Failed to read config file: ${e}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if ((arg === '--package-url' || arg.startsWith('--package-url=')) && !packageUrl) {
|
|
55
|
+
packageUrl = arg.includes('=') ? arg.split('=')[1] : args[++i];
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (!version) {
|
|
60
|
+
error('--version is required for install');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
info(`Installing skill ${skillName}@${version}...`);
|
|
64
|
+
await installer.checkDeps();
|
|
65
|
+
await configureMirrors();
|
|
66
|
+
await installer.install(version, packageUrl);
|
|
67
|
+
if (config) {
|
|
68
|
+
await installer.configure(config);
|
|
69
|
+
}
|
|
70
|
+
success(`Skill ${skillName}@${version} installed.`);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function uninstallCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OpenclawInstaller } from '../installers/openclaw.js';
|
|
2
|
+
import { error, info, success } from '../utils/logger.js';
|
|
3
|
+
function getInstaller(component) {
|
|
4
|
+
switch (component) {
|
|
5
|
+
case 'openclaw': return new OpenclawInstaller();
|
|
6
|
+
default: return null;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export async function uninstallCommand(args) {
|
|
10
|
+
const component = args[0];
|
|
11
|
+
if (!component) {
|
|
12
|
+
error('Usage: okclaw uninstall <component>');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const installer = getInstaller(component);
|
|
16
|
+
if (!installer) {
|
|
17
|
+
error(`Uninstall not supported for component: ${component}`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
if (!installer.uninstall) {
|
|
21
|
+
error(`Component ${component} does not support uninstall`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
info(`Uninstalling ${component}...`);
|
|
25
|
+
await installer.uninstall();
|
|
26
|
+
success(`${component} uninstalled.`);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE1D,SAAS,YAAY,CAAC,SAAiB;IACrC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAChD,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACzB,KAAK,CAAC,aAAa,SAAS,6BAA6B,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,gBAAgB,SAAS,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,SAAS,eAAe,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
1
2
|
import { installCommand } from './commands/install.js';
|
|
3
|
+
import { uninstallCommand } from './commands/uninstall.js';
|
|
2
4
|
import { checkCommand } from './commands/check.js';
|
|
3
5
|
import { editCommand } from './commands/edit.js';
|
|
6
|
+
import { showCommand } from './commands/show.js';
|
|
4
7
|
import { feedCommand } from './commands/feed.js';
|
|
5
8
|
import { startCommand, stopCommand, restartCommand, statusCommand } from './commands/service.js';
|
|
9
|
+
import { skillCommand } from './commands/skill.js';
|
|
6
10
|
import { ensureRoot } from './utils/shell.js';
|
|
7
11
|
import { error } from './utils/logger.js';
|
|
8
12
|
const [command, ...args] = process.argv.slice(2);
|
|
@@ -12,9 +16,15 @@ async function main() {
|
|
|
12
16
|
ensureRoot();
|
|
13
17
|
}
|
|
14
18
|
switch (command) {
|
|
19
|
+
case 'skill':
|
|
20
|
+
await skillCommand(args);
|
|
21
|
+
break;
|
|
15
22
|
case 'install':
|
|
16
23
|
await installCommand(args);
|
|
17
24
|
break;
|
|
25
|
+
case 'uninstall':
|
|
26
|
+
await uninstallCommand(args);
|
|
27
|
+
break;
|
|
18
28
|
case 'check':
|
|
19
29
|
await checkCommand();
|
|
20
30
|
break;
|
|
@@ -33,13 +43,18 @@ async function main() {
|
|
|
33
43
|
case 'edit':
|
|
34
44
|
await editCommand(args);
|
|
35
45
|
break;
|
|
46
|
+
case 'show':
|
|
47
|
+
await showCommand(args);
|
|
48
|
+
break;
|
|
36
49
|
case 'feed':
|
|
37
50
|
await feedCommand(args);
|
|
38
51
|
break;
|
|
39
52
|
case '--version':
|
|
40
|
-
case '-v':
|
|
41
|
-
|
|
53
|
+
case '-v': {
|
|
54
|
+
const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
|
|
55
|
+
console.log(pkg.version);
|
|
42
56
|
break;
|
|
57
|
+
}
|
|
43
58
|
case '--help':
|
|
44
59
|
case '-h':
|
|
45
60
|
case undefined:
|
|
@@ -57,13 +72,17 @@ okclaw - OKClaw Deployment CLI
|
|
|
57
72
|
|
|
58
73
|
Usage: okclaw <command> [args...]
|
|
59
74
|
|
|
75
|
+
okclaw skill install <name> --version <ver> [--package-url <url>] Install a skill
|
|
76
|
+
okclaw skill uninstall <name> Uninstall a skill
|
|
60
77
|
okclaw install <component> --version <ver> [--config '<json>'] [--config-file <path>] [--package-url <url>]
|
|
78
|
+
okclaw uninstall <component> Uninstall a component (currently: openclaw)
|
|
61
79
|
okclaw check Check & install system dependencies
|
|
62
80
|
okclaw start Start openclaw gateway
|
|
63
81
|
okclaw stop Stop openclaw gateway
|
|
64
82
|
okclaw restart Restart openclaw gateway
|
|
65
83
|
okclaw status Show gateway status
|
|
66
|
-
okclaw edit <target> --file <path> Write config file (user/identity/soul/agents)
|
|
84
|
+
okclaw edit <target> --file <path> Write config file (user/identity/soul/agents/memory/tools/openclaw-json)
|
|
85
|
+
okclaw show <target> Read config file content to stdout (user/identity/soul/agents/memory/tools/openclaw-json)
|
|
67
86
|
okclaw feed --file <path> Feed file into knowledge base
|
|
68
87
|
|
|
69
88
|
Components:
|
|
@@ -79,6 +98,9 @@ Examples:
|
|
|
79
98
|
okclaw install openviking --version 0.2.15 --package-url /tmp/ov-plugin.tar.gz --config-file /root/okclaw/config/openviking.json
|
|
80
99
|
okclaw install dingtalk --version 2.0.1 --config '{"clientId":"xxx","clientSecret":"xxx"}'
|
|
81
100
|
okclaw install s3 --version 1.0.0 --package-url /tmp/channel-s3.tar.gz
|
|
101
|
+
okclaw uninstall openclaw
|
|
102
|
+
okclaw skill install my-skill --version 1.0.0 --package-url https://example.com/skill.zip
|
|
103
|
+
okclaw skill uninstall my-skill
|
|
82
104
|
okclaw restart
|
|
83
105
|
okclaw status
|
|
84
106
|
|
|
@@ -86,7 +108,7 @@ Notes:
|
|
|
86
108
|
- All commands auto-elevate to root via sudo if needed
|
|
87
109
|
- All paths are anchored to /root/ (forced HOME=/root)
|
|
88
110
|
- npm uses npmmirror, pip uses tsinghua mirror (China acceleration)
|
|
89
|
-
- Node.js >= 22.16
|
|
111
|
+
- Node.js >= 22.16 is auto-installed if missing
|
|
90
112
|
`);
|
|
91
113
|
}
|
|
92
114
|
main().catch((err) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEjD,KAAK,UAAU,IAAI;IACjB,2CAA2C;IAC3C,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACvG,UAAU,EAAE,CAAC;IACf,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,EAAE,CAAC;YACtB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|