get-claudia 1.55.10 → 1.55.12

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,17 @@
2
2
 
3
3
  All notable changes to Claudia will be documented in this file.
4
4
 
5
+ ## 1.55.12 (2026-03-15)
6
+
7
+ - **Feedback skill** -- New `/feedback` command lets users share bugs, ideas, or suggestions. Claudia collects system context (version, OS, memory count, daemon health), builds a pre-filled GitHub Discussion URL, and opens it in the browser. The user reviews and submits. No data is sent without their knowledge.
8
+ - **GitHub Discussions enabled** -- Feedback and community discussion now live at github.com/kbanc85/claudia/discussions.
9
+ - **Installer feedback hint** -- Completion message now mentions `/feedback` and links to Discussions.
10
+
11
+ ## 1.55.11 (2026-03-15)
12
+
13
+ - **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.
14
+ - **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.
15
+
5
16
  ## 1.55.10 (2026-03-15)
6
17
 
7
18
  ### 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
- console.log(` ${colors.dim}What's new: /morning-brief · /inbox-check${colors.reset}`);
1230
+ console.log(` ${colors.dim}What's new: /morning-brief · /inbox-check · /feedback${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}`);
@@ -1205,6 +1240,7 @@ async function main() {
1205
1240
  console.log(` ${colors.dim}She'll introduce herself and learn how you work.${colors.reset}`);
1206
1241
  console.log(` ${colors.dim}Try: ${colors.reset}${colors.cyan}"Say hi"${colors.reset} ${colors.dim}·${colors.reset} ${colors.cyan}/morning-brief${colors.reset} ${colors.dim}·${colors.reset} ${colors.cyan}"Who do I know?"${colors.reset}`);
1207
1242
  }
1243
+ console.log(` ${colors.dim}Feedback? Tell Claudia, or visit github.com/kbanc85/claudia/discussions${colors.reset}`);
1208
1244
  console.log('');
1209
1245
  return;
1210
1246
  }
@@ -1314,7 +1350,7 @@ function restoreMcpServers(targetPath) {
1314
1350
 
1315
1351
  if (changed) {
1316
1352
  writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n');
1317
- console.log(` ${colors.green}✓${colors.reset} Restored MCP servers: ${restored.join(', ')}`);
1353
+ console.log(` ${colors.cyan}✓${colors.reset} Restored MCP servers: ${restored.join(', ')}`);
1318
1354
  }
1319
1355
  } catch {
1320
1356
  // Not valid JSON or can't read -- skip silently
@@ -1711,7 +1747,7 @@ async function runGoogleSetup() {
1711
1747
  // Pick tier
1712
1748
  console.log('');
1713
1749
  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}`);
1750
+ console.log(` ${colors.cyan}core${colors.reset} 43 tools Gmail, Calendar, Drive, Contacts ${colors.dim}(recommended)${colors.reset}`);
1715
1751
  console.log(` ${colors.yellow}extended${colors.reset} 83 tools + Docs, Sheets, Tasks, Chat`);
1716
1752
  console.log(` ${colors.magenta}complete${colors.reset} 111 tools + Slides, Forms, Apps Script`);
1717
1753
  console.log('');
@@ -1723,10 +1759,10 @@ async function runGoogleSetup() {
1723
1759
  setupGoogleWorkspace(targetPath, clientId, clientSecret, tier);
1724
1760
 
1725
1761
  console.log('');
1726
- console.log(` ${colors.green}✓${colors.reset} Google Workspace MCP configured (${colors.bold}${tier}${colors.reset} tier)`);
1762
+ console.log(` ${colors.cyan}✓${colors.reset} Google Workspace MCP configured (${colors.bold}${tier}${colors.reset} tier)`);
1727
1763
 
1728
1764
  if (state.hasOldGmail || state.hasOldCalendar) {
1729
- console.log(` ${colors.green}✓${colors.reset} Old Gmail/Calendar entries removed`);
1765
+ console.log(` ${colors.cyan}✓${colors.reset} Old Gmail/Calendar entries removed`);
1730
1766
  }
1731
1767
 
1732
1768
  // 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.12",
4
4
  "description": "An AI assistant who learns how you work.",
5
5
  "keywords": [
6
6
  "claudia",
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: feedback
3
+ description: Send feedback, ideas, or bug reports about Claudia. Opens a pre-filled GitHub Discussion with system context. Use when user says "feedback", "suggestion", "report a bug", "feature request", or "I have an idea".
4
+ effort-level: low
5
+ ---
6
+
7
+ # Claudia Feedback
8
+
9
+ Help users share feedback, ideas, bug reports, or feature requests about Claudia. Opens a GitHub Discussion with auto-populated system info so the user just writes their message.
10
+
11
+ ## Trigger Phrases
12
+
13
+ - "feedback", "give feedback", "send feedback"
14
+ - "I have a suggestion", "feature request", "idea for Claudia"
15
+ - "report a bug", "something's broken", "I found a bug"
16
+ - "how do I report an issue"
17
+
18
+ ## Process
19
+
20
+ ### Step 1: Ask What's On Their Mind
21
+
22
+ Ask the user what kind of feedback they want to share. Keep it casual:
23
+
24
+ - "What's on your mind? Bug, idea, or just general feedback?"
25
+
26
+ If they've already described it, skip this step.
27
+
28
+ ### Step 2: Gather System Context
29
+
30
+ Collect system info silently (don't show raw data to user). Run these:
31
+
32
+ ```bash
33
+ # Version
34
+ cat package.json 2>/dev/null | grep '"version"' | head -1
35
+
36
+ # OS and Node
37
+ echo "$(uname -s) $(uname -m), Node $(node -v 2>/dev/null)"
38
+
39
+ # Memory daemon health
40
+ ~/.claudia/daemon/venv/bin/python3 -m claudia_memory --preflight 2>&1 | grep "Result:" || echo "Daemon: not checked"
41
+
42
+ # Memory count
43
+ sqlite3 ~/.claudia/memory/claudia.db "SELECT COUNT(*) FROM memories WHERE invalidated_at IS NULL;" 2>/dev/null || echo "0"
44
+ ```
45
+
46
+ ### Step 3: Categorize
47
+
48
+ Map their feedback to a GitHub Discussions category:
49
+
50
+ | Feedback Type | Category |
51
+ |--------------|----------|
52
+ | Bug report | Ideas (no Bugs category by default) |
53
+ | Feature request / idea | Ideas |
54
+ | General feedback | General |
55
+ | Question | Q&A |
56
+
57
+ ### Step 4: Build the Discussion URL
58
+
59
+ Construct a pre-filled GitHub Discussion URL. The URL format:
60
+
61
+ ```
62
+ https://github.com/kbanc85/claudia/discussions/new?category={CATEGORY}&title={TITLE}&body={BODY}
63
+ ```
64
+
65
+ The body should include:
66
+ 1. The user's feedback (their words, not paraphrased)
67
+ 2. A "System Info" section at the bottom with the collected context
68
+
69
+ **Body template:**
70
+
71
+ ```
72
+ {user's feedback text}
73
+
74
+ ---
75
+
76
+ **System Info** (auto-generated by Claudia)
77
+ - Version: {version}
78
+ - OS: {os}
79
+ - Node: {node_version}
80
+ - Memories: {count}
81
+ - Daemon: {healthy/not running}
82
+ ```
83
+
84
+ URL-encode the title and body for the query string.
85
+
86
+ ### Step 5: Open in Browser
87
+
88
+ Use the Bash tool to open the URL:
89
+
90
+ ```bash
91
+ # macOS
92
+ open "{url}"
93
+
94
+ # Linux
95
+ xdg-open "{url}" 2>/dev/null || echo "Open this URL: {url}"
96
+
97
+ # Windows
98
+ start "{url}"
99
+ ```
100
+
101
+ ### Step 6: Confirm
102
+
103
+ Tell the user:
104
+ - "Opened a new discussion in your browser. Add any details and hit Submit."
105
+ - If the browser didn't open, show the URL directly so they can copy it.
106
+
107
+ ## Important
108
+
109
+ - **Never post feedback without the user's knowledge.** This opens a browser for them to review and submit.
110
+ - **Don't paraphrase their feedback.** Use their exact words in the body.
111
+ - **Keep system info minimal.** Version, OS, memory count. No sensitive data, no file paths, no personal info.
112
+ - **The user submits, not Claudia.** The browser opens a pre-filled form. The user reviews and clicks Submit.
113
+
114
+ ## GitHub Discussions URL
115
+
116
+ Repository: `kbanc85/claudia`
117
+
118
+ Direct link to create a discussion: `https://github.com/kbanc85/claudia/discussions/new`
@@ -2,6 +2,21 @@
2
2
  "$schema": "Claudia Skill Index v2",
3
3
  "description": "Progressive loading index - lightweight metadata for all skills with trigger examples for contextual matching",
4
4
  "skills": [
5
+ {
6
+ "name": "feedback",
7
+ "path": "feedback/SKILL.md",
8
+ "description": "Send feedback, ideas, or bug reports about Claudia via GitHub Discussions",
9
+ "invocation": "explicit",
10
+ "effort_level": "low",
11
+ "triggers": ["feedback", "suggestion", "bug report", "feature request", "idea", "report issue"],
12
+ "examples": [
13
+ "I have feedback",
14
+ "I want to suggest a feature",
15
+ "I found a bug",
16
+ "how do I report an issue",
17
+ "I have an idea for Claudia"
18
+ ]
19
+ },
5
20
  {
6
21
  "name": "onboarding",
7
22
  "path": "onboarding.md",