@onkernel/cli 0.8.3 → 0.9.1
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/README.md +41 -0
- package/lib.js +9 -61
- package/package.json +19 -20
package/README.md
CHANGED
|
@@ -106,12 +106,14 @@ Create an API key from the [Kernel dashboard](https://dashboard.onkernel.com).
|
|
|
106
106
|
### App Deployment
|
|
107
107
|
|
|
108
108
|
- `kernel deploy <file>` - Deploy an app to Kernel
|
|
109
|
+
|
|
109
110
|
- `--version <version>` - Specify app version (default: latest)
|
|
110
111
|
- `--force` - Allow overwriting existing version
|
|
111
112
|
- `--env <KEY=VALUE>`, `-e` - Set environment variables (can be used multiple times)
|
|
112
113
|
- `--env-file <file>` - Load environment variables from file (can be used multiple times)
|
|
113
114
|
|
|
114
115
|
- `kernel deploy logs <deployment_id>` - Stream logs for a deployment
|
|
116
|
+
|
|
115
117
|
- `--follow`, `-f` - Follow logs in real-time (stream continuously)
|
|
116
118
|
- `--since`, `-s` - How far back to retrieve logs. Duration formats: ns, us, ms, s, m, h (e.g., 5m, 2h, 1h30m). Timestamps also supported: 2006-01-02, 2006-01-02T15:04, 2006-01-02T15:04:05, 2006-01-02T15:04:05.000
|
|
117
119
|
- `--with-timestamps`, `-t` - Include timestamps in each log line
|
|
@@ -234,6 +236,23 @@ Create an API key from the [Kernel dashboard](https://dashboard.onkernel.com).
|
|
|
234
236
|
- `--mode <mode>` - File mode (octal string)
|
|
235
237
|
- `--source <path>` - Local source file path (required)
|
|
236
238
|
|
|
239
|
+
### Browser Extensions
|
|
240
|
+
|
|
241
|
+
- `kernel browsers extensions upload <id or persistent id> <extension-path>...` - Ad-hoc upload of one or more unpacked extensions to a running browser instance.
|
|
242
|
+
|
|
243
|
+
### Extension Management
|
|
244
|
+
|
|
245
|
+
- `kernel extensions list` - List all uploaded extensions
|
|
246
|
+
- `kernel extensions upload <directory>` - Upload an unpacked browser extension directory
|
|
247
|
+
- `--name <name>` - Optional unique extension name
|
|
248
|
+
- `kernel extensions download <id-or-name>` - Download an extension archive
|
|
249
|
+
- `--to <directory>` - Output directory (required)
|
|
250
|
+
- `kernel extensions download-web-store <url>` - Download an extension from the Chrome Web Store
|
|
251
|
+
- `--to <directory>` - Output directory (required)
|
|
252
|
+
- `--os <os>` - Target OS: mac, win, or linux (default: linux)
|
|
253
|
+
- `kernel extensions delete <id-or-name>` - Delete an extension by ID or name
|
|
254
|
+
- `-y, --yes` - Skip confirmation prompt
|
|
255
|
+
|
|
237
256
|
## Examples
|
|
238
257
|
|
|
239
258
|
### Deploy with environment variables
|
|
@@ -309,6 +328,28 @@ kernel browsers fs upload my-browser --file "local.txt:remote.txt" --dest-dir "/
|
|
|
309
328
|
kernel browsers fs list-files my-browser --path "/tmp"
|
|
310
329
|
```
|
|
311
330
|
|
|
331
|
+
### Extension management
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
# List all uploaded extensions
|
|
335
|
+
kernel extensions list
|
|
336
|
+
|
|
337
|
+
# Upload an unpacked extension directory
|
|
338
|
+
kernel extensions upload ./my-extension --name my-custom-extension
|
|
339
|
+
|
|
340
|
+
# Download an extension from Chrome Web Store
|
|
341
|
+
kernel extensions download-web-store "https://chrome.google.com/webstore/detail/extension-id" --to ./downloaded-extension
|
|
342
|
+
|
|
343
|
+
# Download a previously uploaded extension
|
|
344
|
+
kernel extensions download my-extension-id --to ./my-extension
|
|
345
|
+
|
|
346
|
+
# Delete an extension
|
|
347
|
+
kernel extensions delete my-extension-name --yes
|
|
348
|
+
|
|
349
|
+
# Upload extensions to a running browser instance
|
|
350
|
+
kernel browsers extensions upload my-browser ./extension1 ./extension2
|
|
351
|
+
```
|
|
352
|
+
|
|
312
353
|
## Getting Help
|
|
313
354
|
|
|
314
355
|
- `kernel --help` - Show all available commands
|
package/lib.js
CHANGED
|
@@ -6,18 +6,8 @@ const path = require("path");
|
|
|
6
6
|
const JSZip = require("jszip");
|
|
7
7
|
const tar = require("tar");
|
|
8
8
|
const axios = require("axios");
|
|
9
|
-
const ProxyAgent = require("proxy-agent");
|
|
10
9
|
const { spawnSync } = require("child_process");
|
|
11
10
|
|
|
12
|
-
const proxyUrl =
|
|
13
|
-
process.env.HTTPS_PROXY ||
|
|
14
|
-
process.env.https_proxy ||
|
|
15
|
-
process.env.HTTP_PROXY ||
|
|
16
|
-
process.env.http_proxy ||
|
|
17
|
-
null;
|
|
18
|
-
|
|
19
|
-
const agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;
|
|
20
|
-
|
|
21
11
|
const getArchive = () => {
|
|
22
12
|
let target = `${process.platform}-${process.arch}`;
|
|
23
13
|
const archive = archives[target];
|
|
@@ -29,61 +19,31 @@ const getArchive = () => {
|
|
|
29
19
|
|
|
30
20
|
const binDir = path.join(__dirname, "bin");
|
|
31
21
|
|
|
32
|
-
async function extractTar(tarPath, binaries, dir
|
|
22
|
+
async function extractTar(tarPath, binaries, dir) {
|
|
33
23
|
try {
|
|
34
|
-
const filesToExtract = wrappedIn
|
|
35
|
-
? binaries.map((bin) =>
|
|
36
|
-
path.join(wrappedIn, bin).replace(/\\/g, "/"),
|
|
37
|
-
)
|
|
38
|
-
: binaries;
|
|
39
|
-
|
|
40
24
|
await tar.x({
|
|
41
25
|
file: tarPath,
|
|
42
26
|
cwd: dir,
|
|
43
|
-
filter: (path) =>
|
|
27
|
+
filter: (path) => binaries.includes(path),
|
|
44
28
|
});
|
|
45
|
-
|
|
46
|
-
// If wrapped, move files from wrapped directory to bin directory
|
|
47
|
-
if (wrappedIn) {
|
|
48
|
-
const wrappedDir = path.join(dir, wrappedIn);
|
|
49
|
-
for (const binary of binaries) {
|
|
50
|
-
const srcPath = path.join(wrappedDir, binary);
|
|
51
|
-
const destPath = path.join(dir, binary);
|
|
52
|
-
if (fs.existsSync(srcPath)) {
|
|
53
|
-
fs.renameSync(srcPath, destPath);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Clean up empty wrapped directory
|
|
57
|
-
try {
|
|
58
|
-
fs.rmSync(wrappedDir, { recursive: true, force: true });
|
|
59
|
-
} catch (err) {
|
|
60
|
-
// Ignore cleanup errors
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
console.log(`Successfully extracted ${binaries} to "${dir}"`);
|
|
29
|
+
console.log(`Successfully extracted binaries to "${dir}"`);
|
|
65
30
|
} catch (err) {
|
|
66
31
|
throw new Error(`Extraction failed: ${err.message}`);
|
|
67
32
|
}
|
|
68
33
|
}
|
|
69
34
|
|
|
70
|
-
async function extractZip(zipPath, binaries, dir
|
|
35
|
+
async function extractZip(zipPath, binaries, dir) {
|
|
71
36
|
try {
|
|
72
37
|
const zipData = fs.readFileSync(zipPath);
|
|
73
38
|
const zip = await JSZip.loadAsync(zipData);
|
|
74
|
-
|
|
75
39
|
for (const binary of binaries) {
|
|
76
|
-
|
|
77
|
-
? path.join(wrappedIn, binary).replace(/\\/g, "/")
|
|
78
|
-
: binary;
|
|
79
|
-
|
|
80
|
-
if (!zip.files[binaryPath]) {
|
|
40
|
+
if (!zip.files[binary]) {
|
|
81
41
|
throw new Error(
|
|
82
|
-
`Error: ${
|
|
42
|
+
`Error: ${binary} does not exist in ${zipPath}`,
|
|
83
43
|
);
|
|
84
44
|
}
|
|
85
45
|
|
|
86
|
-
const content = await zip.files[
|
|
46
|
+
const content = await zip.files[binary].async("nodebuffer");
|
|
87
47
|
if (!fs.existsSync(dir)) {
|
|
88
48
|
fs.mkdirSync(dir, { recursive: true });
|
|
89
49
|
}
|
|
@@ -134,21 +94,11 @@ const install = async () => {
|
|
|
134
94
|
fs.chmodSync(bin, 0o755);
|
|
135
95
|
return;
|
|
136
96
|
case "zip":
|
|
137
|
-
return extractZip(
|
|
138
|
-
archivePath,
|
|
139
|
-
archive.bins,
|
|
140
|
-
binDir,
|
|
141
|
-
archive.wrappedIn,
|
|
142
|
-
);
|
|
97
|
+
return extractZip(archivePath, archive.bins, binDir);
|
|
143
98
|
case "tar":
|
|
144
99
|
case "tar.gz":
|
|
145
100
|
case "tgz":
|
|
146
|
-
return extractTar(
|
|
147
|
-
archivePath,
|
|
148
|
-
archive.bins,
|
|
149
|
-
binDir,
|
|
150
|
-
archive.wrappedIn,
|
|
151
|
-
);
|
|
101
|
+
return extractTar(archivePath, archive.bins, binDir);
|
|
152
102
|
case "tar.zst":
|
|
153
103
|
case "tzst":
|
|
154
104
|
case "tar.xz":
|
|
@@ -190,8 +140,6 @@ const download = async (url, filename) => {
|
|
|
190
140
|
url: url,
|
|
191
141
|
responseType: "stream",
|
|
192
142
|
timeout: 300000, // 5min
|
|
193
|
-
httpAgent: agent,
|
|
194
|
-
httpsAgent: agent,
|
|
195
143
|
});
|
|
196
144
|
|
|
197
145
|
const writer = fs.createWriteStream(filename);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onkernel/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Kernel CLI",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"postinstall": "node install.js",
|
|
@@ -29,80 +29,79 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"axios": "^1.8.2",
|
|
31
31
|
"jszip": "^3.10.1",
|
|
32
|
-
"proxy-agent": "^6.5.0",
|
|
33
32
|
"tar": "^7.4.3"
|
|
34
33
|
},
|
|
35
34
|
"archives": {
|
|
36
35
|
"darwin-arm64": {
|
|
37
|
-
"name": "kernel_0.
|
|
38
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.
|
|
36
|
+
"name": "kernel_0.9.1_darwin_arm64.tar.gz",
|
|
37
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.9.1/kernel_0.9.1_darwin_arm64.tar.gz",
|
|
39
38
|
"bins": [
|
|
40
39
|
"kernel"
|
|
41
40
|
],
|
|
42
41
|
"format": "tar.gz",
|
|
43
42
|
"checksum": {
|
|
44
43
|
"algorithm": "sha256",
|
|
45
|
-
"digest": "
|
|
44
|
+
"digest": "c5411e6c8974901ed01ef193d8dd4bb281bdba430b3fc4a86d01a26e9e14c34d"
|
|
46
45
|
}
|
|
47
46
|
},
|
|
48
47
|
"darwin-x64": {
|
|
49
|
-
"name": "kernel_0.
|
|
50
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.
|
|
48
|
+
"name": "kernel_0.9.1_darwin_amd64.tar.gz",
|
|
49
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.9.1/kernel_0.9.1_darwin_amd64.tar.gz",
|
|
51
50
|
"bins": [
|
|
52
51
|
"kernel"
|
|
53
52
|
],
|
|
54
53
|
"format": "tar.gz",
|
|
55
54
|
"checksum": {
|
|
56
55
|
"algorithm": "sha256",
|
|
57
|
-
"digest": "
|
|
56
|
+
"digest": "095407098a594fc77f34828a0599230e17cb17afdc76cc52c4d9a19316184729"
|
|
58
57
|
}
|
|
59
58
|
},
|
|
60
59
|
"linux-arm64": {
|
|
61
|
-
"name": "kernel_0.
|
|
62
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.
|
|
60
|
+
"name": "kernel_0.9.1_linux_arm64.tar.gz",
|
|
61
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.9.1/kernel_0.9.1_linux_arm64.tar.gz",
|
|
63
62
|
"bins": [
|
|
64
63
|
"kernel"
|
|
65
64
|
],
|
|
66
65
|
"format": "tar.gz",
|
|
67
66
|
"checksum": {
|
|
68
67
|
"algorithm": "sha256",
|
|
69
|
-
"digest": "
|
|
68
|
+
"digest": "c161a5da37a7fec0ac308cd72a56e41b1ae3de01079d67d94cad17593963ae4d"
|
|
70
69
|
}
|
|
71
70
|
},
|
|
72
71
|
"linux-x64": {
|
|
73
|
-
"name": "kernel_0.
|
|
74
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.
|
|
72
|
+
"name": "kernel_0.9.1_linux_amd64.tar.gz",
|
|
73
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.9.1/kernel_0.9.1_linux_amd64.tar.gz",
|
|
75
74
|
"bins": [
|
|
76
75
|
"kernel"
|
|
77
76
|
],
|
|
78
77
|
"format": "tar.gz",
|
|
79
78
|
"checksum": {
|
|
80
79
|
"algorithm": "sha256",
|
|
81
|
-
"digest": "
|
|
80
|
+
"digest": "7ed1d4a3b2a68ff446fc2fb6eb5d7ece95ccac51248a8b71f87184ba23c16d25"
|
|
82
81
|
}
|
|
83
82
|
},
|
|
84
83
|
"win32-arm64": {
|
|
85
|
-
"name": "kernel_0.
|
|
86
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.
|
|
84
|
+
"name": "kernel_0.9.1_windows_arm64.tar.gz",
|
|
85
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.9.1/kernel_0.9.1_windows_arm64.tar.gz",
|
|
87
86
|
"bins": [
|
|
88
87
|
"kernel.exe"
|
|
89
88
|
],
|
|
90
89
|
"format": "tar.gz",
|
|
91
90
|
"checksum": {
|
|
92
91
|
"algorithm": "sha256",
|
|
93
|
-
"digest": "
|
|
92
|
+
"digest": "012f2bb76f95688084c2e7150c3201d2581f594bc292523d5f119ac808caa1ba"
|
|
94
93
|
}
|
|
95
94
|
},
|
|
96
95
|
"win32-x64": {
|
|
97
|
-
"name": "kernel_0.
|
|
98
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.
|
|
96
|
+
"name": "kernel_0.9.1_windows_amd64.tar.gz",
|
|
97
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.9.1/kernel_0.9.1_windows_amd64.tar.gz",
|
|
99
98
|
"bins": [
|
|
100
99
|
"kernel.exe"
|
|
101
100
|
],
|
|
102
101
|
"format": "tar.gz",
|
|
103
102
|
"checksum": {
|
|
104
103
|
"algorithm": "sha256",
|
|
105
|
-
"digest": "
|
|
104
|
+
"digest": "921f62567e7be8adc379c256899695603f80596184d5589d301eabec1de17335"
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
107
|
}
|