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