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 +5 -0
- package/bin/index.js +48 -13
- package/package.json +1 -1
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1764
|
+
console.log(` ${colors.cyan}✓${colors.reset} Old Gmail/Calendar entries removed`);
|
|
1730
1765
|
}
|
|
1731
1766
|
|
|
1732
1767
|
// Build one-click API enablement URL
|