get-claudia 1.26.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.js CHANGED
@@ -3,8 +3,7 @@
3
3
  import { existsSync, mkdirSync, cpSync, readdirSync, readFileSync, writeFileSync, statSync } from 'fs';
4
4
  import { join, dirname } from 'path';
5
5
  import { fileURLToPath } from 'url';
6
- import { execSync, spawn } from 'child_process';
7
- import { createInterface } from 'readline';
6
+ import { spawn } from 'child_process';
8
7
  import { homedir } from 'os';
9
8
 
10
9
  const __filename = fileURLToPath(import.meta.url);
@@ -31,6 +30,35 @@ const colors = {
31
30
  boldCyan: '\x1b[1;36m',
32
31
  };
33
32
 
33
+ // Read version from package.json
34
+ function getVersion() {
35
+ try {
36
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'));
37
+ return pkg.version || '0.0.0';
38
+ } catch {
39
+ return '0.0.0';
40
+ }
41
+ }
42
+
43
+ // Typewriter effect - writes text char by char
44
+ function typewriter(text, color = '') {
45
+ return new Promise((resolve) => {
46
+ const reset = color ? colors.reset : '';
47
+ let i = 0;
48
+ process.stdout.write(color);
49
+ const interval = setInterval(() => {
50
+ if (i < text.length) {
51
+ process.stdout.write(text[i]);
52
+ i++;
53
+ } else {
54
+ process.stdout.write(reset + '\n');
55
+ clearInterval(interval);
56
+ resolve();
57
+ }
58
+ }, 25);
59
+ });
60
+ }
61
+
34
62
  // Pixel art banner - "CLAUDIA" text + portrait (double-width for square pixels)
35
63
  const b = colors.cyan; // blue pixels
36
64
  const y = colors.yellow; // yellow pixels (hair)
@@ -53,14 +81,18 @@ ${b}${px}${px}${r}${_}${b}${px}${px}${r}${_}${b}${px}${r}${_}${b}${px}${r}${_}${
53
81
  ${w}${px}${r}${_}${w}${px}${r}
54
82
  `;
55
83
 
56
- const banner = `
57
- ${bannerArt}
58
- ${colors.dim}Agentic executive assistant. Learns and adapts to how you work.${colors.reset}
59
- ${colors.dim}by Kamil Banc${colors.reset}
60
- `;
61
-
62
84
  async function main() {
63
- console.log(banner);
85
+ const version = getVersion();
86
+
87
+ // Print pixel art
88
+ console.log(bannerArt);
89
+
90
+ // Version badge + tagline + attribution (all yellow)
91
+ console.log(` ${colors.boldYellow}CLAUDIA${colors.reset} ${colors.yellow}v${version}${colors.reset}`);
92
+ await typewriter(' Agentic executive assistant. Learns and adapts to how you work.', colors.yellow);
93
+ console.log(` ${colors.yellow}by Kamil Banc${colors.reset}`);
94
+ console.log(` ${colors.yellow}${'─'.repeat(40)}${colors.reset}`);
95
+ console.log();
64
96
 
65
97
  // Determine target directory and flags
66
98
  const args = process.argv.slice(2);
@@ -77,7 +109,7 @@ async function main() {
77
109
  const displayDir = isCurrentDir ? 'current directory' : targetDir;
78
110
 
79
111
  if (isDemoMode) {
80
- console.log(`${colors.yellow}🎭 Demo mode${colors.reset} - Will seed with example data after install`);
112
+ console.log(`${colors.yellow}Demo mode${colors.reset} - Will seed with example data after install`);
81
113
  }
82
114
 
83
115
  // Check if directory already exists with Claudia files
@@ -89,7 +121,7 @@ async function main() {
89
121
 
90
122
  if (hasClaudioFiles) {
91
123
  isUpgrade = true;
92
- console.log(`\n${colors.cyan}✓${colors.reset} Found existing Claudia instance. Upgrading framework files...`);
124
+ console.log(`${colors.cyan}✓${colors.reset} Found existing Claudia instance. Upgrading framework files...`);
93
125
  }
94
126
  }
95
127
 
@@ -106,7 +138,7 @@ async function main() {
106
138
  cpSync(templatePath, targetPath, { recursive: true });
107
139
  console.log(`${colors.green}✓${colors.reset} Installed in ${displayDir}`);
108
140
  } catch (error) {
109
- console.error(`\n${colors.yellow}⚠${colors.reset} Error copying files: ${error.message}`);
141
+ console.error(`\n${colors.yellow}!${colors.reset} Error copying files: ${error.message}`);
110
142
  process.exit(1);
111
143
  }
112
144
  } else {
@@ -134,7 +166,7 @@ async function main() {
134
166
  console.log(`${colors.green}✓${colors.reset} Updated ${upgraded} framework components (skills, commands, rules, identity)`);
135
167
  console.log(`${colors.dim} Your data (context/, people/, projects/) was preserved.${colors.reset}`);
136
168
  } catch (error) {
137
- console.error(`\n${colors.yellow}⚠${colors.reset} Error upgrading files: ${error.message}`);
169
+ console.error(`\n${colors.yellow}!${colors.reset} Error upgrading files: ${error.message}`);
138
170
  process.exit(1);
139
171
  }
140
172
  }
@@ -142,23 +174,6 @@ async function main() {
142
174
  // Show what's new in this release
143
175
  showWhatsNew(isUpgrade);
144
176
 
145
- // Interactive setup prompts
146
- const rl = createInterface({
147
- input: process.stdin,
148
- output: process.stdout
149
- });
150
-
151
- const askYesNo = (question) => {
152
- return new Promise((resolve) => {
153
- rl.question(question, (answer) => {
154
- resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
155
- });
156
- });
157
- };
158
-
159
- const setupMemory = await askYesNo(`\n${colors.yellow}?${colors.reset} Set up enhanced memory system? (recommended) [y/n]: `);
160
- rl.close();
161
-
162
177
  // Helper: seed demo database using spawn (safe, no shell injection)
163
178
  function seedDemoDatabase(targetPath, mcpPath, callback) {
164
179
  console.log(`\n${colors.cyan}Seeding demo database...${colors.reset}`);
@@ -205,7 +220,7 @@ async function main() {
205
220
 
206
221
  // Helper: run visualizer install script and call back when done (auto-install, no prompt)
207
222
  function runVisualizerSetup(callback) {
208
- console.log(`\n${colors.cyan}Setting up brain visualizer...${colors.reset}`);
223
+ console.log(`\n${colors.boldYellow}━━━ Phase 2/3: Brain Visualizer ━━━${colors.reset}\n`);
209
224
 
210
225
  const visualizerScriptPath = isWindows
211
226
  ? join(__dirname, '..', 'visualizer', 'scripts', 'install.ps1')
@@ -248,7 +263,7 @@ async function main() {
248
263
 
249
264
  // Helper: run gateway install script and call back when done
250
265
  function runGatewaySetup(callback) {
251
- console.log(`\n${colors.cyan}Setting up messaging gateway...${colors.reset}`);
266
+ console.log(`\n${colors.boldYellow}━━━ Phase 3/3: Messaging Gateway ━━━${colors.reset}\n`);
252
267
 
253
268
  const gatewayScriptPath = isWindows
254
269
  ? join(__dirname, '..', 'gateway', 'scripts', 'install.ps1')
@@ -269,7 +284,8 @@ async function main() {
269
284
  stdio: 'inherit',
270
285
  env: {
271
286
  ...process.env,
272
- CLAUDIA_GATEWAY_UPGRADE: isUpgrade ? '1' : '0'
287
+ CLAUDIA_GATEWAY_UPGRADE: isUpgrade ? '1' : '0',
288
+ CLAUDIA_GATEWAY_SKIP_SETUP: '1'
273
289
  }
274
290
  });
275
291
 
@@ -354,135 +370,119 @@ async function main() {
354
370
  }
355
371
  }
356
372
 
357
- if (setupMemory) {
358
- console.log(`\n${colors.cyan}Setting up enhanced memory system...${colors.reset}`);
359
-
360
- const memoryDaemonPath = isWindows
361
- ? join(__dirname, '..', 'memory-daemon', 'scripts', 'install.ps1')
362
- : join(__dirname, '..', 'memory-daemon', 'scripts', 'install.sh');
363
-
364
- if (existsSync(memoryDaemonPath)) {
365
- try {
366
- // Run the install script, passing project path for upgrades
367
- const spawnCmd = isWindows ? powershellPath : 'bash';
368
- const spawnArgs = isWindows
369
- ? ['-ExecutionPolicy', 'Bypass', '-File', memoryDaemonPath]
370
- : [memoryDaemonPath];
371
- const result = spawn(spawnCmd, spawnArgs, {
372
- stdio: 'inherit',
373
- env: {
374
- ...process.env,
375
- CLAUDIA_PROJECT_PATH: isUpgrade ? targetPath : ''
373
+ // Memory system always installs (no prompt)
374
+ console.log(`\n${colors.boldYellow}━━━ Phase 1/3: Memory System ━━━${colors.reset}\n`);
375
+
376
+ const memoryDaemonPath = isWindows
377
+ ? join(__dirname, '..', 'memory-daemon', 'scripts', 'install.ps1')
378
+ : join(__dirname, '..', 'memory-daemon', 'scripts', 'install.sh');
379
+
380
+ if (existsSync(memoryDaemonPath)) {
381
+ try {
382
+ // Run the install script, passing project path for upgrades
383
+ const spawnCmd = isWindows ? powershellPath : 'bash';
384
+ const spawnArgs = isWindows
385
+ ? ['-ExecutionPolicy', 'Bypass', '-File', memoryDaemonPath]
386
+ : [memoryDaemonPath];
387
+ const result = spawn(spawnCmd, spawnArgs, {
388
+ stdio: 'inherit',
389
+ env: {
390
+ ...process.env,
391
+ CLAUDIA_PROJECT_PATH: isUpgrade ? targetPath : '',
392
+ CLAUDIA_NONINTERACTIVE: '1'
393
+ }
394
+ });
395
+
396
+ result.on('close', (code) => {
397
+ let memoryOk = false;
398
+ if (code === 0) {
399
+ console.log(`${colors.green}✓${colors.reset} Memory system installed`);
400
+ memoryOk = true;
401
+
402
+ // Update .mcp.json if it exists
403
+ const mcpPath = join(targetPath, '.mcp.json');
404
+ const mcpExamplePath = join(targetPath, '.mcp.json.example');
405
+
406
+ if (existsSync(mcpExamplePath) && !existsSync(mcpPath)) {
407
+ // Read example and add memory server
408
+ let mcpConfig = JSON.parse(readFileSync(mcpExamplePath, 'utf8'));
409
+ mcpConfig.mcpServers = mcpConfig.mcpServers || {};
410
+
411
+ const home = homedir();
412
+ const pythonCmd = isWindows
413
+ ? join(home, '.claudia', 'daemon', 'venv', 'Scripts', 'python.exe')
414
+ : `${process.env.HOME}/.claudia/daemon/venv/bin/python`;
415
+
416
+ mcpConfig.mcpServers['claudia-memory'] = {
417
+ command: pythonCmd,
418
+ args: ['-m', 'claudia_memory.mcp.server'],
419
+ _description: 'Claudia memory system with vector search'
420
+ };
421
+ writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2));
422
+ console.log(`${colors.green}✓${colors.reset} Created .mcp.json with memory server`);
376
423
  }
377
- });
378
-
379
- result.on('close', (code) => {
380
- let memoryOk = false;
381
- if (code === 0) {
382
- console.log(`${colors.green}✓${colors.reset} Memory system installed`);
383
- memoryOk = true;
384
-
385
- // Update .mcp.json if it exists
386
- const mcpPath = join(targetPath, '.mcp.json');
387
- const mcpExamplePath = join(targetPath, '.mcp.json.example');
388
-
389
- if (existsSync(mcpExamplePath) && !existsSync(mcpPath)) {
390
- // Read example and add memory server
391
- let mcpConfig = JSON.parse(readFileSync(mcpExamplePath, 'utf8'));
392
- mcpConfig.mcpServers = mcpConfig.mcpServers || {};
393
-
394
- const home = homedir();
395
- const pythonCmd = isWindows
396
- ? join(home, '.claudia', 'daemon', 'venv', 'Scripts', 'python.exe')
397
- : `${process.env.HOME}/.claudia/daemon/venv/bin/python`;
398
-
399
- mcpConfig.mcpServers['claudia-memory'] = {
400
- command: pythonCmd,
401
- args: ['-m', 'claudia_memory.mcp.server'],
402
- _description: 'Claudia memory system with vector search'
403
- };
404
- writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2));
405
- console.log(`${colors.green}✓${colors.reset} Created .mcp.json with memory server`);
406
- }
407
424
 
408
- // Seed demo database if --demo flag was passed
409
- if (isDemoMode) {
410
- const mcpPathForDemo = join(targetPath, '.mcp.json');
411
- seedDemoDatabase(targetPath, mcpPathForDemo, () => maybeRunVisualizer(memoryOk));
412
- return; // Wait for demo seed to complete
413
- }
425
+ // Seed demo database if --demo flag was passed
426
+ if (isDemoMode) {
427
+ const mcpPathForDemo = join(targetPath, '.mcp.json');
428
+ seedDemoDatabase(targetPath, mcpPathForDemo, () => maybeRunVisualizer(memoryOk));
429
+ return; // Wait for demo seed to complete
430
+ }
431
+ } else {
432
+ console.log(`${colors.yellow}!${colors.reset} Memory setup had issues. You can run it later with:`);
433
+ if (isWindows) {
434
+ console.log(` ${colors.cyan}powershell.exe -ExecutionPolicy Bypass -File "${memoryDaemonPath}"${colors.reset}`);
414
435
  } else {
415
- console.log(`${colors.yellow}!${colors.reset} Memory setup had issues. You can run it later with:`);
416
- if (isWindows) {
417
- console.log(` ${colors.cyan}powershell.exe -ExecutionPolicy Bypass -File "${memoryDaemonPath}"${colors.reset}`);
418
- } else {
419
- console.log(` ${colors.cyan}bash ${memoryDaemonPath}${colors.reset}`);
420
- }
436
+ console.log(` ${colors.cyan}bash ${memoryDaemonPath}${colors.reset}`);
421
437
  }
438
+ }
422
439
 
423
- // Chain visualizer setup (auto), then gateway (if requested)
424
- maybeRunVisualizer(memoryOk);
425
- });
440
+ // Chain visualizer setup (auto), then gateway
441
+ maybeRunVisualizer(memoryOk);
442
+ });
426
443
 
427
- return; // Wait for spawn to complete
428
- } catch (error) {
429
- console.log(`${colors.yellow}!${colors.reset} Could not set up memory system: ${error.message}`);
430
- console.log(` You can set it up later manually.`);
431
- }
432
- } else {
433
- console.log(`${colors.yellow}!${colors.reset} Memory daemon files not found. Skipping.`);
444
+ return; // Wait for spawn to complete
445
+ } catch (error) {
446
+ console.log(`${colors.yellow}!${colors.reset} Could not set up memory system: ${error.message}`);
447
+ console.log(` You can set it up later manually.`);
434
448
  }
449
+ } else {
450
+ console.log(`${colors.yellow}!${colors.reset} Memory daemon files not found. Skipping.`);
435
451
  }
436
452
 
437
- // Memory skipped or failed to spawn -- continue with visualizer/gateway
453
+ // Memory failed to spawn -- continue with visualizer/gateway
438
454
  maybeRunVisualizer(false);
439
455
 
440
456
  function showNextSteps(memoryInstalled, visualizerInstalled, gatewayInstalled, systemHealthy = true) {
441
- // Show next steps - different message based on what was installed
442
457
  const cdStep = isCurrentDir ? '' : ` ${colors.cyan}cd ${targetDir}${colors.reset}\n`;
443
458
 
444
- if (memoryInstalled) {
445
- if (systemHealthy) {
446
- console.log(`
447
- ${colors.bold}Next:${colors.reset}
448
- ${cdStep} ${colors.cyan}claude${colors.reset}
449
- ${colors.dim}Memory system ready!${colors.reset}
459
+ // Installation summary
460
+ console.log(`\n${colors.boldYellow}━━━ Installation Complete ━━━${colors.reset}\n`);
450
461
 
451
- ${colors.dim}If Claude was already running elsewhere, restart it to activate memory tools.${colors.reset}
452
- `);
453
- } else {
454
- console.log(`
455
- ${colors.yellow}Some issues were detected above.${colors.reset}
456
- ${colors.dim}You can fix them now, or Claudia will work in fallback mode until they're resolved.${colors.reset}
457
- ${colors.dim}Re-run diagnostics anytime: ${isWindows ? '%USERPROFILE%\\.claudia\\diagnose.ps1' : '~/.claudia/diagnose.sh'}${colors.reset}
462
+ const check = `${colors.green}✓${colors.reset}`;
463
+ const warn = `${colors.yellow}○${colors.reset}`;
458
464
 
459
- ${colors.bold}Next:${colors.reset}
460
- ${cdStep} ${colors.cyan}claude${colors.reset}
461
- ${colors.dim}Claudia will help you troubleshoot with /diagnose${colors.reset}
462
- `);
463
- }
464
- } else {
465
- console.log(`
466
- ${colors.bold}Next:${colors.reset}
467
- ${cdStep} ${colors.cyan}claude${colors.reset}
468
- ${colors.dim}Say hi!${colors.reset}
465
+ console.log(`${memoryInstalled ? check : warn} Memory system ${memoryInstalled ? 'Active' : 'Skipped'}`);
466
+ console.log(`${visualizerInstalled ? check : warn} Brain visualizer ${visualizerInstalled ? 'Active' : 'Skipped'}`);
467
+ console.log(`${gatewayInstalled ? check : warn} Gateway ${gatewayInstalled ? 'Installed' : 'Skipped'}`);
469
468
 
470
- ${colors.dim}She'll introduce herself and set things up for you.${colors.reset}
471
- `);
469
+ if (gatewayInstalled) {
470
+ console.log(`${colors.yellow}->${colors.reset} Configure tokens: ~/.claudia/gateway.json`);
472
471
  }
473
472
 
474
- if (visualizerInstalled) {
475
- console.log(`${colors.bold}Brain Visualizer:${colors.reset}
476
- ${colors.dim}See your memory in 3D:${colors.reset} ${colors.cyan}/brain${colors.reset}
477
- `);
473
+ if (!systemHealthy) {
474
+ console.log(`\n${colors.yellow}Some issues were detected above.${colors.reset}`);
475
+ console.log(`${colors.dim}You can fix them now, or Claudia will work in fallback mode until they're resolved.${colors.reset}`);
476
+ console.log(`${colors.dim}Re-run diagnostics anytime: ${isWindows ? '%USERPROFILE%\\.claudia\\diagnose.ps1' : '~/.claudia/diagnose.sh'}${colors.reset}`);
478
477
  }
479
478
 
480
- if (gatewayInstalled) {
481
- console.log(`${colors.bold}Gateway:${colors.reset}
482
- ${colors.dim}If claudia-gateway isn't found, open a new terminal or run:${colors.reset}
483
- ${colors.cyan}~/.claudia/bin/claudia-gateway start${colors.reset}
484
- ${colors.dim}See ~/.claudia/gateway.json for settings.${colors.reset}
479
+ console.log(`
480
+ ${colors.bold}Next:${colors.reset}
481
+ ${cdStep} ${colors.cyan}claude${colors.reset}
485
482
  `);
483
+
484
+ if (memoryInstalled) {
485
+ console.log(`${colors.dim}If Claude was already running elsewhere, restart it to activate memory tools.${colors.reset}`);
486
486
  }
487
487
  }
488
488
  }
@@ -503,20 +503,17 @@ ${line}
503
503
  ${header}
504
504
  ${line}
505
505
 
506
- ${bc}Document Storage${r} ${d}Files, transcripts, and emails are stored${r}
507
- ${d}and linked to people and memories.${r}
508
-
509
- ${bc}Provenance${r} ${d}Every fact traces back to its source.${r}
510
- ${d}Ask "how do you know that?" and Claudia shows her work.${r}
506
+ ${bc}Zero-Prompt Install${r} ${d}Everything installs automatically.${r}
507
+ ${d}No questions, smart defaults, graceful fallbacks.${r}
511
508
 
512
- ${bc}Graph Traversal${r} ${d}Ask about a person, see their connected${r}
513
- ${d}network of people and projects.${r}
509
+ ${bc}Gateway Auto-Setup${r} ${d}Messaging gateway installs with everything.${r}
510
+ ${d}Configure tokens at your own pace.${r}
514
511
 
515
- ${bc}Smart Briefing${r} ${d}Session startup is now ~500 tokens, not${r}
516
- ${d}thousands. Full context pulled on demand.${r}
512
+ ${bc}Document Storage${r} ${d}Files, transcripts, and emails are stored${r}
513
+ ${d}and linked to people and memories.${r}
517
514
 
518
- ${bc}/memory-audit${r} ${d}New command. See everything Claudia knows${r}
519
- ${d}about a person, with source chains.${r}
515
+ ${bc}Provenance${r} ${d}Every fact traces back to its source.${r}
516
+ ${d}Ask "how do you know that?" and Claudia shows her work.${r}
520
517
 
521
518
  ${line}
522
519
  `);
@@ -22,8 +22,13 @@ $BIN_DIR = Join-Path $CLAUDIA_DIR "bin"
22
22
  # Upgrade mode
23
23
  $IS_UPGRADE = $env:CLAUDIA_GATEWAY_UPGRADE -eq "1"
24
24
 
25
- # Banner
26
- Clear-Host
25
+ # Skip interactive setup wizard (set by parent installer)
26
+ $SkipSetup = $env:CLAUDIA_GATEWAY_SKIP_SETUP
27
+
28
+ # Banner (skip clear when called from parent installer)
29
+ if ($SkipSetup -ne "1") {
30
+ Clear-Host
31
+ }
27
32
  Write-Host ""
28
33
  Write-Host ($CYAN + "####" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "####" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC)
29
34
  Write-Host ($CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC + " " + $CYAN + "##" + $NC)
@@ -304,6 +309,16 @@ Write-Host " | |"
304
309
  Write-Host " +-----------------------------------------------------------+"
305
310
  Write-Host $NC
306
311
 
312
+ # Skip interactive wizard when called from parent installer
313
+ if ($SkipSetup -eq "1") {
314
+ Write-Host (" " + $GREEN + "[OK]" + $NC + " Gateway ready")
315
+ Write-Host ""
316
+ Write-Host (" " + $BOLD + "Configure messaging:" + $NC)
317
+ Write-Host (" " + $DIM + "Edit " + $CONFIG_FILE + " to add Telegram or Slack tokens." + $NC)
318
+ Write-Host (" " + $DIM + "See: https://github.com/kbanc85/claudia#gateway" + $NC)
319
+ Write-Host ""
320
+ } else {
321
+
307
322
  # Offer interactive setup guide
308
323
  Write-Host " The gateway needs a chat platform (Telegram or Slack) to"
309
324
  Write-Host (" receive your messages. " + $BOLD + "Want a step-by-step setup guide?" + $NC)
@@ -534,6 +549,8 @@ if ($showGuide -match "^[Yy]") {
534
549
  }
535
550
  }
536
551
 
552
+ } # end SkipSetup else block
553
+
537
554
  Write-Host ($BOLD + "Security reminders:" + $NC)
538
555
  Write-Host ""
539
556
  if (-not $LOCAL_MODEL) {
@@ -4,6 +4,9 @@
4
4
 
5
5
  set -e
6
6
 
7
+ # Skip interactive setup wizard (set by parent installer)
8
+ SKIP_SETUP="${CLAUDIA_GATEWAY_SKIP_SETUP:-0}"
9
+
7
10
  # Colors
8
11
  RED='\033[0;31m'
9
12
  GREEN='\033[0;32m'
@@ -30,8 +33,10 @@ elif [ -n "$BASH_VERSION" ] || [ "$(basename "$SHELL")" = "bash" ]; then
30
33
  SHELL_RC="$HOME/.bashrc"
31
34
  fi
32
35
 
33
- # Clear screen and show banner
34
- clear
36
+ # Clear screen and show banner (skip clear when called from parent installer)
37
+ if [ "$SKIP_SETUP" != "1" ]; then
38
+ clear
39
+ fi
35
40
 
36
41
  # Claudia pixel art banner (matching the NPX installer)
37
42
  W='\033[97m' # white
@@ -364,6 +369,17 @@ cat << 'EOF'
364
369
  EOF
365
370
  echo -e "${NC}"
366
371
 
372
+ # Skip interactive wizard when called from parent installer
373
+ if [ "$SKIP_SETUP" = "1" ]; then
374
+ echo -e " ${GREEN}✓${NC} Gateway ready"
375
+ echo
376
+ echo -e " ${BOLD}Configure messaging:${NC}"
377
+ echo -e " ${DIM}Edit ~/.claudia/gateway.json to add Telegram or Slack tokens.${NC}"
378
+ echo -e " ${DIM}See: https://github.com/kbanc85/claudia#gateway${NC}"
379
+ echo
380
+
381
+ else
382
+
367
383
  # Offer interactive setup guide
368
384
  echo -e " The gateway needs a chat platform (Telegram or Slack) to"
369
385
  echo -e " receive your messages. ${BOLD}Want a step-by-step setup guide?${NC}"
@@ -601,6 +617,8 @@ if [[ "$SHOW_GUIDE" =~ ^[Yy] ]]; then
601
617
  fi
602
618
  fi
603
619
 
620
+ fi # end SKIP_SETUP else block
621
+
604
622
  echo -e "${BOLD}Security reminders:${NC}"
605
623
  echo
606
624
  if [ -z "$LOCAL_MODEL" ]; then