icoa-cli 2.19.82 → 2.19.83

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.
@@ -44,7 +44,7 @@ const PYTHON_LIBS = [
44
44
  { name: 'pyserial', check: 'python3 -c "import serial"', install: 'pyserial==3.5', category: 'Security Tools' },
45
45
  ];
46
46
  // ══════════════════════════════════════════════════════════
47
- // 82 System Tools — brew (Mac) / apt (Ubuntu) / choco (Win)
47
+ // 83 System Tools — brew (Mac) / apt (Ubuntu) / choco (Win)
48
48
  // ══════════════════════════════════════════════════════════
49
49
  const W = process.platform === 'win32';
50
50
  const CMD = (unix, win) => W ? (win || `where ${unix}`) : `which ${unix}`;
@@ -109,6 +109,8 @@ const SYSTEM_TOOLS = [
109
109
  { name: 'xxd', check: CMD('xxd'), brew: 'vim', apt: 'xxd', category: 'Forensics' },
110
110
  { name: 'pdftotext', check: CMD('pdftotext'), brew: 'poppler', apt: 'poppler-utils', category: 'Forensics' },
111
111
  { name: 'pngcheck', check: CMD('pngcheck'), brew: 'pngcheck', apt: 'pngcheck', category: 'Forensics' },
112
+ // sleuthkit — disk-image forensics (mmls/fls/icat/blkcat + 20 more)
113
+ { name: 'sleuthkit', check: CMD('mmls'), brew: 'sleuthkit', apt: 'sleuthkit', choco: 'sleuthkit', category: 'Forensics' },
112
114
  // Crypto & Password (4)
113
115
  { name: 'john', check: CMD('john'), brew: 'john', apt: 'john', choco: 'john', category: 'Crypto & Password' },
114
116
  { name: 'hashcat', check: CMD('hashcat'), brew: 'hashcat', apt: 'hashcat', choco: 'hashcat', category: 'Crypto & Password' },
@@ -270,12 +272,12 @@ function getPythonFullVersion() {
270
272
  }
271
273
  export function registerEnvCommand(program) {
272
274
  const envCmd = program.command('env').description('Manage competition environment');
273
- envCmd.command('status').alias('check').description('Check all 109 tools').action(() => showStatus());
275
+ envCmd.command('status').alias('check').description('Check all 110 tools').action(() => showStatus());
274
276
  envCmd.command('setup').description('Install all Python libraries + system tools').action(async () => { await installAll(); });
275
277
  envCmd.command('python').description('Show Python 3.12 install guide for your platform').action(() => showPythonInstallGuide());
276
278
  envCmd.action(() => showStatus());
277
279
  }
278
- // Lightweight Python 3.12 install guide for Selection mode (no 109-tool check).
280
+ // Lightweight Python 3.12 install guide for Selection mode (no 110-tool check).
279
281
  // Detects distro on Linux so contestants get the right command the first time.
280
282
  function showPythonInstallGuide() {
281
283
  const os = platform();
@@ -405,7 +407,7 @@ function showStatus() {
405
407
  console.log(chalk.gray(' You need these for most challenges'));
406
408
  console.log(chalk.yellow(' Recommended') + chalk.gray(' pycryptodome, beautifulsoup4, scapy, sympy'));
407
409
  console.log(chalk.gray(' Covers Web, Crypto, and Forensics'));
408
- console.log(chalk.gray(' Full (109) All tools for every category'));
410
+ console.log(chalk.gray(' Full (110) All tools for every category'));
409
411
  console.log();
410
412
  console.log(chalk.gray(' Missing tools? Run ') + chalk.bold.cyan('env setup') + chalk.gray(' to install everything.'));
411
413
  console.log(chalk.gray(' ─────────────────────────────────────────────'));
@@ -502,7 +504,7 @@ function showStatus() {
502
504
  const total = installed + missing;
503
505
  console.log();
504
506
  console.log(chalk.gray(' ─────────────────────────────────────────────'));
505
- console.log(` ${chalk.green(`✓ ${installed}/${total}`)} ${missing > 0 ? chalk.red(`✗ ${missing} missing`) : chalk.green('All 109 ready!')}`);
507
+ console.log(` ${chalk.green(`✓ ${installed}/${total}`)} ${missing > 0 ? chalk.red(`✗ ${missing} missing`) : chalk.green('All 110 ready!')}`);
506
508
  if (missing > 0) {
507
509
  console.log(chalk.gray(' Install everything: ') + chalk.white('env setup'));
508
510
  }
@@ -101,7 +101,7 @@ async function playDemoIntro() {
101
101
  await waitOrSkip(1500);
102
102
  if (skipped)
103
103
  return;
104
- console.log(chalk.gray(' · 109 CTF tools pre-configured'));
104
+ console.log(chalk.gray(' · 110 CTF tools pre-configured'));
105
105
  await waitOrSkip(400);
106
106
  if (skipped)
107
107
  return;
package/dist/repl.js CHANGED
@@ -245,7 +245,7 @@ export async function startRepl(program, resumeMode) {
245
245
  console.log(chalk.bold.white(' What Makes ICOA Different'));
246
246
  console.log(chalk.gray(' · AI-native AI teammate, AI adversary, AI translation'));
247
247
  console.log(chalk.gray(' · CLI OS Complete competition environment in terminal'));
248
- console.log(chalk.gray(' · 109 tools pwntools, z3, gdb, nmap... pre-configured'));
248
+ console.log(chalk.gray(' · 110 tools pwntools, z3, gdb, nmap, sleuthkit... pre-configured'));
249
249
  console.log(chalk.gray(' · Global scale 15,000+ concurrent exams · 15 languages'));
250
250
  console.log();
251
251
  console.log(chalk.bold.white(' Competition Format'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "icoa-cli",
3
- "version": "2.19.82",
3
+ "version": "2.19.83",
4
4
  "description": "ICOA CLI — The world's first CLI-native CTF competition terminal",
5
5
  "type": "module",
6
6
  "bin": {