get-claudia 1.55.10 → 1.55.11

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/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  All notable changes to Claudia will be documented in this file.
4
4
 
5
+ ## 1.55.11 (2026-03-15)
6
+
7
+ - **Auto-repair corrupt claudia.db** -- Installer detects when `claudia.db` is empty or corrupt (no tables, malformed disk image) and removes it along with stale WAL/SHM files so the daemon can create a fresh one. Previously, a corrupt db with leftover SHM files caused "database disk image is malformed" on every startup, blocking the daemon and preventing database consolidation.
8
+ - **Color scheme** -- Replaced all green in the installer with cyan/teal to match Claude's palette. The installer now only uses white, cyan, and yellow throughout.
9
+
5
10
  ## 1.55.10 (2026-03-15)
6
11
 
7
12
  ### The Personality Update
package/bin/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { existsSync, mkdirSync, cpSync, readdirSync, readFileSync, writeFileSync, statSync, renameSync } from 'fs';
3
+ import { existsSync, mkdirSync, cpSync, readdirSync, readFileSync, writeFileSync, statSync, renameSync, unlinkSync } from 'fs';
4
4
  import { join, dirname } from 'path';
5
5
  import { fileURLToPath } from 'url';
6
6
  import { spawn, execFileSync } from 'child_process';
@@ -193,7 +193,7 @@ class ProgressRenderer {
193
193
 
194
194
  getIcon(state) {
195
195
  switch (state) {
196
- case 'done': return `${colors.green}✓${colors.reset}`;
196
+ case 'done': return `${colors.cyan}✓${colors.reset}`;
197
197
  case 'warn': return `${colors.yellow}○${colors.reset}`;
198
198
  case 'error': return `${colors.red}!${colors.reset}`;
199
199
  case 'active': return `${colors.cyan}${this.spinnerChars[this.spinnerFrame]}${colors.reset}`;
@@ -216,7 +216,7 @@ class ProgressRenderer {
216
216
  const barWidth = 20;
217
217
  const filled = Math.round((done / total) * barWidth);
218
218
  const empty = barWidth - filled;
219
- return ` [${colors.green}${'█'.repeat(filled)}${colors.reset}${'░'.repeat(empty)}] ${done}/${total}`;
219
+ return ` [${colors.cyan}${'█'.repeat(filled)}${colors.reset}${'░'.repeat(empty)}] ${done}/${total}`;
220
220
  }
221
221
 
222
222
  getSubtitle() {
@@ -646,7 +646,7 @@ async function main() {
646
646
  }
647
647
 
648
648
  console.log('');
649
- console.log(` ${colors.green}✓${colors.reset} Framework updated (data preserved)`);
649
+ console.log(` ${colors.cyan}✓${colors.reset} Framework updated (data preserved)`);
650
650
  }
651
651
 
652
652
  // Restore MCP servers that earlier versions incorrectly disabled.
@@ -813,15 +813,50 @@ async function main() {
813
813
  const hasExistingDb = existingDbs.length > 0;
814
814
 
815
815
  if (hasExistingDb) {
816
+ // Health check: detect and remove corrupt/empty claudia.db with stale WAL/SHM files.
817
+ // This prevents "database disk image is malformed" from blocking daemon startup.
818
+ const mainDb = join(memoryDir, 'claudia.db');
819
+ if (existsSync(mainDb)) {
820
+ let dbHealthy = false;
821
+ try {
822
+ execFileSync('sqlite3', [mainDb, 'SELECT COUNT(*) FROM memories;'], {
823
+ encoding: 'utf-8', timeout: 3000, stdio: ['pipe', 'pipe', 'pipe'],
824
+ });
825
+ dbHealthy = true;
826
+ } catch {
827
+ // claudia.db exists but can't be queried (empty, corrupt, or stale WAL)
828
+ dbHealthy = false;
829
+ }
830
+
831
+ if (!dbHealthy) {
832
+ // Check if there are other databases with actual data to merge
833
+ const otherDbs = existingDbs.filter(f => f !== 'claudia.db' && f !== 'demo.db');
834
+ // Safe to remove: claudia.db is broken and there are other sources, OR it's truly empty
835
+ const dbSize = statSync(mainDb).size;
836
+ if (otherDbs.length > 0 || dbSize <= 8192) {
837
+ try {
838
+ // Remove corrupt db and stale WAL/SHM so daemon can create a fresh one.
839
+ // Stale SHM files cause "database disk image is malformed" on new connections.
840
+ const filesToRemove = [mainDb, mainDb + '-shm', mainDb + '-wal'];
841
+ for (const f of filesToRemove) {
842
+ try { if (existsSync(f)) unlinkSync(f); } catch {}
843
+ }
844
+ renderer.update('memory', 'active', 'repaired corrupt claudia.db');
845
+ } catch (e) {
846
+ // If removal fails, continue -- daemon will report the error
847
+ }
848
+ }
849
+ }
850
+ }
851
+
816
852
  // Show a quick count via sqlite3 if available
817
853
  let quickMemCount = 0;
818
- const mainDb = join(memoryDir, 'claudia.db');
819
854
  if (existsSync(mainDb)) {
820
855
  try {
821
856
  quickMemCount = parseInt(execFileSync('sqlite3', [mainDb, 'SELECT COUNT(*) FROM memories;'], {
822
857
  encoding: 'utf-8', timeout: 3000, stdio: ['pipe', 'pipe', 'pipe'],
823
858
  }).trim(), 10) || 0;
824
- } catch { /* sqlite3 CLI not available */ }
859
+ } catch { /* sqlite3 CLI not available or db just cleaned up */ }
825
860
  }
826
861
  const memoryLabel = quickMemCount > 0
827
862
  ? `${quickMemCount.toLocaleString()} memories in claudia.db`
@@ -1153,7 +1188,7 @@ async function main() {
1153
1188
  console.log('');
1154
1189
 
1155
1190
  if (dbScan.unified.exists) {
1156
- console.log(` ${colors.green}●${colors.reset} claudia.db: ${colors.bold}${memLabel(dbScan.unified.memories)}${colors.reset}, ${colors.bold}${entLabel(dbScan.unified.entities)}${colors.reset}`);
1191
+ console.log(` ${colors.cyan}●${colors.reset} claudia.db: ${colors.bold}${memLabel(dbScan.unified.memories)}${colors.reset}, ${colors.bold}${entLabel(dbScan.unified.entities)}${colors.reset}`);
1157
1192
  }
1158
1193
 
1159
1194
  if (withData.length > 0) {
@@ -1188,14 +1223,14 @@ async function main() {
1188
1223
  if (isUpgrade) {
1189
1224
  // Returning user: short and sweet
1190
1225
  const version = getVersion();
1191
- console.log(` ${colors.green}Updated to v${version}.${colors.reset}`);
1226
+ console.log(` ${colors.cyan}Updated to v${version}.${colors.reset}`);
1192
1227
  console.log('');
1193
1228
  console.log(` ${colors.cyan}${launchCmd}${colors.reset}`);
1194
1229
  console.log('');
1195
1230
  console.log(` ${colors.dim}What's new: /morning-brief · /inbox-check${colors.reset}`);
1196
1231
  } else {
1197
1232
  // Fresh install: build anticipation for the onboarding
1198
- console.log(` ${colors.green}Claudia is ready.${colors.reset} ${colors.dim}She's waiting to meet you.${colors.reset}`);
1233
+ console.log(` ${colors.cyan}Claudia is ready.${colors.reset} ${colors.dim}She's waiting to meet you.${colors.reset}`);
1199
1234
  console.log('');
1200
1235
  if (!isCurrentDir) {
1201
1236
  console.log(` ${colors.cyan}cd ${targetDir}${colors.reset}`);
@@ -1314,7 +1349,7 @@ function restoreMcpServers(targetPath) {
1314
1349
 
1315
1350
  if (changed) {
1316
1351
  writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n');
1317
- console.log(` ${colors.green}✓${colors.reset} Restored MCP servers: ${restored.join(', ')}`);
1352
+ console.log(` ${colors.cyan}✓${colors.reset} Restored MCP servers: ${restored.join(', ')}`);
1318
1353
  }
1319
1354
  } catch {
1320
1355
  // Not valid JSON or can't read -- skip silently
@@ -1711,7 +1746,7 @@ async function runGoogleSetup() {
1711
1746
  // Pick tier
1712
1747
  console.log('');
1713
1748
  console.log(` ${colors.boldCyan}Tool tiers:${colors.reset}`);
1714
- console.log(` ${colors.green}core${colors.reset} 43 tools Gmail, Calendar, Drive, Contacts ${colors.dim}(recommended)${colors.reset}`);
1749
+ console.log(` ${colors.cyan}core${colors.reset} 43 tools Gmail, Calendar, Drive, Contacts ${colors.dim}(recommended)${colors.reset}`);
1715
1750
  console.log(` ${colors.yellow}extended${colors.reset} 83 tools + Docs, Sheets, Tasks, Chat`);
1716
1751
  console.log(` ${colors.magenta}complete${colors.reset} 111 tools + Slides, Forms, Apps Script`);
1717
1752
  console.log('');
@@ -1723,10 +1758,10 @@ async function runGoogleSetup() {
1723
1758
  setupGoogleWorkspace(targetPath, clientId, clientSecret, tier);
1724
1759
 
1725
1760
  console.log('');
1726
- console.log(` ${colors.green}✓${colors.reset} Google Workspace MCP configured (${colors.bold}${tier}${colors.reset} tier)`);
1761
+ console.log(` ${colors.cyan}✓${colors.reset} Google Workspace MCP configured (${colors.bold}${tier}${colors.reset} tier)`);
1727
1762
 
1728
1763
  if (state.hasOldGmail || state.hasOldCalendar) {
1729
- console.log(` ${colors.green}✓${colors.reset} Old Gmail/Calendar entries removed`);
1764
+ console.log(` ${colors.cyan}✓${colors.reset} Old Gmail/Calendar entries removed`);
1730
1765
  }
1731
1766
 
1732
1767
  // Build one-click API enablement URL
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "get-claudia",
3
- "version": "1.55.10",
3
+ "version": "1.55.11",
4
4
  "description": "An AI assistant who learns how you work.",
5
5
  "keywords": [
6
6
  "claudia",