typescript-virtual-container 1.5.3 → 1.5.5

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