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.
|
|
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
|
-
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
@@ -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",
|