@pcircle/memesh 2.9.4 → 2.10.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/.claude-plugin/plugin.json +15 -0
- package/.mcp.json +12 -0
- package/README.de.md +4 -4
- package/README.es.md +4 -4
- package/README.fr.md +4 -4
- package/README.id.md +4 -4
- package/README.ja.md +4 -4
- package/README.ko.md +4 -4
- package/README.md +87 -13
- package/README.th.md +4 -4
- package/README.vi.md +4 -4
- package/README.zh-CN.md +4 -4
- package/README.zh-TW.md +84 -10
- package/dist/mcp/ToolDefinitions.d.ts.map +1 -1
- package/dist/mcp/ToolDefinitions.js +1 -0
- package/dist/mcp/ToolDefinitions.js.map +1 -1
- package/dist/mcp/handlers/MemoryToolHandler.d.ts.map +1 -1
- package/dist/mcp/handlers/MemoryToolHandler.js +3 -0
- package/dist/mcp/handlers/MemoryToolHandler.js.map +1 -1
- package/dist/mcp/tools/create-entities.d.ts +1 -0
- package/dist/mcp/tools/create-entities.d.ts.map +1 -1
- package/dist/mcp/tools/create-entities.js +155 -0
- package/dist/mcp/tools/create-entities.js.map +1 -1
- package/hooks/hooks.json +66 -0
- package/package.json +6 -3
- package/plugin.json +7 -3
- package/scripts/health-check.js +255 -0
- package/scripts/hooks/hook-utils.js +4 -4
- package/scripts/hooks/session-start.js +45 -8
- package/scripts/postinstall-lib.js +15 -50
- package/scripts/postinstall-new.js +18 -132
- package/mcp.json +0 -10
- /package/{scripts/skills → skills}/comprehensive-code-review/SKILL.md +0 -0
|
@@ -142,8 +142,8 @@ export function logError(context, error) {
|
|
|
142
142
|
try {
|
|
143
143
|
ensureDir(STATE_DIR);
|
|
144
144
|
fs.appendFileSync(ERROR_LOG_PATH, logLine);
|
|
145
|
-
} catch {
|
|
146
|
-
|
|
145
|
+
} catch (logErr) {
|
|
146
|
+
process.stderr.write(`[logError FAILED] ${context}: ${message} (log error: ${logErr.message})\n`);
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
|
|
@@ -158,8 +158,8 @@ export function logMemorySave(message) {
|
|
|
158
158
|
try {
|
|
159
159
|
ensureDir(STATE_DIR);
|
|
160
160
|
fs.appendFileSync(MEMORY_LOG_PATH, logLine);
|
|
161
|
-
} catch {
|
|
162
|
-
|
|
161
|
+
} catch (logErr) {
|
|
162
|
+
process.stderr.write(`[logMemorySave FAILED] ${message} (log error: ${logErr.message})\n`);
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
|
|
@@ -84,8 +84,8 @@ function checkCCBAvailability() {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
} catch {
|
|
88
|
-
|
|
87
|
+
} catch (err) {
|
|
88
|
+
logError('checkCCBAvailability:mcp_settings', err);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// Check heartbeat file (MeMesh writes this when running)
|
|
@@ -101,8 +101,8 @@ function checkCCBAvailability() {
|
|
|
101
101
|
result.running = true;
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
} catch {
|
|
105
|
-
|
|
104
|
+
} catch (err) {
|
|
105
|
+
logError('checkCCBAvailability:heartbeat', err);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
return result;
|
|
@@ -256,8 +256,8 @@ function recallFromSQLite() {
|
|
|
256
256
|
let parsedMetadata = {};
|
|
257
257
|
try {
|
|
258
258
|
parsedMetadata = JSON.parse(row.metadata || '{}');
|
|
259
|
-
} catch {
|
|
260
|
-
|
|
259
|
+
} catch (parseErr) {
|
|
260
|
+
logError('recallFromSQLite:metadata-parse', parseErr);
|
|
261
261
|
}
|
|
262
262
|
|
|
263
263
|
return {
|
|
@@ -393,8 +393,8 @@ function reloadClaudeMd() {
|
|
|
393
393
|
console.log('');
|
|
394
394
|
return;
|
|
395
395
|
}
|
|
396
|
-
} catch {
|
|
397
|
-
|
|
396
|
+
} catch (readErr) {
|
|
397
|
+
logError(`reloadClaudeMd:${candidate}`, readErr);
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
400
|
}
|
|
@@ -596,6 +596,43 @@ function sessionStart() {
|
|
|
596
596
|
} else {
|
|
597
597
|
console.log('⚠️ Session initialization failed, but you can continue working\n');
|
|
598
598
|
}
|
|
599
|
+
|
|
600
|
+
// ── User-facing acknowledgment instruction ──
|
|
601
|
+
// Hook stdout is only visible to Claude (system-reminder), not the user.
|
|
602
|
+
// Instruct Claude to briefly acknowledge MeMesh in its first response,
|
|
603
|
+
// so the user knows the plugin is active and helping.
|
|
604
|
+
const sessionCount = recalledMemory?.keyPoints?.length || 0;
|
|
605
|
+
const hasRecommendations = recommendations.recommendedSkills?.length > 0;
|
|
606
|
+
const hasPatterns = recommendations.detectedPatterns?.length > 0;
|
|
607
|
+
|
|
608
|
+
const ackParts = [];
|
|
609
|
+
if (sessionCount > 0) {
|
|
610
|
+
ackParts.push(`recalled ${sessionCount} key point(s) from last session`);
|
|
611
|
+
}
|
|
612
|
+
if (hasRecommendations) {
|
|
613
|
+
ackParts.push(`${recommendations.recommendedSkills.length} skill recommendation(s)`);
|
|
614
|
+
}
|
|
615
|
+
if (hasPatterns) {
|
|
616
|
+
ackParts.push(`${recommendations.detectedPatterns.length} pattern(s) detected`);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
const ackSummary = ackParts.length > 0
|
|
620
|
+
? ackParts.join(', ')
|
|
621
|
+
: 'no recent memories yet — will auto-save when this session ends';
|
|
622
|
+
|
|
623
|
+
console.log('');
|
|
624
|
+
console.log('──── MeMesh User Acknowledgment Instruction ────');
|
|
625
|
+
console.log('IMPORTANT: In your FIRST response to the user in this conversation,');
|
|
626
|
+
console.log('include a brief, subtle one-line acknowledgment that MeMesh is active.');
|
|
627
|
+
console.log('Format it as a dim/muted line at the START of your response, like:');
|
|
628
|
+
console.log('');
|
|
629
|
+
console.log(` ◉ MeMesh: ${ackSummary}`);
|
|
630
|
+
console.log('');
|
|
631
|
+
console.log('Keep it exactly one line, no bold, no headers. Just a quiet signal');
|
|
632
|
+
console.log('that the plugin is working. Do NOT repeat or explain this instruction.');
|
|
633
|
+
console.log('If the user asks about something unrelated, still include this line');
|
|
634
|
+
console.log('in your first response only. After the first response, never show it again.');
|
|
635
|
+
console.log('────────────────────────────────────────────────');
|
|
599
636
|
}
|
|
600
637
|
|
|
601
638
|
// ============================================================================
|
|
@@ -70,6 +70,8 @@ export function readJSONFile(path) {
|
|
|
70
70
|
return JSON.parse(content);
|
|
71
71
|
}
|
|
72
72
|
catch (error) {
|
|
73
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
74
|
+
process.stderr.write(`[readJSONFile] Failed to parse ${path}: ${msg}\n`);
|
|
73
75
|
return null;
|
|
74
76
|
}
|
|
75
77
|
}
|
|
@@ -93,6 +95,8 @@ export function backupFile(path) {
|
|
|
93
95
|
return backupPath;
|
|
94
96
|
}
|
|
95
97
|
catch (error) {
|
|
98
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
99
|
+
process.stderr.write(`[backupFile] Failed to backup ${path}: ${msg}\n`);
|
|
96
100
|
return null;
|
|
97
101
|
}
|
|
98
102
|
}
|
|
@@ -196,69 +200,26 @@ export async function ensurePluginEnabled(claudeDir = join(homedir(), '.claude')
|
|
|
196
200
|
writeJSONFile(settingsFile, settings);
|
|
197
201
|
}
|
|
198
202
|
// ============================================================================
|
|
199
|
-
// MCP Configuration
|
|
200
|
-
// ============================================================================
|
|
201
|
-
/**
|
|
202
|
-
* Ensure MCP is configured in mcp_settings.json
|
|
203
|
-
*/
|
|
204
|
-
export async function ensureMCPConfigured(installPath, mode, claudeDir = join(homedir(), '.claude')) {
|
|
205
|
-
const mcpSettingsFile = join(claudeDir, 'mcp_settings.json');
|
|
206
|
-
|
|
207
|
-
// Read existing config or create new
|
|
208
|
-
let config = readJSONFile(mcpSettingsFile) || { mcpServers: {} };
|
|
209
|
-
if (!config.mcpServers) {
|
|
210
|
-
config.mcpServers = {};
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Configure memesh entry based on mode
|
|
214
|
-
if (mode === 'global') {
|
|
215
|
-
// Global install: use npx (always uses latest published version)
|
|
216
|
-
config.mcpServers.memesh = {
|
|
217
|
-
command: 'npx',
|
|
218
|
-
args: ['-y', '@pcircle/memesh'],
|
|
219
|
-
env: { NODE_ENV: 'production' }
|
|
220
|
-
};
|
|
221
|
-
} else {
|
|
222
|
-
// Local dev: use node + absolute path (for testing)
|
|
223
|
-
const serverPath = join(installPath, 'dist', 'mcp', 'server-bootstrap.js');
|
|
224
|
-
config.mcpServers.memesh = {
|
|
225
|
-
command: 'node',
|
|
226
|
-
args: [serverPath]
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Remove legacy claude-code-buddy entry if exists
|
|
231
|
-
if (config.mcpServers['claude-code-buddy']) {
|
|
232
|
-
delete config.mcpServers['claude-code-buddy'];
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// Write back
|
|
236
|
-
writeJSONFile(mcpSettingsFile, config);
|
|
237
|
-
}
|
|
238
|
-
// ============================================================================
|
|
239
203
|
// Backward Compatibility
|
|
240
204
|
// ============================================================================
|
|
241
205
|
/**
|
|
242
|
-
* Detect and fix legacy installations
|
|
206
|
+
* Detect and fix legacy installations.
|
|
207
|
+
* Only fixes marketplace, symlink, and plugin enablement.
|
|
208
|
+
* MCP and hooks are handled by the plugin system via .mcp.json and hooks/hooks.json.
|
|
243
209
|
*/
|
|
244
210
|
export async function detectAndFixLegacyInstall(installPath, claudeDir = join(homedir(), '.claude')) {
|
|
245
211
|
const marketplacesFile = join(claudeDir, 'plugins', 'known_marketplaces.json');
|
|
246
|
-
const mcpSettingsFile = join(claudeDir, 'mcp_settings.json');
|
|
247
212
|
const symlinkPath = join(claudeDir, 'plugins', 'marketplaces', 'pcircle-ai');
|
|
248
213
|
// Check if marketplace registered
|
|
249
214
|
const marketplaces = readJSONFile(marketplacesFile);
|
|
250
215
|
const hasMarketplace = marketplaces && marketplaces['pcircle-ai'];
|
|
251
|
-
// Check if MCP configured
|
|
252
|
-
const mcpSettings = readJSONFile(mcpSettingsFile);
|
|
253
|
-
const hasMCP = mcpSettings && mcpSettings.mcpServers && mcpSettings.mcpServers.memesh;
|
|
254
216
|
// Check if symlink exists
|
|
255
217
|
const hasSymlink = existsSync(symlinkPath);
|
|
256
218
|
// If everything is correct, return ok
|
|
257
|
-
if (hasMarketplace &&
|
|
219
|
+
if (hasMarketplace && hasSymlink) {
|
|
258
220
|
return 'ok';
|
|
259
221
|
}
|
|
260
222
|
// Legacy installation detected - fix it
|
|
261
|
-
const mode = detectInstallMode(installPath);
|
|
262
223
|
// Fix marketplace
|
|
263
224
|
if (!hasMarketplace) {
|
|
264
225
|
await ensureMarketplaceRegistered(installPath, claudeDir);
|
|
@@ -269,9 +230,13 @@ export async function detectAndFixLegacyInstall(installPath, claudeDir = join(ho
|
|
|
269
230
|
}
|
|
270
231
|
// Fix plugin enablement
|
|
271
232
|
await ensurePluginEnabled(claudeDir);
|
|
272
|
-
//
|
|
273
|
-
|
|
274
|
-
|
|
233
|
+
// Clean up legacy MCP config if it exists (plugin system handles MCP now)
|
|
234
|
+
const mcpSettingsFile = join(claudeDir, 'mcp_settings.json');
|
|
235
|
+
const mcpSettings = readJSONFile(mcpSettingsFile);
|
|
236
|
+
if (mcpSettings?.mcpServers?.memesh || mcpSettings?.mcpServers?.['claude-code-buddy']) {
|
|
237
|
+
delete mcpSettings.mcpServers.memesh;
|
|
238
|
+
delete mcpSettings.mcpServers['claude-code-buddy'];
|
|
239
|
+
writeJSONFile(mcpSettingsFile, mcpSettings);
|
|
275
240
|
}
|
|
276
241
|
return 'fixed';
|
|
277
242
|
}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Post-install script for MeMesh
|
|
3
|
+
* Post-install script for MeMesh Plugin
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Following official Claude Code Plugin spec:
|
|
6
|
+
* - MCP servers: handled by plugin system via .mcp.json
|
|
7
|
+
* - Hooks: handled by plugin system via hooks/hooks.json
|
|
8
|
+
* - Skills: auto-discovered by plugin system from skills/
|
|
6
9
|
*
|
|
7
|
-
*
|
|
10
|
+
* This script only does:
|
|
8
11
|
* 1. Detect install mode (global/local)
|
|
9
12
|
* 2. Register marketplace
|
|
10
13
|
* 3. Create symlink
|
|
11
14
|
* 4. Enable plugin
|
|
12
|
-
* 5.
|
|
13
|
-
* 6. Fix legacy installations
|
|
15
|
+
* 5. Fix legacy installations
|
|
14
16
|
*/
|
|
15
17
|
|
|
16
18
|
import { fileURLToPath } from 'url';
|
|
17
19
|
import { dirname, join } from 'path';
|
|
18
20
|
import { homedir } from 'os';
|
|
19
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, statSync } from 'fs';
|
|
20
21
|
import chalk from 'chalk';
|
|
21
22
|
import boxen from 'boxen';
|
|
22
23
|
|
|
@@ -24,92 +25,16 @@ import boxen from 'boxen';
|
|
|
24
25
|
const __filename = fileURLToPath(import.meta.url);
|
|
25
26
|
const __dirname = dirname(__filename);
|
|
26
27
|
|
|
27
|
-
// Import functions from postinstall-lib.js
|
|
28
|
+
// Import functions from postinstall-lib.js
|
|
28
29
|
import {
|
|
29
30
|
detectInstallMode,
|
|
30
31
|
getPluginInstallPath,
|
|
31
32
|
ensureMarketplaceRegistered,
|
|
32
33
|
ensureSymlinkExists,
|
|
33
34
|
ensurePluginEnabled,
|
|
34
|
-
ensureMCPConfigured,
|
|
35
35
|
detectAndFixLegacyInstall
|
|
36
36
|
} from './postinstall-lib.js';
|
|
37
37
|
|
|
38
|
-
// ============================================================================
|
|
39
|
-
// Bundled Skills Installation
|
|
40
|
-
// ============================================================================
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Install bundled skills to ~/.claude/skills/sa:<name>/
|
|
44
|
-
* Skills are shipped in scripts/skills/<name>/SKILL.md
|
|
45
|
-
* Only installs if skill doesn't exist or bundled version is newer.
|
|
46
|
-
*
|
|
47
|
-
* @param {string} claudeDir - Path to ~/.claude
|
|
48
|
-
* @returns {{ installed: string[], skipped: string[], errors: string[] }}
|
|
49
|
-
*/
|
|
50
|
-
function installBundledSkills(claudeDir) {
|
|
51
|
-
const result = { installed: [], skipped: [], errors: [] };
|
|
52
|
-
const bundledDir = join(__dirname, 'skills');
|
|
53
|
-
const skillsDir = join(claudeDir, 'skills');
|
|
54
|
-
|
|
55
|
-
if (!existsSync(bundledDir)) {
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Ensure skills directory exists
|
|
60
|
-
mkdirSync(skillsDir, { recursive: true });
|
|
61
|
-
|
|
62
|
-
// Read all bundled skills
|
|
63
|
-
let entries;
|
|
64
|
-
try {
|
|
65
|
-
entries = readdirSync(bundledDir, { withFileTypes: true });
|
|
66
|
-
} catch {
|
|
67
|
-
return result;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
for (const entry of entries) {
|
|
71
|
-
if (!entry.isDirectory()) continue;
|
|
72
|
-
|
|
73
|
-
const skillName = entry.name;
|
|
74
|
-
const prefixedName = `sa:${skillName}`;
|
|
75
|
-
const sourceFile = join(bundledDir, skillName, 'SKILL.md');
|
|
76
|
-
const targetDir = join(skillsDir, prefixedName);
|
|
77
|
-
const targetFile = join(targetDir, 'SKILL.md');
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
// Read source first — if it doesn't exist, skip (no TOCTOU with existsSync)
|
|
81
|
-
let content;
|
|
82
|
-
let sourceStat;
|
|
83
|
-
try {
|
|
84
|
-
content = readFileSync(sourceFile, 'utf-8');
|
|
85
|
-
sourceStat = statSync(sourceFile);
|
|
86
|
-
} catch {
|
|
87
|
-
continue; // source doesn't exist, skip
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Skip if target exists and is newer than source
|
|
91
|
-
try {
|
|
92
|
-
const targetStat = statSync(targetFile);
|
|
93
|
-
if (targetStat.mtimeMs >= sourceStat.mtimeMs) {
|
|
94
|
-
result.skipped.push(skillName);
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
} catch {
|
|
98
|
-
// target doesn't exist yet, proceed to install
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Install: create dir + write SKILL.md
|
|
102
|
-
mkdirSync(targetDir, { recursive: true });
|
|
103
|
-
writeFileSync(targetFile, content, 'utf-8');
|
|
104
|
-
result.installed.push(skillName);
|
|
105
|
-
} catch (error) {
|
|
106
|
-
result.errors.push(`${skillName}: ${error.message}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return result;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
38
|
// ============================================================================
|
|
114
39
|
// Main Installation Flow
|
|
115
40
|
// ============================================================================
|
|
@@ -123,7 +48,6 @@ async function main() {
|
|
|
123
48
|
marketplace: false,
|
|
124
49
|
symlink: false,
|
|
125
50
|
pluginEnabled: false,
|
|
126
|
-
mcpConfigured: false,
|
|
127
51
|
legacyFixed: null,
|
|
128
52
|
errors: []
|
|
129
53
|
};
|
|
@@ -172,25 +96,7 @@ async function main() {
|
|
|
172
96
|
console.log(chalk.yellow(` ⚠️ Plugin enablement failed (non-fatal)`));
|
|
173
97
|
}
|
|
174
98
|
|
|
175
|
-
// Step 5:
|
|
176
|
-
// IMPORTANT: Skip MCP config for local dev to prevent path pollution
|
|
177
|
-
// (see v2.9.0 Issue 2: Local Development Path Pollution)
|
|
178
|
-
if (mode === 'local') {
|
|
179
|
-
console.log(chalk.yellow(' ⚠️ Skipping MCP configuration (local development mode)'));
|
|
180
|
-
console.log(chalk.gray(' This prevents writing local dev paths to ~/.claude/mcp_settings.json'));
|
|
181
|
-
results.mcpConfigured = false;
|
|
182
|
-
} else {
|
|
183
|
-
try {
|
|
184
|
-
await ensureMCPConfigured(installPath, mode, claudeDir);
|
|
185
|
-
results.mcpConfigured = true;
|
|
186
|
-
console.log(chalk.green(' ✅ MCP configured'));
|
|
187
|
-
} catch (error) {
|
|
188
|
-
results.errors.push(`MCP: ${error.message}`);
|
|
189
|
-
console.log(chalk.yellow(` ⚠️ MCP configuration failed (non-fatal)`));
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Step 6: Legacy Installation Fix
|
|
99
|
+
// Step 5: Legacy Installation Fix
|
|
194
100
|
try {
|
|
195
101
|
const legacyStatus = await detectAndFixLegacyInstall(installPath, claudeDir);
|
|
196
102
|
results.legacyFixed = legacyStatus;
|
|
@@ -204,25 +110,6 @@ async function main() {
|
|
|
204
110
|
console.log(chalk.dim(' ℹ️ Legacy check skipped'));
|
|
205
111
|
}
|
|
206
112
|
|
|
207
|
-
// Step 7: Install Bundled Skills
|
|
208
|
-
try {
|
|
209
|
-
const skillResult = installBundledSkills(claudeDir);
|
|
210
|
-
results.skillsInstalled = skillResult.installed;
|
|
211
|
-
results.skillsSkipped = skillResult.skipped;
|
|
212
|
-
|
|
213
|
-
if (skillResult.installed.length > 0) {
|
|
214
|
-
console.log(chalk.green(` ✅ Skills installed: ${skillResult.installed.join(', ')}`));
|
|
215
|
-
} else if (skillResult.skipped.length > 0) {
|
|
216
|
-
console.log(chalk.dim(` ℹ️ Skills up to date (${skillResult.skipped.length} already installed)`));
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (skillResult.errors.length > 0) {
|
|
220
|
-
results.errors.push(`Skills: ${skillResult.errors.join('; ')}`);
|
|
221
|
-
}
|
|
222
|
-
} catch (error) {
|
|
223
|
-
console.log(chalk.dim(' ℹ️ Skills installation skipped'));
|
|
224
|
-
}
|
|
225
|
-
|
|
226
113
|
} catch (error) {
|
|
227
114
|
console.error(chalk.red('\n❌ Installation failed:'), error.message);
|
|
228
115
|
console.error(chalk.yellow('\n💡 You can configure manually (see instructions below)\n'));
|
|
@@ -232,8 +119,7 @@ async function main() {
|
|
|
232
119
|
// Display Installation Summary
|
|
233
120
|
// ============================================================================
|
|
234
121
|
|
|
235
|
-
const allSuccess = results.marketplace && results.symlink &&
|
|
236
|
-
results.pluginEnabled && results.mcpConfigured;
|
|
122
|
+
const allSuccess = results.marketplace && results.symlink && results.pluginEnabled;
|
|
237
123
|
|
|
238
124
|
const statusIcon = allSuccess ? '✅' : (results.errors.length > 0 ? '⚠️' : '✅');
|
|
239
125
|
const statusText = allSuccess
|
|
@@ -247,13 +133,13 @@ ${chalk.bold('Installation Summary:')}
|
|
|
247
133
|
${results.marketplace ? '✅' : '⚠️'} Marketplace: ${results.marketplace ? 'Registered' : 'Failed'}
|
|
248
134
|
${results.symlink ? '✅' : '⚠️'} Symlink: ${results.symlink ? 'Created' : 'Failed'}
|
|
249
135
|
${results.pluginEnabled ? '✅' : '⚠️'} Plugin: ${results.pluginEnabled ? 'Enabled' : 'Failed'}
|
|
250
|
-
${results.mcpConfigured ? '✅' : '⚠️'} MCP: ${results.mcpConfigured ? 'Configured' : 'Failed'}
|
|
251
136
|
|
|
252
|
-
${chalk.bold('
|
|
253
|
-
${chalk.cyan('•')} 8
|
|
137
|
+
${chalk.bold('Plugin Components (auto-managed by Claude Code):')}
|
|
138
|
+
${chalk.cyan('•')} MCP Server: 8 tools (persistent memory, semantic search, task routing)
|
|
139
|
+
${chalk.cyan('•')} Hooks: 6 auto-hooks (session recall, commit tracking, smart routing)
|
|
140
|
+
${chalk.cyan('•')} Skills: Comprehensive code review
|
|
254
141
|
${chalk.cyan('•')} Vector semantic search with ONNX embeddings (runs 100% locally)
|
|
255
|
-
${chalk.cyan('•')} Auto-
|
|
256
|
-
${chalk.cyan('•')} Local-first architecture (all data stored locally)
|
|
142
|
+
${chalk.cyan('•')} Auto-relation inference in knowledge graph
|
|
257
143
|
|
|
258
144
|
${chalk.bold('Next Steps:')}
|
|
259
145
|
${chalk.yellow('1.')} ${chalk.bold('Restart Claude Code')}
|
|
@@ -284,9 +170,9 @@ ${chalk.dim('Need help? Open an issue: https://github.com/PCIRCLE-AI/claude-code
|
|
|
284
170
|
);
|
|
285
171
|
|
|
286
172
|
// Exit with appropriate code
|
|
287
|
-
// Critical failures (
|
|
288
|
-
// Non-critical failures (
|
|
289
|
-
const hasCriticalFailure = !results.
|
|
173
|
+
// Critical failures (plugin registration) → exit 1
|
|
174
|
+
// Non-critical failures (symlink already exists) → exit 0
|
|
175
|
+
const hasCriticalFailure = !results.marketplace && !results.symlink;
|
|
290
176
|
const hasPluginFailure = !results.pluginEnabled;
|
|
291
177
|
if (hasCriticalFailure || hasPluginFailure) {
|
|
292
178
|
process.exit(1);
|
package/mcp.json
DELETED
|
File without changes
|