typescript-virtual-container 1.5.3 → 1.5.4
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 +43 -23
- package/dist/.tsbuildinfo +1 -0
- package/dist/SSHMimic/executor.js +23 -5
- package/dist/VirtualPackageManager/index.js +10 -0
- package/dist/commands/basename.d.ts +13 -0
- package/dist/commands/basename.js +45 -0
- package/dist/commands/file.d.ts +8 -0
- package/dist/commands/file.js +57 -0
- package/dist/commands/fun.d.ts +32 -0
- package/dist/commands/fun.js +172 -0
- package/dist/commands/ifconfig.d.ts +7 -0
- package/dist/commands/ifconfig.js +52 -0
- package/dist/commands/last.d.ts +13 -0
- package/dist/commands/last.js +68 -0
- package/dist/commands/manuals-bundle.js +598 -6
- package/dist/commands/registry.js +24 -2
- package/dist/commands/runtime.js +22 -2
- package/dist/commands/sh.js +5 -0
- package/dist/commands/tput.d.ts +13 -0
- package/dist/commands/tput.js +76 -0
- package/dist/commands/w.d.ts +7 -0
- package/dist/commands/w.js +38 -0
- package/dist/utils/expand.d.ts +12 -0
- package/dist/utils/expand.js +84 -0
- package/package.json +9 -3
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -50
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -31
- package/.github/dependabot.yml +0 -27
- package/.github/pull_request_template.md +0 -21
- package/.github/workflows/create-pull-request.yml +0 -85
- package/.github/workflows/publish.yml +0 -25
- package/.github/workflows/test-battery.yml +0 -102
- package/.vscode/settings.json +0 -20
- package/CODE_OF_CONDUCT.md +0 -39
- package/CONTRIBUTING.md +0 -59
- package/HONEYPOT.md +0 -358
- package/SECURITY.md +0 -33
- package/benchmark-results.txt +0 -40
- package/benchmark-virtualshell.ts +0 -88
- package/biome.json +0 -37
- package/build.js +0 -22
- package/builds/fortune-nyx-v1.5.3-directbash-k6.1.0.mjs +0 -1764
- package/builds/fortune-nyx-v1.5.3-ssh-nosftp.js +0 -1764
- package/builds/fortune-nyx-v1.5.3-ssh.cjs +0 -1765
- package/builds/fortune-nyx-v1.5.3-web.min.js +0 -17036
- package/bun.lock +0 -244
- package/docs/.nojekyll +0 -1
- package/docs/app.js +0 -1751
- package/docs/assets/hierarchy.js +0 -1
- package/docs/assets/highlight.css +0 -162
- package/docs/assets/icons.js +0 -18
- package/docs/assets/icons.svg +0 -1
- package/docs/assets/main.js +0 -60
- package/docs/assets/navigation.js +0 -1
- package/docs/assets/search.js +0 -1
- package/docs/assets/style.css +0 -1633
- package/docs/classes/HoneyPot.html +0 -31
- package/docs/classes/IdleManager.html +0 -162
- package/docs/classes/SshClient.html +0 -66
- package/docs/classes/VirtualFileSystem.html +0 -279
- package/docs/classes/VirtualPackageManager.html +0 -63
- package/docs/classes/VirtualSftpServer.html +0 -169
- package/docs/classes/VirtualShell.html +0 -285
- package/docs/classes/VirtualSshServer.html +0 -182
- package/docs/classes/VirtualUserManager.html +0 -276
- package/docs/demo.html +0 -82
- package/docs/functions/assertDiff.html +0 -6
- package/docs/functions/diffSnapshots.html +0 -7
- package/docs/functions/formatDiff.html +0 -6
- package/docs/functions/getArg.html +0 -13
- package/docs/functions/getFlag.html +0 -15
- package/docs/functions/ifFlag.html +0 -11
- package/docs/hierarchy.html +0 -1
- package/docs/index.html +0 -1869
- package/docs/interfaces/AuditLogEntry.html +0 -6
- package/docs/interfaces/CommandContext.html +0 -22
- package/docs/interfaces/CommandResult.html +0 -26
- package/docs/interfaces/ExecStream.html +0 -11
- package/docs/interfaces/HoneyPotStats.html +0 -16
- package/docs/interfaces/IdleManagerOptions.html +0 -7
- package/docs/interfaces/InstalledPackage.html +0 -20
- package/docs/interfaces/NanoEditorSession.html +0 -8
- package/docs/interfaces/PackageDefinition.html +0 -30
- package/docs/interfaces/PackageFile.html +0 -8
- package/docs/interfaces/PasswordChallenge.html +0 -16
- package/docs/interfaces/RemoveOptions.html +0 -4
- package/docs/interfaces/ShellEnv.html +0 -6
- package/docs/interfaces/ShellModule.html +0 -14
- package/docs/interfaces/ShellProperties.html +0 -14
- package/docs/interfaces/ShellStream.html +0 -11
- package/docs/interfaces/SudoChallenge.html +0 -24
- package/docs/interfaces/VfsBaseNode.html +0 -12
- package/docs/interfaces/VfsDiff.html +0 -10
- package/docs/interfaces/VfsDiffEntry.html +0 -6
- package/docs/interfaces/VfsDiffModified.html +0 -10
- package/docs/interfaces/VfsDirectoryNode.html +0 -15
- package/docs/interfaces/VfsFileNode.html +0 -17
- package/docs/interfaces/VfsOptions.html +0 -26
- package/docs/interfaces/VfsSnapshot.html +0 -3
- package/docs/interfaces/VfsSnapshotBaseNode.html +0 -8
- package/docs/interfaces/VfsSnapshotDirectoryNode.html +0 -10
- package/docs/interfaces/VfsSnapshotFileNode.html +0 -12
- package/docs/interfaces/VirtualActiveSession.html +0 -12
- package/docs/interfaces/VirtualSftpServerOptions.html +0 -7
- package/docs/interfaces/VirtualShellVfsLike.html +0 -15
- package/docs/interfaces/VirtualShellVfsOptions.html +0 -3
- package/docs/interfaces/WriteFileOptions.html +0 -6
- package/docs/media/LICENSE +0 -21
- package/docs/modules.html +0 -1
- package/docs/types/ArgParseOptions.html +0 -4
- package/docs/types/CommandMode.html +0 -2
- package/docs/types/CommandOutcome.html +0 -2
- package/docs/types/IdleState.html +0 -1
- package/docs/types/VfsNodeStats.html +0 -2
- package/docs/types/VfsNodeType.html +0 -2
- package/docs/types/VfsPersistenceMode.html +0 -5
- package/docs/types/VfsSnapshotNode.html +0 -2
- package/examples/README.md +0 -288
- package/examples/app.js +0 -1751
- package/examples/app.ts +0 -299
- package/examples/build.js +0 -27
- package/examples/demo.html +0 -33
- package/examples/honeypot-audit.ts +0 -180
- package/examples/honeypot-export.ts +0 -253
- package/examples/honeypot-quickstart.ts +0 -110
- package/examples/index.html +0 -82
- package/examples/server.js +0 -55
- package/polyfills/buffer.js +0 -117
- package/polyfills/node_child_process/index.js +0 -2
- package/polyfills/node_crypto/index.js +0 -167
- package/polyfills/node_events/index.js +0 -9
- package/polyfills/node_fs/index.js +0 -202
- package/polyfills/node_fs/promises.js +0 -4
- package/polyfills/node_os/index.js +0 -9
- package/polyfills/node_path/index.js +0 -28
- package/polyfills/node_vm/index.js +0 -7
- package/polyfills/node_zlib/index.js +0 -3
- package/polyfills/process.js +0 -14
- package/polyfills/ssh2/index.js +0 -75
- package/scripts/build-all.mjs +0 -226
- package/scripts/build-names.mjs +0 -43
- package/scripts/generate-manuals-bundle.mjs +0 -49
- package/scripts/postinstall.js +0 -42
- package/scripts/publish-package.sh +0 -70
- package/src/Honeypot/index.ts +0 -457
- package/src/SSHClient/index.ts +0 -270
- package/src/SSHMimic/exec.ts +0 -49
- package/src/SSHMimic/executor.ts +0 -251
- package/src/SSHMimic/hostKey.ts +0 -21
- package/src/SSHMimic/index.ts +0 -337
- package/src/SSHMimic/loginBanner.ts +0 -36
- package/src/SSHMimic/loginFormat.ts +0 -10
- package/src/SSHMimic/prompt.ts +0 -14
- package/src/SSHMimic/sftp.ts +0 -883
- package/src/VirtualFileSystem/binaryPack.ts +0 -258
- package/src/VirtualFileSystem/index.ts +0 -1193
- package/src/VirtualFileSystem/internalTypes.ts +0 -43
- package/src/VirtualFileSystem/journal.ts +0 -171
- package/src/VirtualFileSystem/path.ts +0 -74
- package/src/VirtualPackageManager/index.ts +0 -996
- package/src/VirtualShell/idleManager.ts +0 -137
- package/src/VirtualShell/index.ts +0 -475
- package/src/VirtualShell/shell.ts +0 -700
- package/src/VirtualShell/shellParser.ts +0 -285
- package/src/VirtualUserManager/index.ts +0 -758
- package/src/bun.d.ts +0 -1
- package/src/commands/adduser.ts +0 -103
- package/src/commands/alias.ts +0 -69
- package/src/commands/apt.ts +0 -233
- package/src/commands/awk.ts +0 -168
- package/src/commands/base64.ts +0 -29
- package/src/commands/cat.ts +0 -52
- package/src/commands/cd.ts +0 -25
- package/src/commands/chmod.ts +0 -85
- package/src/commands/clear.ts +0 -15
- package/src/commands/command-helpers.ts +0 -286
- package/src/commands/cp.ts +0 -83
- package/src/commands/curl.ts +0 -147
- package/src/commands/cut.ts +0 -36
- package/src/commands/date.ts +0 -30
- package/src/commands/declare.ts +0 -49
- package/src/commands/deluser.ts +0 -98
- package/src/commands/df.ts +0 -23
- package/src/commands/diff.ts +0 -43
- package/src/commands/dpkg.ts +0 -180
- package/src/commands/du.ts +0 -56
- package/src/commands/echo.ts +0 -58
- package/src/commands/env.ts +0 -23
- package/src/commands/exit.ts +0 -18
- package/src/commands/export.ts +0 -34
- package/src/commands/find.ts +0 -68
- package/src/commands/free.ts +0 -47
- package/src/commands/grep.ts +0 -116
- package/src/commands/groups.ts +0 -19
- package/src/commands/gzip.ts +0 -88
- package/src/commands/head.ts +0 -52
- package/src/commands/help.ts +0 -152
- package/src/commands/helpers.ts +0 -234
- package/src/commands/history.ts +0 -34
- package/src/commands/hostname.ts +0 -14
- package/src/commands/htop.ts +0 -20
- package/src/commands/id.ts +0 -19
- package/src/commands/index.ts +0 -9
- package/src/commands/kill.ts +0 -19
- package/src/commands/ln.ts +0 -71
- package/src/commands/ls.ts +0 -243
- package/src/commands/lsb-release.ts +0 -63
- package/src/commands/man.ts +0 -31
- package/src/commands/manuals/adduser.txt +0 -11
- package/src/commands/manuals/apt-cache.txt +0 -12
- package/src/commands/manuals/apt.txt +0 -20
- package/src/commands/manuals/awk.txt +0 -13
- package/src/commands/manuals/cat.txt +0 -14
- package/src/commands/manuals/cd.txt +0 -16
- package/src/commands/manuals/chmod.txt +0 -16
- package/src/commands/manuals/clear.txt +0 -10
- package/src/commands/manuals/cp.txt +0 -10
- package/src/commands/manuals/curl.txt +0 -20
- package/src/commands/manuals/date.txt +0 -14
- package/src/commands/manuals/declare.txt +0 -12
- package/src/commands/manuals/deluser.txt +0 -10
- package/src/commands/manuals/df.txt +0 -10
- package/src/commands/manuals/dpkg-query.txt +0 -11
- package/src/commands/manuals/dpkg.txt +0 -14
- package/src/commands/manuals/du.txt +0 -11
- package/src/commands/manuals/echo.txt +0 -11
- package/src/commands/manuals/false.txt +0 -10
- package/src/commands/manuals/find.txt +0 -11
- package/src/commands/manuals/free.txt +0 -12
- package/src/commands/manuals/grep.txt +0 -13
- package/src/commands/manuals/groups.txt +0 -10
- package/src/commands/manuals/gzip.txt +0 -11
- package/src/commands/manuals/head.txt +0 -10
- package/src/commands/manuals/help.txt +0 -11
- package/src/commands/manuals/history.txt +0 -11
- package/src/commands/manuals/hostname.txt +0 -10
- package/src/commands/manuals/id.txt +0 -10
- package/src/commands/manuals/kill.txt +0 -13
- package/src/commands/manuals/ls.txt +0 -20
- package/src/commands/manuals/lsb_release.txt +0 -14
- package/src/commands/manuals/mkdir.txt +0 -10
- package/src/commands/manuals/mv.txt +0 -10
- package/src/commands/manuals/nano.txt +0 -11
- package/src/commands/manuals/neofetch.txt +0 -10
- package/src/commands/manuals/node.txt +0 -13
- package/src/commands/manuals/npm.txt +0 -13
- package/src/commands/manuals/npx.txt +0 -13
- package/src/commands/manuals/passwd.txt +0 -11
- package/src/commands/manuals/ping.txt +0 -10
- package/src/commands/manuals/printf.txt +0 -11
- package/src/commands/manuals/ps.txt +0 -10
- package/src/commands/manuals/pwd.txt +0 -10
- package/src/commands/manuals/python3.txt +0 -13
- package/src/commands/manuals/readlink.txt +0 -10
- package/src/commands/manuals/return.txt +0 -10
- package/src/commands/manuals/rm.txt +0 -10
- package/src/commands/manuals/sed.txt +0 -11
- package/src/commands/manuals/set.txt +0 -11
- package/src/commands/manuals/shift.txt +0 -10
- package/src/commands/manuals/sleep.txt +0 -10
- package/src/commands/manuals/sort.txt +0 -12
- package/src/commands/manuals/source.txt +0 -11
- package/src/commands/manuals/ssh.txt +0 -11
- package/src/commands/manuals/stat.txt +0 -10
- package/src/commands/manuals/su.txt +0 -13
- package/src/commands/manuals/sudo.txt +0 -11
- package/src/commands/manuals/tail.txt +0 -10
- package/src/commands/manuals/tar.txt +0 -19
- package/src/commands/manuals/tee.txt +0 -10
- package/src/commands/manuals/test.txt +0 -11
- package/src/commands/manuals/touch.txt +0 -11
- package/src/commands/manuals/tr.txt +0 -10
- package/src/commands/manuals/trap.txt +0 -10
- package/src/commands/manuals/true.txt +0 -10
- package/src/commands/manuals/type.txt +0 -10
- package/src/commands/manuals/uname.txt +0 -12
- package/src/commands/manuals/uniq.txt +0 -12
- package/src/commands/manuals/unset.txt +0 -10
- package/src/commands/manuals/uptime.txt +0 -11
- package/src/commands/manuals/wc.txt +0 -12
- package/src/commands/manuals/wget.txt +0 -12
- package/src/commands/manuals/which.txt +0 -10
- package/src/commands/manuals/whoami.txt +0 -10
- package/src/commands/manuals/xargs.txt +0 -10
- package/src/commands/manuals-bundle.ts +0 -898
- package/src/commands/mkdir.ts +0 -31
- package/src/commands/mv.ts +0 -50
- package/src/commands/nano.ts +0 -38
- package/src/commands/neofetch.ts +0 -53
- package/src/commands/node.ts +0 -341
- package/src/commands/npm.ts +0 -132
- package/src/commands/passwd.ts +0 -50
- package/src/commands/ping.ts +0 -32
- package/src/commands/printf.ts +0 -129
- package/src/commands/ps.ts +0 -58
- package/src/commands/pwd.ts +0 -9
- package/src/commands/python.ts +0 -2229
- package/src/commands/read.ts +0 -46
- package/src/commands/registry.ts +0 -249
- package/src/commands/rm.ts +0 -42
- package/src/commands/runtime.ts +0 -421
- package/src/commands/sed.ts +0 -68
- package/src/commands/seq.ts +0 -43
- package/src/commands/set.ts +0 -29
- package/src/commands/sh.ts +0 -467
- package/src/commands/shift.ts +0 -63
- package/src/commands/sleep.ts +0 -20
- package/src/commands/sort.ts +0 -46
- package/src/commands/source.ts +0 -52
- package/src/commands/stat.ts +0 -61
- package/src/commands/su.ts +0 -72
- package/src/commands/sudo.ts +0 -76
- package/src/commands/tail.ts +0 -53
- package/src/commands/tar.ts +0 -102
- package/src/commands/tee.ts +0 -36
- package/src/commands/test.ts +0 -137
- package/src/commands/touch.ts +0 -28
- package/src/commands/tr.ts +0 -70
- package/src/commands/tree.ts +0 -20
- package/src/commands/true.ts +0 -27
- package/src/commands/type.ts +0 -48
- package/src/commands/uname.ts +0 -29
- package/src/commands/uniq.ts +0 -39
- package/src/commands/unset.ts +0 -17
- package/src/commands/uptime.ts +0 -54
- package/src/commands/wc.ts +0 -55
- package/src/commands/wget.ts +0 -148
- package/src/commands/which.ts +0 -37
- package/src/commands/who.ts +0 -25
- package/src/commands/whoami.ts +0 -14
- package/src/commands/xargs.ts +0 -31
- package/src/index.ts +0 -67
- package/src/modules/linuxRootfs.ts +0 -1961
- package/src/modules/neofetch.ts +0 -358
- package/src/modules/shellInteractive.ts +0 -57
- package/src/modules/shellRuntime.ts +0 -76
- package/src/self-standalone.ts +0 -542
- package/src/standalone-wo-sftp.ts +0 -38
- package/src/standalone.ts +0 -72
- package/src/types/commands.ts +0 -146
- package/src/types/pipeline.ts +0 -52
- package/src/types/streams.ts +0 -32
- package/src/types/tar-stream.d.ts +0 -38
- package/src/types/vfs.ts +0 -98
- package/src/utils/expand.ts +0 -491
- package/src/utils/perfLogger.ts +0 -72
- package/src/utils/tokenize.ts +0 -98
- package/src/utils/vfsDiff.ts +0 -275
- package/tests/command-helpers.test.ts +0 -116
- package/tests/commands-admin-net.test.ts +0 -441
- package/tests/commands-advanced.test.ts +0 -456
- package/tests/commands-core.test.ts +0 -562
- package/tests/commands-missing.test.ts +0 -570
- package/tests/commands-specific-units.test.ts +0 -327
- package/tests/commands-text-sys.test.ts +0 -445
- package/tests/expand.test.ts +0 -170
- package/tests/helpers.test.ts +0 -97
- package/tests/new-features.test.ts +0 -1036
- package/tests/parser-executor.test.ts +0 -37
- package/tests/sftp.test.ts +0 -323
- package/tests/ssh-exec.test.ts +0 -45
- package/tests/test-helper.ts +0 -79
- package/tests/users.test.ts +0 -86
- package/tsconfig.json +0 -49
- package/typedoc.json +0 -47
package/scripts/build-all.mjs
DELETED
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* scripts/build-all.mjs
|
|
4
|
-
*
|
|
5
|
-
* Orchestrates the full build pipeline:
|
|
6
|
-
* 1. rimraf builds/ — clean previous artifacts
|
|
7
|
-
* 2. generate-manuals-bundle — inline all man pages
|
|
8
|
-
* 3. esbuild all targets — with dynamic output filenames
|
|
9
|
-
* 4. copy web build to examples/
|
|
10
|
-
* 5. update README.md — replace filenames in marked sections
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { execSync } from "node:child_process";
|
|
14
|
-
import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
15
|
-
import { dirname, join } from "node:path";
|
|
16
|
-
import { fileURLToPath } from "node:url";
|
|
17
|
-
import { BUILDS_DIR, NAMES } from "./build-names.mjs";
|
|
18
|
-
|
|
19
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
-
const root = join(__dirname, "..");
|
|
21
|
-
const GH_BASE = "https://raw.githubusercontent.com/itsrealfortune/typescript-virtual-container/refs/heads/main/builds";
|
|
22
|
-
|
|
23
|
-
function run(cmd) {
|
|
24
|
-
console.log(`\n$ ${cmd}`);
|
|
25
|
-
execSync(cmd, { stdio: "inherit", cwd: root });
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// ── 1. Clean ──────────────────────────────────────────────────────────────────
|
|
29
|
-
run(`bunx rimraf ${BUILDS_DIR}`);
|
|
30
|
-
mkdirSync(BUILDS_DIR, { recursive: true });
|
|
31
|
-
|
|
32
|
-
// ── 2. Manuals bundle ─────────────────────────────────────────────────────────
|
|
33
|
-
run("node scripts/generate-manuals-bundle.mjs");
|
|
34
|
-
|
|
35
|
-
// ── 3. esbuild targets ───────────────────────────────────────────────────────
|
|
36
|
-
const ESBUILD = "bunx esbuild";
|
|
37
|
-
const BANNER = `--banner:js='#!/usr/bin/env node'`;
|
|
38
|
-
|
|
39
|
-
const targets = [
|
|
40
|
-
// self-standalone (ESM, interactive CLI)
|
|
41
|
-
`${ESBUILD} src/self-standalone.ts --bundle --platform=node --format=esm --target=node18 \
|
|
42
|
-
--outfile=${BUILDS_DIR}/${NAMES.selfStandalone} --tree-shaking=true --minify ${BANNER}`,
|
|
43
|
-
|
|
44
|
-
// standalone SSH+SFTP (CJS)
|
|
45
|
-
`${ESBUILD} src/standalone.ts --bundle --platform=node --target=node18 \
|
|
46
|
-
--outfile=${BUILDS_DIR}/${NAMES.standalone} --tree-shaking=true --minify ${BANNER}`,
|
|
47
|
-
|
|
48
|
-
// standalone SSH only (no SFTP)
|
|
49
|
-
`${ESBUILD} src/standalone-wo-sftp.ts --bundle --platform=node --target=node18 \
|
|
50
|
-
--outfile=${BUILDS_DIR}/${NAMES.standaloneNoSftp} --tree-shaking=true --minify ${BANNER}`,
|
|
51
|
-
];
|
|
52
|
-
|
|
53
|
-
for (const cmd of targets) {
|
|
54
|
-
run(cmd.replace(/\s+/g, " ").trim());
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// // ── 4. Copy web to examples/ ─────────────────────────────────────────────────
|
|
58
|
-
// const examplesDir = join(root, "examples");
|
|
59
|
-
// mkdirSync(examplesDir, { recursive: true });
|
|
60
|
-
// copyFileSync(
|
|
61
|
-
// join(BUILDS_DIR, NAMES.web),
|
|
62
|
-
// join(examplesDir, "web.min.js"),
|
|
63
|
-
// );
|
|
64
|
-
// console.log(`\n✓ Copied ${NAMES.web} → examples/web.min.js`);
|
|
65
|
-
|
|
66
|
-
// ── 4. Run build.js ───────────────────────────────────────────────────────────
|
|
67
|
-
run("node build.js");
|
|
68
|
-
|
|
69
|
-
// ── 5. Copy demo to docs/ ─────────────────────────────────────────────────────
|
|
70
|
-
const docsDir = join(root, "docs");
|
|
71
|
-
mkdirSync(docsDir, { recursive: true });
|
|
72
|
-
copyFileSync(join(root, "examples", "app.js"), join(docsDir, "app.js"));
|
|
73
|
-
copyFileSync(join(root, "examples", "index.html"), join(docsDir, "demo.html"));
|
|
74
|
-
console.log("\n✓ Copied examples/app.js → docs/app.js");
|
|
75
|
-
console.log("✓ Copied examples/index.html → docs/demo.html");
|
|
76
|
-
|
|
77
|
-
// ── 6. Update README.md ───────────────────────────────────────────────────────
|
|
78
|
-
const readmePath = join(root, "README.md");
|
|
79
|
-
let readme = readFileSync(readmePath, "utf8");
|
|
80
|
-
|
|
81
|
-
const { selfStandalone, standalone, standaloneNoSftp, web } = NAMES;
|
|
82
|
-
|
|
83
|
-
// Helper: replace content between <!-- BUILD:tag --> and <!-- /BUILD:tag -->
|
|
84
|
-
function replaceSection(tag, content) {
|
|
85
|
-
const re = new RegExp(
|
|
86
|
-
`(<!-- BUILD:${tag} -->)[\\s\\S]*?(<!-- \\/BUILD:${tag} -->)`,
|
|
87
|
-
"g",
|
|
88
|
-
);
|
|
89
|
-
readme = readme.replace(re, `$1\n${content}\n$2`);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Overview table — web and selfStandalone filenames
|
|
93
|
-
replaceSection(
|
|
94
|
-
"mode-table",
|
|
95
|
-
[
|
|
96
|
-
`| Mode | Entry point | Use case |`,
|
|
97
|
-
`|------|-------------|----------|`,
|
|
98
|
-
`| **SSH/SFTP server** | \`VirtualSshServer\` / \`VirtualSftpServer\` | Honeypots, remote testing, training environments |`,
|
|
99
|
-
`| **Web shell** | \`builds/${web}\` (ESM) | Embedded terminals, interactive tutorials, browser demos |`,
|
|
100
|
-
`| **Standalone CLI** | \`builds/${selfStandalone}\` (single file) | Local shell, one-liner demos, no install required |`,
|
|
101
|
-
].join("\n"),
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
// curl commands block
|
|
105
|
-
replaceSection(
|
|
106
|
-
"curl-start",
|
|
107
|
-
[
|
|
108
|
-
`#### Interactivea local shell — persists VFS in .vfs/ in the current directory`,
|
|
109
|
-
`\`\`\`bash`,
|
|
110
|
-
`curl -s ${GH_BASE}/${selfStandalone} -o ${selfStandalone} && node ${selfStandalone}`,
|
|
111
|
-
`\`\`\``,
|
|
112
|
-
``,
|
|
113
|
-
`#### SSH server (connect with any SSH client on port 2222)`,
|
|
114
|
-
`\`\`\`bash`,
|
|
115
|
-
`curl -s ${GH_BASE}/${standalone} -o ${standalone} && node ${standalone}`,
|
|
116
|
-
`\`\`\``,
|
|
117
|
-
``,
|
|
118
|
-
`#### SSH server without SFTP (lighter build)`,
|
|
119
|
-
`\`\`\`bash`,
|
|
120
|
-
`curl -s ${GH_BASE}/${standaloneNoSftp} -o ${standaloneNoSftp} && node ${standaloneNoSftp}`,
|
|
121
|
-
`\`\`\``,
|
|
122
|
-
].join("\n"),
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
// self-standalone options block
|
|
126
|
-
replaceSection(
|
|
127
|
-
"selfStandalone-options",
|
|
128
|
-
[
|
|
129
|
-
`**\`${selfStandalone}\` options:**`,
|
|
130
|
-
``,
|
|
131
|
-
`\`\`\`bash`,
|
|
132
|
-
`node ${selfStandalone} # boot as root`,
|
|
133
|
-
`node ${selfStandalone} --user alice # boot as alice (prompts for password if set)`,
|
|
134
|
-
`node ${selfStandalone} --user=alice # same, inline form`,
|
|
135
|
-
`SSH_MIMIC_HOSTNAME=my-box node ${selfStandalone} # custom hostname`,
|
|
136
|
-
`\`\`\``,
|
|
137
|
-
].join("\n"),
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
// Web bundles comparison table
|
|
141
|
-
replaceSection(
|
|
142
|
-
"web-table",
|
|
143
|
-
[
|
|
144
|
-
`| Bundle | Format | Entry point | Use case |`,
|
|
145
|
-
`|--------|--------|-------------|----------|`,
|
|
146
|
-
`| \`builds/${web}\` | ESM | \`createWebShell()\` | Embedded terminals, modern bundlers |`,
|
|
147
|
-
].join("\n"),
|
|
148
|
-
);
|
|
149
|
-
replaceSection(
|
|
150
|
-
"web-options",
|
|
151
|
-
[
|
|
152
|
-
`**\`${web}\`** — lightweight shell with IndexedDB VFS:`,
|
|
153
|
-
``,
|
|
154
|
-
`\`\`\`html`,
|
|
155
|
-
`<script type="module">`,
|
|
156
|
-
` import { createWebShell } from "./builds/${web}";`,
|
|
157
|
-
``,
|
|
158
|
-
` const shell = createWebShell("web-vm", {`,
|
|
159
|
-
` vfs: { databaseName: "virtual-env-js", storeName: "vfs" },`,
|
|
160
|
-
` });`,
|
|
161
|
-
` await shell.ensureInitialized();`,
|
|
162
|
-
``,
|
|
163
|
-
` const out = await shell.executeCommandLine("ls /etc && echo hello");`,
|
|
164
|
-
` console.log(out.stdout);`,
|
|
165
|
-
`</script>`,
|
|
166
|
-
`\`\`\``,
|
|
167
|
-
``,
|
|
168
|
-
`**\`${web}\`** — mirrors the \`VirtualShell\` programmatic API:`,
|
|
169
|
-
``,
|
|
170
|
-
`\`\`\`html`,
|
|
171
|
-
`<script type="module">`,
|
|
172
|
-
` import { createVirtualShellShim } from "./builds/${web}";`,
|
|
173
|
-
``,
|
|
174
|
-
` const shell = createVirtualShellShim("web-vm");`,
|
|
175
|
-
` await shell.ensureInitialized();`,
|
|
176
|
-
` await shell.executeCommandLine("mkdir -p /app && echo hello > /app/file.txt");`,
|
|
177
|
-
` console.log(shell.getVfs().readFile("/app/file.txt")); // hello`,
|
|
178
|
-
`</script>`,
|
|
179
|
-
`\`\`\``,
|
|
180
|
-
].join("\n"),
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
// Changelog lines
|
|
184
|
-
replaceSection(
|
|
185
|
-
"changelog",
|
|
186
|
-
[
|
|
187
|
-
`- [x] Web shell bundles (\`${web}\`) — fully browser-native with IndexedDB VFS`,
|
|
188
|
-
`- [x] Self-standalone CLI (\`${selfStandalone}\`) — single-file interactive shell, per-user history, tab completion`,
|
|
189
|
-
].join("\n"),
|
|
190
|
-
);
|
|
191
|
-
|
|
192
|
-
writeFileSync(readmePath, readme, "utf8");
|
|
193
|
-
console.log("✓ README.md updated with current build filenames");
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
// ── 7. Strip .html from internal links in docs/ ───────────────────────────────
|
|
197
|
-
// TypeDoc hardcodes .html — post-process all generated files to remove the
|
|
198
|
-
// extension so GitHub Pages serves clean URLs (e.g. /docs/classes/VirtualShell)
|
|
199
|
-
import { readdirSync } from "node:fs";
|
|
200
|
-
|
|
201
|
-
function stripHtmlExtensions(dir) {
|
|
202
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
203
|
-
const full = join(dir, entry.name);
|
|
204
|
-
if (entry.isDirectory()) {
|
|
205
|
-
stripHtmlExtensions(full);
|
|
206
|
-
} else if (entry.name.endsWith(".html")) {
|
|
207
|
-
let src = readFileSync(full, "utf8");
|
|
208
|
-
// Replace href="...something.html" and href="...something.html#anchor"
|
|
209
|
-
// Only relative links (no http/https)
|
|
210
|
-
src = src.replace(
|
|
211
|
-
/href="(?!https?:\/\/)([^"]*)\.html(#[^"]*)?"/g,
|
|
212
|
-
(_, path, hash) => `href="${path}${hash ?? ""}"`,
|
|
213
|
-
);
|
|
214
|
-
writeFileSync(full, src, "utf8");
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
stripHtmlExtensions(docsDir);
|
|
220
|
-
console.log("\n✓ Stripped .html from internal links in docs/");
|
|
221
|
-
|
|
222
|
-
// ── Summary ──────────────────────────────────────────────────────────────────
|
|
223
|
-
console.log("\n✅ Build complete:");
|
|
224
|
-
for (const [key, name] of Object.entries(NAMES)) {
|
|
225
|
-
console.log(` ${key.padEnd(16)} → builds/${name}`);
|
|
226
|
-
}
|
package/scripts/build-names.mjs
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* scripts/build-names.mjs
|
|
3
|
-
*
|
|
4
|
-
* Computes dynamic output filenames for all build targets from:
|
|
5
|
-
* - package.json → package version (e.g. 1.5.0)
|
|
6
|
-
* - VirtualShell → default kernel version (e.g. 1.0.0+itsrealfortune+1-amd64)
|
|
7
|
-
*
|
|
8
|
-
* Used by build-all.mjs to pass --outfile to esbuild.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { readFileSync } from "node:fs";
|
|
12
|
-
import { dirname, join } from "node:path";
|
|
13
|
-
import { fileURLToPath } from "node:url";
|
|
14
|
-
|
|
15
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
const root = join(__dirname, "..");
|
|
17
|
-
|
|
18
|
-
// Package version
|
|
19
|
-
const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
|
|
20
|
-
const pkgVersion = pkg.version; // e.g. "1.5.0"
|
|
21
|
-
|
|
22
|
-
// Kernel version — read from VirtualShell source to stay in sync
|
|
23
|
-
const shellSrc = readFileSync(join(root, "src/VirtualShell/index.ts"), "utf8");
|
|
24
|
-
const kernelMatch = shellSrc.match(/kernel:\s*"([^"]+)"/);
|
|
25
|
-
const kernelRaw = kernelMatch?.[1] ?? "unknown";
|
|
26
|
-
// Shorten: "1.0.0+itsrealfortune+1-amd64" → "k1.0.0"
|
|
27
|
-
const kernelVersion = `k${kernelRaw.split("+")[0]}`;
|
|
28
|
-
|
|
29
|
-
export const BUILDS_DIR = join(root, "builds");
|
|
30
|
-
|
|
31
|
-
export const NAMES = {
|
|
32
|
-
selfStandalone: `fortune-nyx-v${pkgVersion}-directbash-${kernelVersion}.mjs`,
|
|
33
|
-
standalone: `fortune-nyx-v${pkgVersion}-ssh.cjs`,
|
|
34
|
-
standaloneNoSftp:`fortune-nyx-v${pkgVersion}-ssh-nosftp.js`,
|
|
35
|
-
web: `fortune-nyx-v${pkgVersion}-web.min.js`
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// Print for shell consumption: NAME=value pairs
|
|
39
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
40
|
-
for (const [key, value] of Object.entries(NAMES)) {
|
|
41
|
-
console.log(`${key}=${value}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* scripts/generate-manuals-bundle.mjs
|
|
4
|
-
*
|
|
5
|
-
* Reads all .txt files from src/commands/manuals/ and generates
|
|
6
|
-
* src/commands/manuals-bundle.ts — a static Record<string, string>
|
|
7
|
-
* that is tree-shaken into standalone/web builds.
|
|
8
|
-
*
|
|
9
|
-
* Run: node scripts/generate-manuals-bundle.mjs
|
|
10
|
-
* Called automatically by the "prebuild" step in package.json.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
14
|
-
import { join, basename } from "node:path";
|
|
15
|
-
import { fileURLToPath } from "node:url";
|
|
16
|
-
|
|
17
|
-
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|
18
|
-
const manualsDir = join(__dirname, "../src/commands/manuals");
|
|
19
|
-
const outFile = join(__dirname, "../src/commands/manuals-bundle.ts");
|
|
20
|
-
|
|
21
|
-
const files = readdirSync(manualsDir)
|
|
22
|
-
.filter((f) => f.endsWith(".txt"))
|
|
23
|
-
.sort();
|
|
24
|
-
|
|
25
|
-
const entries = files.map((file) => {
|
|
26
|
-
const key = basename(file, ".txt");
|
|
27
|
-
const content = readFileSync(join(manualsDir, file), "utf8").replace(/\n$/, "");
|
|
28
|
-
// Escape backticks and template literal syntax
|
|
29
|
-
const escaped = content.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
|
|
30
|
-
return `\t"${key}": \`${escaped}\``;
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
const output = `/**
|
|
34
|
-
* Auto-generated by scripts/generate-manuals-bundle.mjs
|
|
35
|
-
* DO NOT EDIT — run \`node scripts/generate-manuals-bundle.mjs\` to regenerate.
|
|
36
|
-
*
|
|
37
|
-
* Inlines all src/commands/manuals/*.txt files so that standalone and web
|
|
38
|
-
* builds have access to man pages without needing filesystem access.
|
|
39
|
-
*/
|
|
40
|
-
/** biome-ignore-all lint/style/useNamingConvention: generated keys match command names (e.g. lsb_release) */
|
|
41
|
-
|
|
42
|
-
/** Static map of command name → man page content. */
|
|
43
|
-
export const MANUALS: Readonly<Record<string, string>> = {
|
|
44
|
-
${entries.join(",\n")},
|
|
45
|
-
} as const;
|
|
46
|
-
`;
|
|
47
|
-
|
|
48
|
-
writeFileSync(outFile, output, "utf8");
|
|
49
|
-
console.log(`✓ Generated manuals-bundle.ts (${files.length} manuals)`);
|
package/scripts/postinstall.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
|
|
5
|
-
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
6
|
-
|
|
7
|
-
function deleteFile(filePath) {
|
|
8
|
-
if (fs.existsSync(filePath)) {
|
|
9
|
-
fs.unlinkSync(filePath);
|
|
10
|
-
console.log(`Deleted: ${filePath}`);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function deleteDirectory(dirPath) {
|
|
15
|
-
if (fs.existsSync(dirPath)) {
|
|
16
|
-
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
17
|
-
console.log(`Deleted: ${dirPath}`);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const sshCryptoPath = path.join(
|
|
22
|
-
__dirname,
|
|
23
|
-
'..',
|
|
24
|
-
'node_modules',
|
|
25
|
-
'ssh2',
|
|
26
|
-
'lib',
|
|
27
|
-
'protocol',
|
|
28
|
-
'crypto',
|
|
29
|
-
'build',
|
|
30
|
-
'Release',
|
|
31
|
-
'sshcrypto.node'
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
const cpuFeaturesPath = path.join(
|
|
35
|
-
__dirname,
|
|
36
|
-
'..',
|
|
37
|
-
'node_modules',
|
|
38
|
-
'cpu-features'
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
deleteFile(sshCryptoPath);
|
|
42
|
-
deleteDirectory(cpuFeaturesPath);
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
5
|
-
echo "Error: this command must run inside a git repository."
|
|
6
|
-
exit 1
|
|
7
|
-
fi
|
|
8
|
-
|
|
9
|
-
if [[ -n "$(git status --porcelain)" ]]; then
|
|
10
|
-
echo "Error: working tree is not clean. Commit or stash your changes first."
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
VERSION="$(bun -e "console.log(require('./package.json').version)")"
|
|
15
|
-
TAG="v${VERSION}"
|
|
16
|
-
|
|
17
|
-
if [[ -z "${VERSION}" ]]; then
|
|
18
|
-
echo "Error: package.json version is empty."
|
|
19
|
-
exit 1
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
git fetch --tags --quiet
|
|
23
|
-
|
|
24
|
-
TAG_EXISTS_LOCAL="false"
|
|
25
|
-
TAG_EXISTS_REMOTE="false"
|
|
26
|
-
|
|
27
|
-
if git rev-parse --verify --quiet "refs/tags/${TAG}" >/dev/null; then
|
|
28
|
-
TAG_EXISTS_LOCAL="true"
|
|
29
|
-
fi
|
|
30
|
-
|
|
31
|
-
if git ls-remote --tags origin "refs/tags/${TAG}" | grep -q .; then
|
|
32
|
-
TAG_EXISTS_REMOTE="true"
|
|
33
|
-
fi
|
|
34
|
-
|
|
35
|
-
if [[ "${TAG_EXISTS_LOCAL}" == "true" || "${TAG_EXISTS_REMOTE}" == "true" ]]; then
|
|
36
|
-
echo "Tag ${TAG} already exists. Deleting existing release/tag before republishing."
|
|
37
|
-
|
|
38
|
-
if command -v gh >/dev/null 2>&1; then
|
|
39
|
-
if gh release view "${TAG}" >/dev/null 2>&1; then
|
|
40
|
-
gh release delete "${TAG}" --yes
|
|
41
|
-
echo "GitHub release ${TAG} deleted."
|
|
42
|
-
fi
|
|
43
|
-
else
|
|
44
|
-
echo "gh CLI not found; skipping GitHub release deletion."
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
if [[ "${TAG_EXISTS_LOCAL}" == "true" ]]; then
|
|
48
|
-
git tag -d "${TAG}" >/dev/null
|
|
49
|
-
echo "Local tag ${TAG} deleted."
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
if [[ "${TAG_EXISTS_REMOTE}" == "true" ]]; then
|
|
53
|
-
git push --delete origin "${TAG}" >/dev/null
|
|
54
|
-
echo "Remote tag ${TAG} deleted."
|
|
55
|
-
fi
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
git tag -a "${TAG}" -m "Release ${TAG}"
|
|
59
|
-
git push origin "${TAG}"
|
|
60
|
-
|
|
61
|
-
echo "Tag ${TAG} pushed."
|
|
62
|
-
|
|
63
|
-
if command -v gh >/dev/null 2>&1; then
|
|
64
|
-
gh release create "${TAG}" --title "${TAG}" --generate-notes
|
|
65
|
-
echo "GitHub release ${TAG} created."
|
|
66
|
-
else
|
|
67
|
-
echo "gh CLI not found; skipping GitHub release creation."
|
|
68
|
-
fi
|
|
69
|
-
|
|
70
|
-
echo "Done. The publish workflow should run from tag ${TAG}."
|