typescript-virtual-container 1.5.2 → 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.
Files changed (364) hide show
  1. package/README.md +43 -23
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/SSHMimic/executor.js +23 -5
  4. package/dist/commands/basename.d.ts +13 -0
  5. package/dist/commands/basename.js +45 -0
  6. package/dist/commands/file.d.ts +8 -0
  7. package/dist/commands/file.js +57 -0
  8. package/dist/commands/fun.d.ts +32 -0
  9. package/dist/commands/fun.js +172 -0
  10. package/dist/commands/ifconfig.d.ts +7 -0
  11. package/dist/commands/ifconfig.js +52 -0
  12. package/dist/commands/last.d.ts +13 -0
  13. package/dist/commands/last.js +68 -0
  14. package/dist/commands/manuals-bundle.js +598 -6
  15. package/dist/commands/registry.js +24 -2
  16. package/dist/commands/runtime.js +159 -106
  17. package/dist/commands/sh.js +5 -0
  18. package/dist/commands/tput.d.ts +13 -0
  19. package/dist/commands/tput.js +76 -0
  20. package/dist/commands/w.d.ts +7 -0
  21. package/dist/commands/w.js +38 -0
  22. package/dist/utils/expand.d.ts +12 -0
  23. package/dist/utils/expand.js +84 -0
  24. package/package.json +9 -3
  25. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -50
  26. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -31
  27. package/.github/dependabot.yml +0 -27
  28. package/.github/pull_request_template.md +0 -21
  29. package/.github/workflows/create-pull-request.yml +0 -85
  30. package/.github/workflows/publish.yml +0 -25
  31. package/.github/workflows/test-battery.yml +0 -102
  32. package/.vscode/settings.json +0 -20
  33. package/CODE_OF_CONDUCT.md +0 -39
  34. package/CONTRIBUTING.md +0 -59
  35. package/HONEYPOT.md +0 -358
  36. package/SECURITY.md +0 -33
  37. package/benchmark-results.txt +0 -40
  38. package/benchmark-virtualshell.ts +0 -88
  39. package/biome.json +0 -37
  40. package/build.js +0 -22
  41. package/builds/fortune-nyx-v1.5.1-directbash-k6.1.0.mjs +0 -1768
  42. package/builds/fortune-nyx-v1.5.1-ssh-nosftp.js +0 -1768
  43. package/builds/fortune-nyx-v1.5.1-ssh.cjs +0 -1769
  44. package/builds/fortune-nyx-v1.5.1-web.min.js +0 -17022
  45. package/bun.lock +0 -244
  46. package/docs/.nojekyll +0 -1
  47. package/docs/app.js +0 -1755
  48. package/docs/assets/hierarchy.js +0 -1
  49. package/docs/assets/highlight.css +0 -162
  50. package/docs/assets/icons.js +0 -18
  51. package/docs/assets/icons.svg +0 -1
  52. package/docs/assets/main.js +0 -60
  53. package/docs/assets/navigation.js +0 -1
  54. package/docs/assets/search.js +0 -1
  55. package/docs/assets/style.css +0 -1633
  56. package/docs/classes/HoneyPot.html +0 -31
  57. package/docs/classes/IdleManager.html +0 -162
  58. package/docs/classes/SshClient.html +0 -66
  59. package/docs/classes/VirtualFileSystem.html +0 -279
  60. package/docs/classes/VirtualPackageManager.html +0 -63
  61. package/docs/classes/VirtualSftpServer.html +0 -169
  62. package/docs/classes/VirtualShell.html +0 -285
  63. package/docs/classes/VirtualSshServer.html +0 -182
  64. package/docs/classes/VirtualUserManager.html +0 -276
  65. package/docs/demo.html +0 -82
  66. package/docs/functions/assertDiff.html +0 -6
  67. package/docs/functions/diffSnapshots.html +0 -7
  68. package/docs/functions/formatDiff.html +0 -6
  69. package/docs/functions/getArg.html +0 -13
  70. package/docs/functions/getFlag.html +0 -15
  71. package/docs/functions/ifFlag.html +0 -11
  72. package/docs/hierarchy.html +0 -1
  73. package/docs/index.html +0 -1869
  74. package/docs/interfaces/AuditLogEntry.html +0 -6
  75. package/docs/interfaces/CommandContext.html +0 -22
  76. package/docs/interfaces/CommandResult.html +0 -26
  77. package/docs/interfaces/ExecStream.html +0 -11
  78. package/docs/interfaces/HoneyPotStats.html +0 -16
  79. package/docs/interfaces/IdleManagerOptions.html +0 -7
  80. package/docs/interfaces/InstalledPackage.html +0 -20
  81. package/docs/interfaces/NanoEditorSession.html +0 -8
  82. package/docs/interfaces/PackageDefinition.html +0 -30
  83. package/docs/interfaces/PackageFile.html +0 -8
  84. package/docs/interfaces/PasswordChallenge.html +0 -16
  85. package/docs/interfaces/RemoveOptions.html +0 -4
  86. package/docs/interfaces/ShellEnv.html +0 -6
  87. package/docs/interfaces/ShellModule.html +0 -14
  88. package/docs/interfaces/ShellProperties.html +0 -14
  89. package/docs/interfaces/ShellStream.html +0 -11
  90. package/docs/interfaces/SudoChallenge.html +0 -24
  91. package/docs/interfaces/VfsBaseNode.html +0 -12
  92. package/docs/interfaces/VfsDiff.html +0 -10
  93. package/docs/interfaces/VfsDiffEntry.html +0 -6
  94. package/docs/interfaces/VfsDiffModified.html +0 -10
  95. package/docs/interfaces/VfsDirectoryNode.html +0 -15
  96. package/docs/interfaces/VfsFileNode.html +0 -17
  97. package/docs/interfaces/VfsOptions.html +0 -26
  98. package/docs/interfaces/VfsSnapshot.html +0 -3
  99. package/docs/interfaces/VfsSnapshotBaseNode.html +0 -8
  100. package/docs/interfaces/VfsSnapshotDirectoryNode.html +0 -10
  101. package/docs/interfaces/VfsSnapshotFileNode.html +0 -12
  102. package/docs/interfaces/VirtualActiveSession.html +0 -12
  103. package/docs/interfaces/VirtualSftpServerOptions.html +0 -7
  104. package/docs/interfaces/VirtualShellVfsLike.html +0 -15
  105. package/docs/interfaces/VirtualShellVfsOptions.html +0 -3
  106. package/docs/interfaces/WriteFileOptions.html +0 -6
  107. package/docs/media/LICENSE +0 -21
  108. package/docs/modules.html +0 -1
  109. package/docs/types/ArgParseOptions.html +0 -4
  110. package/docs/types/CommandMode.html +0 -2
  111. package/docs/types/CommandOutcome.html +0 -2
  112. package/docs/types/IdleState.html +0 -1
  113. package/docs/types/VfsNodeStats.html +0 -2
  114. package/docs/types/VfsNodeType.html +0 -2
  115. package/docs/types/VfsPersistenceMode.html +0 -5
  116. package/docs/types/VfsSnapshotNode.html +0 -2
  117. package/examples/README.md +0 -288
  118. package/examples/app.js +0 -1755
  119. package/examples/app.ts +0 -299
  120. package/examples/build.js +0 -27
  121. package/examples/demo.html +0 -33
  122. package/examples/honeypot-audit.ts +0 -180
  123. package/examples/honeypot-export.ts +0 -253
  124. package/examples/honeypot-quickstart.ts +0 -110
  125. package/examples/index.html +0 -82
  126. package/examples/server.js +0 -55
  127. package/polyfills/buffer.js +0 -117
  128. package/polyfills/node_child_process/index.js +0 -2
  129. package/polyfills/node_crypto/index.js +0 -167
  130. package/polyfills/node_events/index.js +0 -9
  131. package/polyfills/node_fs/index.js +0 -202
  132. package/polyfills/node_fs/promises.js +0 -4
  133. package/polyfills/node_os/index.js +0 -9
  134. package/polyfills/node_path/index.js +0 -28
  135. package/polyfills/node_vm/index.js +0 -7
  136. package/polyfills/node_zlib/index.js +0 -3
  137. package/polyfills/process.js +0 -14
  138. package/polyfills/ssh2/index.js +0 -75
  139. package/scripts/build-all.mjs +0 -226
  140. package/scripts/build-names.mjs +0 -43
  141. package/scripts/generate-manuals-bundle.mjs +0 -49
  142. package/scripts/postinstall.js +0 -42
  143. package/scripts/publish-package.sh +0 -70
  144. package/src/Honeypot/index.ts +0 -457
  145. package/src/SSHClient/index.ts +0 -270
  146. package/src/SSHMimic/exec.ts +0 -49
  147. package/src/SSHMimic/executor.ts +0 -251
  148. package/src/SSHMimic/hostKey.ts +0 -21
  149. package/src/SSHMimic/index.ts +0 -337
  150. package/src/SSHMimic/loginBanner.ts +0 -36
  151. package/src/SSHMimic/loginFormat.ts +0 -10
  152. package/src/SSHMimic/prompt.ts +0 -14
  153. package/src/SSHMimic/sftp.ts +0 -883
  154. package/src/VirtualFileSystem/binaryPack.ts +0 -258
  155. package/src/VirtualFileSystem/index.ts +0 -1193
  156. package/src/VirtualFileSystem/internalTypes.ts +0 -43
  157. package/src/VirtualFileSystem/journal.ts +0 -171
  158. package/src/VirtualFileSystem/path.ts +0 -74
  159. package/src/VirtualPackageManager/index.ts +0 -1006
  160. package/src/VirtualShell/idleManager.ts +0 -137
  161. package/src/VirtualShell/index.ts +0 -475
  162. package/src/VirtualShell/shell.ts +0 -700
  163. package/src/VirtualShell/shellParser.ts +0 -285
  164. package/src/VirtualUserManager/index.ts +0 -758
  165. package/src/bun.d.ts +0 -1
  166. package/src/commands/adduser.ts +0 -103
  167. package/src/commands/alias.ts +0 -69
  168. package/src/commands/apt.ts +0 -233
  169. package/src/commands/awk.ts +0 -168
  170. package/src/commands/base64.ts +0 -29
  171. package/src/commands/cat.ts +0 -52
  172. package/src/commands/cd.ts +0 -25
  173. package/src/commands/chmod.ts +0 -85
  174. package/src/commands/clear.ts +0 -15
  175. package/src/commands/command-helpers.ts +0 -286
  176. package/src/commands/cp.ts +0 -83
  177. package/src/commands/curl.ts +0 -147
  178. package/src/commands/cut.ts +0 -36
  179. package/src/commands/date.ts +0 -30
  180. package/src/commands/declare.ts +0 -49
  181. package/src/commands/deluser.ts +0 -98
  182. package/src/commands/df.ts +0 -23
  183. package/src/commands/diff.ts +0 -43
  184. package/src/commands/dpkg.ts +0 -180
  185. package/src/commands/du.ts +0 -56
  186. package/src/commands/echo.ts +0 -58
  187. package/src/commands/env.ts +0 -23
  188. package/src/commands/exit.ts +0 -18
  189. package/src/commands/export.ts +0 -34
  190. package/src/commands/find.ts +0 -68
  191. package/src/commands/free.ts +0 -47
  192. package/src/commands/grep.ts +0 -116
  193. package/src/commands/groups.ts +0 -19
  194. package/src/commands/gzip.ts +0 -88
  195. package/src/commands/head.ts +0 -52
  196. package/src/commands/help.ts +0 -152
  197. package/src/commands/helpers.ts +0 -234
  198. package/src/commands/history.ts +0 -34
  199. package/src/commands/hostname.ts +0 -14
  200. package/src/commands/htop.ts +0 -20
  201. package/src/commands/id.ts +0 -19
  202. package/src/commands/index.ts +0 -9
  203. package/src/commands/kill.ts +0 -19
  204. package/src/commands/ln.ts +0 -71
  205. package/src/commands/ls.ts +0 -243
  206. package/src/commands/lsb-release.ts +0 -63
  207. package/src/commands/man.ts +0 -31
  208. package/src/commands/manuals/adduser.txt +0 -11
  209. package/src/commands/manuals/apt-cache.txt +0 -12
  210. package/src/commands/manuals/apt.txt +0 -20
  211. package/src/commands/manuals/awk.txt +0 -13
  212. package/src/commands/manuals/cat.txt +0 -14
  213. package/src/commands/manuals/cd.txt +0 -16
  214. package/src/commands/manuals/chmod.txt +0 -16
  215. package/src/commands/manuals/clear.txt +0 -10
  216. package/src/commands/manuals/cp.txt +0 -10
  217. package/src/commands/manuals/curl.txt +0 -20
  218. package/src/commands/manuals/date.txt +0 -14
  219. package/src/commands/manuals/declare.txt +0 -12
  220. package/src/commands/manuals/deluser.txt +0 -10
  221. package/src/commands/manuals/df.txt +0 -10
  222. package/src/commands/manuals/dpkg-query.txt +0 -11
  223. package/src/commands/manuals/dpkg.txt +0 -14
  224. package/src/commands/manuals/du.txt +0 -11
  225. package/src/commands/manuals/echo.txt +0 -11
  226. package/src/commands/manuals/false.txt +0 -10
  227. package/src/commands/manuals/find.txt +0 -11
  228. package/src/commands/manuals/free.txt +0 -12
  229. package/src/commands/manuals/grep.txt +0 -13
  230. package/src/commands/manuals/groups.txt +0 -10
  231. package/src/commands/manuals/gzip.txt +0 -11
  232. package/src/commands/manuals/head.txt +0 -10
  233. package/src/commands/manuals/help.txt +0 -11
  234. package/src/commands/manuals/history.txt +0 -11
  235. package/src/commands/manuals/hostname.txt +0 -10
  236. package/src/commands/manuals/id.txt +0 -10
  237. package/src/commands/manuals/kill.txt +0 -13
  238. package/src/commands/manuals/ls.txt +0 -20
  239. package/src/commands/manuals/lsb_release.txt +0 -14
  240. package/src/commands/manuals/mkdir.txt +0 -10
  241. package/src/commands/manuals/mv.txt +0 -10
  242. package/src/commands/manuals/nano.txt +0 -11
  243. package/src/commands/manuals/neofetch.txt +0 -10
  244. package/src/commands/manuals/node.txt +0 -13
  245. package/src/commands/manuals/npm.txt +0 -13
  246. package/src/commands/manuals/npx.txt +0 -13
  247. package/src/commands/manuals/passwd.txt +0 -11
  248. package/src/commands/manuals/ping.txt +0 -10
  249. package/src/commands/manuals/printf.txt +0 -11
  250. package/src/commands/manuals/ps.txt +0 -10
  251. package/src/commands/manuals/pwd.txt +0 -10
  252. package/src/commands/manuals/python3.txt +0 -13
  253. package/src/commands/manuals/readlink.txt +0 -10
  254. package/src/commands/manuals/return.txt +0 -10
  255. package/src/commands/manuals/rm.txt +0 -10
  256. package/src/commands/manuals/sed.txt +0 -11
  257. package/src/commands/manuals/set.txt +0 -11
  258. package/src/commands/manuals/shift.txt +0 -10
  259. package/src/commands/manuals/sleep.txt +0 -10
  260. package/src/commands/manuals/sort.txt +0 -12
  261. package/src/commands/manuals/source.txt +0 -11
  262. package/src/commands/manuals/ssh.txt +0 -11
  263. package/src/commands/manuals/stat.txt +0 -10
  264. package/src/commands/manuals/su.txt +0 -13
  265. package/src/commands/manuals/sudo.txt +0 -11
  266. package/src/commands/manuals/tail.txt +0 -10
  267. package/src/commands/manuals/tar.txt +0 -19
  268. package/src/commands/manuals/tee.txt +0 -10
  269. package/src/commands/manuals/test.txt +0 -11
  270. package/src/commands/manuals/touch.txt +0 -11
  271. package/src/commands/manuals/tr.txt +0 -10
  272. package/src/commands/manuals/trap.txt +0 -10
  273. package/src/commands/manuals/true.txt +0 -10
  274. package/src/commands/manuals/type.txt +0 -10
  275. package/src/commands/manuals/uname.txt +0 -12
  276. package/src/commands/manuals/uniq.txt +0 -12
  277. package/src/commands/manuals/unset.txt +0 -10
  278. package/src/commands/manuals/uptime.txt +0 -11
  279. package/src/commands/manuals/wc.txt +0 -12
  280. package/src/commands/manuals/wget.txt +0 -12
  281. package/src/commands/manuals/which.txt +0 -10
  282. package/src/commands/manuals/whoami.txt +0 -10
  283. package/src/commands/manuals/xargs.txt +0 -10
  284. package/src/commands/manuals-bundle.ts +0 -898
  285. package/src/commands/mkdir.ts +0 -31
  286. package/src/commands/mv.ts +0 -50
  287. package/src/commands/nano.ts +0 -38
  288. package/src/commands/neofetch.ts +0 -53
  289. package/src/commands/node.ts +0 -341
  290. package/src/commands/npm.ts +0 -132
  291. package/src/commands/passwd.ts +0 -50
  292. package/src/commands/ping.ts +0 -32
  293. package/src/commands/printf.ts +0 -129
  294. package/src/commands/ps.ts +0 -58
  295. package/src/commands/pwd.ts +0 -9
  296. package/src/commands/python.ts +0 -2229
  297. package/src/commands/read.ts +0 -46
  298. package/src/commands/registry.ts +0 -249
  299. package/src/commands/rm.ts +0 -42
  300. package/src/commands/runtime.ts +0 -378
  301. package/src/commands/sed.ts +0 -68
  302. package/src/commands/seq.ts +0 -43
  303. package/src/commands/set.ts +0 -29
  304. package/src/commands/sh.ts +0 -467
  305. package/src/commands/shift.ts +0 -63
  306. package/src/commands/sleep.ts +0 -20
  307. package/src/commands/sort.ts +0 -46
  308. package/src/commands/source.ts +0 -52
  309. package/src/commands/stat.ts +0 -61
  310. package/src/commands/su.ts +0 -72
  311. package/src/commands/sudo.ts +0 -76
  312. package/src/commands/tail.ts +0 -53
  313. package/src/commands/tar.ts +0 -102
  314. package/src/commands/tee.ts +0 -36
  315. package/src/commands/test.ts +0 -137
  316. package/src/commands/touch.ts +0 -28
  317. package/src/commands/tr.ts +0 -70
  318. package/src/commands/tree.ts +0 -20
  319. package/src/commands/true.ts +0 -27
  320. package/src/commands/type.ts +0 -48
  321. package/src/commands/uname.ts +0 -29
  322. package/src/commands/uniq.ts +0 -39
  323. package/src/commands/unset.ts +0 -17
  324. package/src/commands/uptime.ts +0 -54
  325. package/src/commands/wc.ts +0 -55
  326. package/src/commands/wget.ts +0 -148
  327. package/src/commands/which.ts +0 -37
  328. package/src/commands/who.ts +0 -25
  329. package/src/commands/whoami.ts +0 -14
  330. package/src/commands/xargs.ts +0 -31
  331. package/src/index.ts +0 -67
  332. package/src/modules/linuxRootfs.ts +0 -1961
  333. package/src/modules/neofetch.ts +0 -358
  334. package/src/modules/shellInteractive.ts +0 -57
  335. package/src/modules/shellRuntime.ts +0 -76
  336. package/src/self-standalone.ts +0 -542
  337. package/src/standalone-wo-sftp.ts +0 -38
  338. package/src/standalone.ts +0 -72
  339. package/src/types/commands.ts +0 -146
  340. package/src/types/pipeline.ts +0 -52
  341. package/src/types/streams.ts +0 -32
  342. package/src/types/tar-stream.d.ts +0 -38
  343. package/src/types/vfs.ts +0 -98
  344. package/src/utils/expand.ts +0 -491
  345. package/src/utils/perfLogger.ts +0 -72
  346. package/src/utils/tokenize.ts +0 -98
  347. package/src/utils/vfsDiff.ts +0 -275
  348. package/tests/command-helpers.test.ts +0 -116
  349. package/tests/commands-admin-net.test.ts +0 -441
  350. package/tests/commands-advanced.test.ts +0 -456
  351. package/tests/commands-core.test.ts +0 -562
  352. package/tests/commands-missing.test.ts +0 -570
  353. package/tests/commands-specific-units.test.ts +0 -327
  354. package/tests/commands-text-sys.test.ts +0 -445
  355. package/tests/expand.test.ts +0 -170
  356. package/tests/helpers.test.ts +0 -97
  357. package/tests/new-features.test.ts +0 -1036
  358. package/tests/parser-executor.test.ts +0 -37
  359. package/tests/sftp.test.ts +0 -323
  360. package/tests/ssh-exec.test.ts +0 -45
  361. package/tests/test-helper.ts +0 -79
  362. package/tests/users.test.ts +0 -86
  363. package/tsconfig.json +0 -49
  364. package/typedoc.json +0 -47
@@ -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
- }
@@ -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)`);
@@ -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}."