@local-labs-jpollock/local-addon-nexus-ai 0.2.0 → 0.2.1
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/README.md +13 -3
- package/lib/cli/commands/doctor.d.ts +14 -0
- package/lib/cli/commands/doctor.d.ts.map +1 -0
- package/lib/cli/commands/doctor.js +496 -0
- package/lib/cli/commands/doctor.js.map +1 -0
- package/lib/cli/index.js +4 -1
- package/lib/cli/index.js.map +1 -1
- package/lib/common/schemas.d.ts +2 -5
- package/lib/common/schemas.d.ts.map +1 -1
- package/lib/common/schemas.js +0 -1
- package/lib/common/schemas.js.map +1 -1
- package/lib/main/ai-gateway/AIGatewayRoutes.d.ts +2 -1
- package/lib/main/ai-gateway/AIGatewayRoutes.d.ts.map +1 -1
- package/lib/main/ai-gateway/AIGatewayRoutes.js +134 -63
- package/lib/main/ai-gateway/AIGatewayRoutes.js.map +1 -1
- package/lib/main/ai-gateway/mu-plugin-template.d.ts +2 -0
- package/lib/main/ai-gateway/mu-plugin-template.d.ts.map +1 -1
- package/lib/main/ai-gateway/mu-plugin-template.js +31 -33
- package/lib/main/ai-gateway/mu-plugin-template.js.map +1 -1
- package/lib/main/ai-gateway/openai-client.d.ts +32 -0
- package/lib/main/ai-gateway/openai-client.d.ts.map +1 -0
- package/lib/main/ai-gateway/openai-client.js +135 -0
- package/lib/main/ai-gateway/openai-client.js.map +1 -0
- package/lib/main/ai-proxy/AiProxyServer.d.ts.map +1 -1
- package/lib/main/ai-proxy/AiProxyServer.js +13 -1
- package/lib/main/ai-proxy/AiProxyServer.js.map +1 -1
- package/lib/main/ai-proxy/types.d.ts +11 -1
- package/lib/main/ai-proxy/types.d.ts.map +1 -1
- package/lib/main/content/lifecycle-hooks.d.ts.map +1 -1
- package/lib/main/content/lifecycle-hooks.js +54 -9
- package/lib/main/content/lifecycle-hooks.js.map +1 -1
- package/lib/main/credentials/CredentialSyncBroadcaster.d.ts.map +1 -1
- package/lib/main/credentials/CredentialSyncBroadcaster.js +5 -2
- package/lib/main/credentials/CredentialSyncBroadcaster.js.map +1 -1
- package/lib/main/events/HttpEventInterface.d.ts.map +1 -1
- package/lib/main/events/HttpEventInterface.js +8 -7
- package/lib/main/events/HttpEventInterface.js.map +1 -1
- package/lib/main/index.d.ts.map +1 -1
- package/lib/main/index.js +7 -2
- package/lib/main/index.js.map +1 -1
- package/lib/main/ipc-handlers.d.ts.map +1 -1
- package/lib/main/ipc-handlers.js +50 -3
- package/lib/main/ipc-handlers.js.map +1 -1
- package/lib/main/mcp/McpServer.js +1 -1
- package/lib/main/mcp/modules/wp-connector/auto-sync.d.ts.map +1 -1
- package/lib/main/mcp/modules/wp-connector/auto-sync.js +5 -1
- package/lib/main/mcp/modules/wp-connector/auto-sync.js.map +1 -1
- package/lib/main/mcp/modules/wp-connector/setup-ai.d.ts.map +1 -1
- package/lib/main/mcp/modules/wp-connector/setup-ai.js +3 -2
- package/lib/main/mcp/modules/wp-connector/setup-ai.js.map +1 -1
- package/lib/renderer/components/AIGatewayByCallerPanel.d.ts.map +1 -1
- package/lib/renderer/components/AIGatewayByCallerPanel.js +24 -7
- package/lib/renderer/components/AIGatewayByCallerPanel.js.map +1 -1
- package/lib/renderer/components/AIGatewayPanel.d.ts +96 -0
- package/lib/renderer/components/AIGatewayPanel.d.ts.map +1 -0
- package/lib/renderer/components/AIGatewayPanel.js +389 -0
- package/lib/renderer/components/AIGatewayPanel.js.map +1 -0
- package/lib/renderer/components/AIGatewayUsagePanel.d.ts.map +1 -1
- package/lib/renderer/components/AIGatewayUsagePanel.js +30 -10
- package/lib/renderer/components/AIGatewayUsagePanel.js.map +1 -1
- package/lib/renderer/components/EventTimeline.d.ts.map +1 -1
- package/lib/renderer/components/EventTimeline.js +22 -37
- package/lib/renderer/components/EventTimeline.js.map +1 -1
- package/lib/renderer/components/NexusOverview.d.ts.map +1 -1
- package/lib/renderer/components/NexusOverview.js +18 -19
- package/lib/renderer/components/NexusOverview.js.map +1 -1
- package/lib/renderer/components/NexusSiteTab.d.ts +1 -0
- package/lib/renderer/components/NexusSiteTab.d.ts.map +1 -1
- package/lib/renderer/components/NexusSiteTab.js +7 -0
- package/lib/renderer/components/NexusSiteTab.js.map +1 -1
- package/lib/renderer/components/SiteNexusSection.d.ts +1 -0
- package/lib/renderer/components/SiteNexusSection.d.ts.map +1 -1
- package/lib/renderer/components/SiteNexusSection.js +7 -0
- package/lib/renderer/components/SiteNexusSection.js.map +1 -1
- package/lib/renderer/index.d.ts.map +1 -1
- package/lib/renderer/index.js +5 -1
- package/lib/renderer/index.js.map +1 -1
- package/lib/wp-plugins/ai/includes/Abilities/Excerpt_Generation/Excerpt_Generation.php +6 -0
- package/lib/wp-plugins/ai/includes/Abilities/Summarization/Summarization.php +6 -0
- package/lib/wp-plugins/ai/includes/Abilities/Title_Generation/Title_Generation.php +10 -0
- package/lib/wp-plugins/ai-provider-for-local-gateway/plugin.php +35 -34
- package/lib/wp-plugins/ai-provider-for-local-gateway/src/Availability/LocalGatewayProviderAvailability.php +24 -28
- package/lib/wp-plugins/ai-provider-for-local-gateway/src/Metadata/LocalGatewayModelMetadataDirectory.php +26 -29
- package/lib/wp-plugins/ai-provider-for-local-gateway/src/Models/LocalGatewayTextGenerationModel.php +21 -20
- package/lib/wp-plugins/ai-provider-for-local-gateway/src/Provider/LocalGatewayProvider.php +16 -25
- package/lib/wp-plugins/nexus-ai-connector/includes/class-admin-settings.php +12 -6
- package/package.json +1 -1
- package/wp-plugins/ai/includes/Abilities/Excerpt_Generation/Excerpt_Generation.php +6 -0
- package/wp-plugins/ai/includes/Abilities/Summarization/Summarization.php +6 -0
- package/wp-plugins/ai/includes/Abilities/Title_Generation/Title_Generation.php +10 -0
- package/wp-plugins/ai-provider-for-local-gateway/plugin.php +35 -34
- package/wp-plugins/ai-provider-for-local-gateway/src/Availability/LocalGatewayProviderAvailability.php +24 -28
- package/wp-plugins/ai-provider-for-local-gateway/src/Metadata/LocalGatewayModelMetadataDirectory.php +26 -29
- package/wp-plugins/ai-provider-for-local-gateway/src/Models/LocalGatewayTextGenerationModel.php +21 -20
- package/wp-plugins/ai-provider-for-local-gateway/src/Provider/LocalGatewayProvider.php +16 -25
- package/wp-plugins/nexus-ai-connector/includes/class-admin-settings.php +12 -6
- package/models/all-MiniLM-L6-v2-quantized/model.onnx +0 -0
- package/models/all-MiniLM-L6-v2-quantized/tokenizer_config.json +0 -1
- package/models/all-MiniLM-L6-v2-quantized/vocab.txt +0 -30522
package/README.md
CHANGED
|
@@ -237,11 +237,13 @@ Install the CLI, which automatically downloads and installs the addon for your p
|
|
|
237
237
|
# Install CLI globally
|
|
238
238
|
npm install -g @local-labs-jpollock/local-addon-nexus-ai
|
|
239
239
|
|
|
240
|
-
#
|
|
241
|
-
nexus
|
|
240
|
+
# Verify everything is working
|
|
241
|
+
nexus doctor
|
|
242
242
|
```
|
|
243
243
|
|
|
244
|
-
|
|
244
|
+
`nexus doctor` checks Local, the addon, MCP server, AI provider, and site configuration — and prints the exact next step for anything that needs attention.
|
|
245
|
+
|
|
246
|
+
**What the first run does:**
|
|
245
247
|
1. CLI detects the addon is missing
|
|
246
248
|
2. Prompts: "Download and install addon for macOS (Apple Silicon)? (Y/n)"
|
|
247
249
|
3. Downloads the correct platform-specific addon from GitHub Releases
|
|
@@ -249,6 +251,14 @@ nexus sites list
|
|
|
249
251
|
5. Activates the addon automatically
|
|
250
252
|
6. Prompts you to restart Local
|
|
251
253
|
|
|
254
|
+
**After restarting Local, connect your AI agent:**
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
nexus mcp setup # configure Claude Code, Cursor, Claude Desktop, etc.
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
This is the fastest path to value — no API key required.
|
|
261
|
+
|
|
252
262
|
**Supported platforms:**
|
|
253
263
|
- macOS (Apple Silicon) - `darwin-arm64`
|
|
254
264
|
- macOS (Intel) - `darwin-x64`
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nexus doctor
|
|
3
|
+
*
|
|
4
|
+
* System health check and first-run orientation.
|
|
5
|
+
* Runs independently of bootstrap — each check is isolated and never crashes
|
|
6
|
+
* the overall command. Shows actionable next steps for anything that is missing.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* nexus doctor # human-readable report
|
|
10
|
+
* nexus doctor --json # machine-readable output
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
export declare const doctorCommand: Command;
|
|
14
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkcpC,eAAO,MAAM,aAAa,SAqCtB,CAAC"}
|
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* nexus doctor
|
|
4
|
+
*
|
|
5
|
+
* System health check and first-run orientation.
|
|
6
|
+
* Runs independently of bootstrap — each check is isolated and never crashes
|
|
7
|
+
* the overall command. Shows actionable next steps for anything that is missing.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* nexus doctor # human-readable report
|
|
11
|
+
* nexus doctor --json # machine-readable output
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.doctorCommand = void 0;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const os = __importStar(require("os"));
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const commander_1 = require("commander");
|
|
52
|
+
const process_1 = require("../bootstrap/process");
|
|
53
|
+
const addon_1 = require("../bootstrap/addon");
|
|
54
|
+
const graphql_1 = require("../bootstrap/graphql");
|
|
55
|
+
const paths_1 = require("../bootstrap/paths");
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Constants
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Known AI agent config files — used to detect which agents are configured.
|
|
60
|
+
const AGENT_CONFIG_PATHS = {
|
|
61
|
+
'Claude Desktop': () => process.platform === 'win32'
|
|
62
|
+
? path.join(os.homedir(), 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json')
|
|
63
|
+
: process.platform === 'darwin'
|
|
64
|
+
? path.join(os.homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')
|
|
65
|
+
: path.join(os.homedir(), '.config', 'Claude', 'claude_desktop_config.json'),
|
|
66
|
+
'Cursor': () => path.join(os.homedir(), '.cursor', 'mcp.json'),
|
|
67
|
+
'Windsurf': () => path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json'),
|
|
68
|
+
};
|
|
69
|
+
const PROVIDER_LABELS = {
|
|
70
|
+
anthropic: 'Anthropic (Claude)',
|
|
71
|
+
openai: 'OpenAI (GPT)',
|
|
72
|
+
google: 'Google (Gemini)',
|
|
73
|
+
ollama: 'Ollama (local)',
|
|
74
|
+
'local-gateway': 'Local Gateway',
|
|
75
|
+
};
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Status icons
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
const ICON = {
|
|
80
|
+
ok: '✅',
|
|
81
|
+
warn: '⚠️ ',
|
|
82
|
+
error: '❌',
|
|
83
|
+
skip: '⚪',
|
|
84
|
+
disabled: '○ ',
|
|
85
|
+
};
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// MCP helpers (duplicated from mcp.ts to keep doctor self-contained)
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
function getMcpConnectionInfoPath() {
|
|
90
|
+
const dir = process.platform === 'win32'
|
|
91
|
+
? path.join(process.env.APPDATA ?? path.join(os.homedir(), 'AppData', 'Roaming'), 'Local')
|
|
92
|
+
: process.platform === 'darwin'
|
|
93
|
+
? path.join(os.homedir(), 'Library', 'Application Support', 'Local')
|
|
94
|
+
: path.join(os.homedir(), '.config', 'Local');
|
|
95
|
+
return path.join(dir, 'nexus-ai-mcp-connection-info.json');
|
|
96
|
+
}
|
|
97
|
+
function loadMcpInfo() {
|
|
98
|
+
try {
|
|
99
|
+
const data = fs.readFileSync(getMcpConnectionInfoPath(), 'utf-8');
|
|
100
|
+
return JSON.parse(data);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function isMcpServerLive(url, token) {
|
|
107
|
+
try {
|
|
108
|
+
const https = await Promise.resolve().then(() => __importStar(require('https')));
|
|
109
|
+
const http = await Promise.resolve().then(() => __importStar(require('http')));
|
|
110
|
+
const lib = url.startsWith('https') ? https : http;
|
|
111
|
+
return await new Promise((resolve) => {
|
|
112
|
+
const req = lib.get(`${url}/health`, { headers: { Authorization: `Bearer ${token}` }, timeout: 3000 }, (res) => resolve(res.statusCode === 200));
|
|
113
|
+
req.on('error', () => resolve(false));
|
|
114
|
+
req.on('timeout', () => { req.destroy(); resolve(false); });
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Individual checks (each returns CheckResult, never throws)
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
async function checkLocalInstalled() {
|
|
125
|
+
try {
|
|
126
|
+
const installed = (0, process_1.isLocalInstalled)();
|
|
127
|
+
return installed
|
|
128
|
+
? { label: 'Local app', status: 'ok', detail: 'Installed' }
|
|
129
|
+
: { label: 'Local app', status: 'error', detail: 'Not found', action: 'Download Local from https://localwp.com' };
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return { label: 'Local app', status: 'error', detail: 'Check failed' };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function checkLocalRunning() {
|
|
136
|
+
try {
|
|
137
|
+
const running = await (0, process_1.isLocalRunning)();
|
|
138
|
+
return running
|
|
139
|
+
? { label: 'Local running', status: 'ok', detail: 'Running' }
|
|
140
|
+
: { label: 'Local running', status: 'warn', detail: 'Not running', action: 'Open the Local app' };
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return { label: 'Local running', status: 'error', detail: 'Check failed' };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Try to read addon version from the npm global install path.
|
|
148
|
+
* The addon may be loaded by Local from the npm global dir (not Local's own addons/ folder)
|
|
149
|
+
* when installed via `npm install -g`.
|
|
150
|
+
*/
|
|
151
|
+
function getGlobalNpmAddonVersion() {
|
|
152
|
+
// Try npm global resolution first
|
|
153
|
+
try {
|
|
154
|
+
const pkgPath = require.resolve('@local-labs-jpollock/local-addon-nexus-ai/package.json');
|
|
155
|
+
return require(pkgPath).version ?? null;
|
|
156
|
+
}
|
|
157
|
+
catch { /* not on require path */ }
|
|
158
|
+
// Fallback: CLI and addon are the same package — read our own package.json.
|
|
159
|
+
// __dirname is lib/cli/commands, so ../../.. reaches the package root.
|
|
160
|
+
try {
|
|
161
|
+
const pkgPath = path.join(__dirname, '..', '..', '..', 'package.json');
|
|
162
|
+
return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')).version ?? null;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function checkAddon() {
|
|
169
|
+
try {
|
|
170
|
+
// isAddonActivated() is the authoritative signal — if the addon is in enabled-addons.json,
|
|
171
|
+
// Local has it available and it's active. isAddonInstalled() only checks one specific path
|
|
172
|
+
// and misses npm-global installs (the common case for `npm install -g` users).
|
|
173
|
+
const activated = (0, addon_1.isAddonActivated)();
|
|
174
|
+
const version = (0, addon_1.getInstalledAddonVersion)() ?? getGlobalNpmAddonVersion() ?? 'unknown';
|
|
175
|
+
const devMode = (0, addon_1.isDevAddon)();
|
|
176
|
+
if (activated) {
|
|
177
|
+
const detail = `Active (v${version})${devMode ? ' · dev' : ''}`;
|
|
178
|
+
return { label: 'Nexus AI addon', status: 'ok', detail };
|
|
179
|
+
}
|
|
180
|
+
// Activated flag not set — may be installed but not enabled
|
|
181
|
+
const installed = (0, addon_1.isAddonInstalled)();
|
|
182
|
+
if (installed) {
|
|
183
|
+
return { label: 'Nexus AI addon', status: 'warn', detail: `Installed (v${version}) but not activated`, action: 'Enable Nexus AI in Local → Preferences → Addons' };
|
|
184
|
+
}
|
|
185
|
+
return { label: 'Nexus AI addon', status: 'error', detail: 'Not installed', action: 'nexus update' };
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return { label: 'Nexus AI addon', status: 'error', detail: 'Check failed' };
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async function checkVersionMatch() {
|
|
192
|
+
try {
|
|
193
|
+
const addonVersion = (0, addon_1.getInstalledAddonVersion)();
|
|
194
|
+
if (!addonVersion)
|
|
195
|
+
return null;
|
|
196
|
+
// package.json version is baked in at build time via __VERSION__ or require
|
|
197
|
+
const cliPkg = require('../../../package.json');
|
|
198
|
+
const cliVersion = cliPkg.version;
|
|
199
|
+
if (addonVersion !== cliVersion) {
|
|
200
|
+
return {
|
|
201
|
+
label: 'Version match',
|
|
202
|
+
status: 'warn',
|
|
203
|
+
detail: `CLI v${cliVersion} ≠ addon v${addonVersion}`,
|
|
204
|
+
action: 'nexus update',
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return { label: 'Version match', status: 'ok', detail: `v${cliVersion}` };
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return null; // Non-critical — skip silently
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async function checkGraphQL() {
|
|
214
|
+
try {
|
|
215
|
+
const info = (0, graphql_1.readConnectionInfo)();
|
|
216
|
+
if (!info) {
|
|
217
|
+
return { label: 'GraphQL server', status: 'warn', detail: 'No connection info — Local may not be running' };
|
|
218
|
+
}
|
|
219
|
+
return { label: 'GraphQL server', status: 'ok', detail: `Connected (port ${info.port})` };
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return { label: 'GraphQL server', status: 'error', detail: 'Check failed' };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async function checkMcpServer() {
|
|
226
|
+
try {
|
|
227
|
+
const info = loadMcpInfo();
|
|
228
|
+
if (!info) {
|
|
229
|
+
return { label: 'MCP server', status: 'warn', detail: 'Not configured', action: 'Start Local with Nexus AI addon to activate MCP' };
|
|
230
|
+
}
|
|
231
|
+
const live = await isMcpServerLive(info.url, info.authToken);
|
|
232
|
+
if (!live) {
|
|
233
|
+
return { label: 'MCP server', status: 'warn', detail: `Configured (port ${info.port}) but not responding`, action: 'Restart Local' };
|
|
234
|
+
}
|
|
235
|
+
return { label: 'MCP server', status: 'ok', detail: `Running · ${info.tools.length} tools (v${info.version ?? '?'})` };
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return { label: 'MCP server', status: 'error', detail: 'Check failed' };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Check if Claude Code has nexus-ai registered via `claude mcp list`.
|
|
243
|
+
* Claude Code is a CLI tool — registrations are managed by the `claude` binary,
|
|
244
|
+
* not a config file we can inspect directly.
|
|
245
|
+
*/
|
|
246
|
+
async function isClaudeCodeConfigured() {
|
|
247
|
+
try {
|
|
248
|
+
const { execFile } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
249
|
+
const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
|
|
250
|
+
const exec = promisify(execFile);
|
|
251
|
+
const { stdout } = await exec('claude', ['mcp', 'list'], { timeout: 4000 });
|
|
252
|
+
return stdout.toLowerCase().includes('nexus-ai') || stdout.includes('mcp-stdio');
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// claude not installed, not in PATH, or command failed
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async function checkAgentConfig() {
|
|
260
|
+
try {
|
|
261
|
+
const info = loadMcpInfo();
|
|
262
|
+
if (!info) {
|
|
263
|
+
return { label: 'AI agent config', status: 'warn', detail: 'MCP server not running', action: 'nexus mcp setup' };
|
|
264
|
+
}
|
|
265
|
+
const configured = [];
|
|
266
|
+
// Claude Code — CLI-based, detect via `claude mcp list`
|
|
267
|
+
if (await isClaudeCodeConfigured()) {
|
|
268
|
+
configured.push('Claude Code');
|
|
269
|
+
}
|
|
270
|
+
// File-based agents — check their config files for nexus references
|
|
271
|
+
for (const [name, getPath] of Object.entries(AGENT_CONFIG_PATHS)) {
|
|
272
|
+
try {
|
|
273
|
+
const content = fs.readFileSync(getPath(), 'utf-8');
|
|
274
|
+
if (content.includes(info.url) || content.includes('nexus-ai') || content.includes('mcp-stdio')) {
|
|
275
|
+
configured.push(name);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// File doesn't exist — agent not configured
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (configured.length === 0) {
|
|
283
|
+
return { label: 'AI agent config', status: 'warn', detail: 'No agents configured', action: 'nexus mcp setup' };
|
|
284
|
+
}
|
|
285
|
+
return { label: 'AI agent config', status: 'ok', detail: configured.join(', ') };
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return { label: 'AI agent config', status: 'error', detail: 'Check failed' };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async function checkAiProvider(graphqlAvailable) {
|
|
292
|
+
if (!graphqlAvailable) {
|
|
293
|
+
return { label: 'AI provider', status: 'skip', detail: 'Local not running' };
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
const { getClient } = await Promise.resolve().then(() => __importStar(require('../utils/graphql')));
|
|
297
|
+
const client = getClient({ timeout: 5000 });
|
|
298
|
+
const result = await client.mutate(`
|
|
299
|
+
mutation { nexusAiGetConfig { success config { provider model hasApiKey useLocalGateway } } }
|
|
300
|
+
`, {});
|
|
301
|
+
const { success, config } = result.nexusAiGetConfig;
|
|
302
|
+
if (!success || !config?.provider) {
|
|
303
|
+
return { label: 'AI provider', status: 'warn', detail: 'Not configured', action: 'nexus ai config' };
|
|
304
|
+
}
|
|
305
|
+
const label = PROVIDER_LABELS[config.provider] ?? config.provider;
|
|
306
|
+
if (!config.hasApiKey && config.provider !== 'ollama') {
|
|
307
|
+
return { label: 'AI provider', status: 'warn', detail: `${label} · no API key`, action: 'nexus ai config' };
|
|
308
|
+
}
|
|
309
|
+
return { label: 'AI provider', status: 'ok', detail: label };
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return { label: 'AI provider', status: 'skip', detail: 'Could not reach addon' };
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async function checkGateway(graphqlAvailable) {
|
|
316
|
+
if (!graphqlAvailable) {
|
|
317
|
+
return { label: 'Local Gateway', status: 'skip', detail: 'Local not running' };
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
const { getClient } = await Promise.resolve().then(() => __importStar(require('../utils/graphql')));
|
|
321
|
+
const client = getClient({ timeout: 5000 });
|
|
322
|
+
const result = await client.mutate(`
|
|
323
|
+
mutation { nexusAiGetConfig { success config { useLocalGateway } } }
|
|
324
|
+
`, {});
|
|
325
|
+
const enabled = result.nexusAiGetConfig?.config?.useLocalGateway;
|
|
326
|
+
return enabled
|
|
327
|
+
? { label: 'Local Gateway', status: 'ok', detail: 'Enabled' }
|
|
328
|
+
: { label: 'Local Gateway', status: 'disabled', detail: 'Disabled' };
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return { label: 'Local Gateway', status: 'skip', detail: 'Could not reach addon' };
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function readSiteAiConfigs() {
|
|
335
|
+
try {
|
|
336
|
+
const p = path.join((0, paths_1.getLocalPaths)().dataDir, 'nexus-ai_site_ai_config.json');
|
|
337
|
+
return JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
return {};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
async function checkSitesWithAI(graphqlAvailable) {
|
|
344
|
+
if (!graphqlAvailable) {
|
|
345
|
+
return { label: 'Sites with AI', status: 'skip', detail: 'Local not running' };
|
|
346
|
+
}
|
|
347
|
+
try {
|
|
348
|
+
const { getClient } = await Promise.resolve().then(() => __importStar(require('../utils/graphql')));
|
|
349
|
+
const client = getClient({ timeout: 8000 });
|
|
350
|
+
const result = await client.mutate(`
|
|
351
|
+
mutation { nexusSitesList { local { name status } } }
|
|
352
|
+
`, {});
|
|
353
|
+
const sites = result.nexusSitesList?.local ?? [];
|
|
354
|
+
const total = sites.length;
|
|
355
|
+
if (total === 0) {
|
|
356
|
+
return { label: 'Sites with AI', status: 'skip', detail: 'No local sites found' };
|
|
357
|
+
}
|
|
358
|
+
// Read AI config from disk — no separate GraphQL mutation needed
|
|
359
|
+
const siteAiConfigs = readSiteAiConfigs();
|
|
360
|
+
const configuredCount = Object.keys(siteAiConfigs).length;
|
|
361
|
+
const running = sites.filter((s) => s.status === 'running');
|
|
362
|
+
const detail = `${configuredCount} / ${total} site${total !== 1 ? 's' : ''} configured · ${running.length} running`;
|
|
363
|
+
if (configuredCount === 0) {
|
|
364
|
+
const firstRunning = running[0];
|
|
365
|
+
return {
|
|
366
|
+
label: 'Sites with AI',
|
|
367
|
+
status: 'warn',
|
|
368
|
+
detail,
|
|
369
|
+
action: firstRunning ? `nexus ai setup ${firstRunning.name}` : 'nexus ai setup <sitename>',
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
return { label: 'Sites with AI', status: 'ok', detail };
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
return { label: 'Sites with AI', status: 'skip', detail: 'Could not reach addon' };
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// ---------------------------------------------------------------------------
|
|
379
|
+
// Report rendering
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
const COL_LABEL = 18; // label column width
|
|
382
|
+
function formatRow(result) {
|
|
383
|
+
const icon = ICON[result.status];
|
|
384
|
+
const label = result.label.padEnd(COL_LABEL);
|
|
385
|
+
const detail = result.detail ? ` ${result.detail}` : '';
|
|
386
|
+
return ` ${icon} ${label}${detail}`;
|
|
387
|
+
}
|
|
388
|
+
function isFirstRun(checks) {
|
|
389
|
+
// "First run" = MCP not configured AND no AI provider set
|
|
390
|
+
const mcp = checks.find((c) => c.label === 'MCP server');
|
|
391
|
+
const ai = checks.find((c) => c.label === 'AI provider');
|
|
392
|
+
return mcp?.status === 'warn' && ai?.status === 'warn';
|
|
393
|
+
}
|
|
394
|
+
function renderReport(checks, version) {
|
|
395
|
+
const line = '─'.repeat(50);
|
|
396
|
+
const localRunning = checks.find((c) => c.label === 'Local running')?.status === 'ok';
|
|
397
|
+
console.log('');
|
|
398
|
+
console.log(`Nexus AI v${version} — System Health`);
|
|
399
|
+
console.log(line);
|
|
400
|
+
for (const check of checks) {
|
|
401
|
+
console.log(formatRow(check));
|
|
402
|
+
}
|
|
403
|
+
console.log(line);
|
|
404
|
+
const nextSteps = checks
|
|
405
|
+
.filter((c) => c.action && (c.status === 'warn' || c.status === 'error'))
|
|
406
|
+
.map((c) => c.action);
|
|
407
|
+
if (nextSteps.length > 0) {
|
|
408
|
+
console.log('');
|
|
409
|
+
if (isFirstRun(checks) && !localRunning) {
|
|
410
|
+
console.log(' Getting started:');
|
|
411
|
+
console.log('');
|
|
412
|
+
console.log(' 1. Open the Local app and make sure Nexus AI addon is enabled.');
|
|
413
|
+
console.log(' 2. Connect your AI agent: nexus mcp setup');
|
|
414
|
+
console.log(' 3. Configure AI provider: nexus ai config');
|
|
415
|
+
console.log('');
|
|
416
|
+
}
|
|
417
|
+
else if (isFirstRun(checks)) {
|
|
418
|
+
console.log(' Getting started:');
|
|
419
|
+
console.log('');
|
|
420
|
+
console.log(' 1. Connect your AI agent: nexus mcp setup');
|
|
421
|
+
console.log(' 2. Configure AI provider: nexus ai config');
|
|
422
|
+
console.log(' 3. Set up a WordPress site: nexus ai setup <sitename>');
|
|
423
|
+
console.log('');
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
console.log(' Next steps:');
|
|
427
|
+
for (const step of [...new Set(nextSteps)]) {
|
|
428
|
+
console.log(` → ${step}`);
|
|
429
|
+
}
|
|
430
|
+
console.log('');
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
console.log('');
|
|
435
|
+
console.log(' Everything looks good. 🎉');
|
|
436
|
+
console.log('');
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
function renderJson(checks, version) {
|
|
440
|
+
const output = {
|
|
441
|
+
version,
|
|
442
|
+
healthy: checks.every((c) => c.status === 'ok' || c.status === 'disabled' || c.status === 'skip'),
|
|
443
|
+
checks: checks.map((c) => ({
|
|
444
|
+
label: c.label,
|
|
445
|
+
status: c.status,
|
|
446
|
+
detail: c.detail ?? null,
|
|
447
|
+
action: c.action ?? null,
|
|
448
|
+
})),
|
|
449
|
+
};
|
|
450
|
+
console.log(JSON.stringify(output, null, 2));
|
|
451
|
+
}
|
|
452
|
+
// ---------------------------------------------------------------------------
|
|
453
|
+
// Command
|
|
454
|
+
// ---------------------------------------------------------------------------
|
|
455
|
+
exports.doctorCommand = new commander_1.Command('doctor')
|
|
456
|
+
.description('Check system health and show setup status')
|
|
457
|
+
.option('--json', 'Output as JSON')
|
|
458
|
+
.action(async (options) => {
|
|
459
|
+
const cliPkg = (() => {
|
|
460
|
+
try {
|
|
461
|
+
return require('../../../package.json');
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
return { version: '?' };
|
|
465
|
+
}
|
|
466
|
+
})();
|
|
467
|
+
const version = cliPkg.version;
|
|
468
|
+
const checks = [];
|
|
469
|
+
// ── Phase 1: checks that never need Local/GraphQL ────────────────────
|
|
470
|
+
checks.push(await checkLocalInstalled());
|
|
471
|
+
checks.push(await checkLocalRunning());
|
|
472
|
+
checks.push(await checkAddon());
|
|
473
|
+
const versionMatch = await checkVersionMatch();
|
|
474
|
+
if (versionMatch)
|
|
475
|
+
checks.push(versionMatch);
|
|
476
|
+
checks.push(await checkGraphQL());
|
|
477
|
+
checks.push(await checkMcpServer());
|
|
478
|
+
checks.push(await checkAgentConfig());
|
|
479
|
+
// ── Phase 2: checks that need GraphQL (only if GraphQL is reachable) ─
|
|
480
|
+
const graphqlAvailable = checks.find((c) => c.label === 'GraphQL server')?.status === 'ok';
|
|
481
|
+
checks.push(await checkAiProvider(graphqlAvailable));
|
|
482
|
+
checks.push(await checkGateway(graphqlAvailable));
|
|
483
|
+
checks.push(await checkSitesWithAI(graphqlAvailable));
|
|
484
|
+
// ── Output ────────────────────────────────────────────────────────────
|
|
485
|
+
if (options.json) {
|
|
486
|
+
renderJson(checks, version);
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
renderReport(checks, version);
|
|
490
|
+
}
|
|
491
|
+
// Exit with non-zero if any check is 'error'
|
|
492
|
+
const hasError = checks.some((c) => c.status === 'error');
|
|
493
|
+
if (hasError)
|
|
494
|
+
process.exit(1);
|
|
495
|
+
});
|
|
496
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/lib/cli/index.js
CHANGED
|
@@ -52,6 +52,7 @@ const content_1 = require("./commands/content");
|
|
|
52
52
|
const ai_1 = require("./commands/ai");
|
|
53
53
|
const audit_1 = require("./commands/audit");
|
|
54
54
|
const mcp_1 = require("./commands/mcp");
|
|
55
|
+
const doctor_1 = require("./commands/doctor");
|
|
55
56
|
const bootstrap_1 = require("./bootstrap");
|
|
56
57
|
const version_1 = require("./utils/version");
|
|
57
58
|
const context_1 = require("./utils/context");
|
|
@@ -73,6 +74,7 @@ program.addCommand(content_1.contentCommand);
|
|
|
73
74
|
program.addCommand(ai_1.aiCommand);
|
|
74
75
|
program.addCommand(audit_1.auditCommand);
|
|
75
76
|
program.addCommand(mcp_1.mcpCommand);
|
|
77
|
+
program.addCommand(doctor_1.doctorCommand);
|
|
76
78
|
// Global error handler
|
|
77
79
|
process.on('unhandledRejection', (error) => {
|
|
78
80
|
console.error('\n❌ Unexpected error:', error.message);
|
|
@@ -95,7 +97,8 @@ async function main() {
|
|
|
95
97
|
process.argv.includes('-h') ||
|
|
96
98
|
process.argv.includes('help') ||
|
|
97
99
|
process.argv.includes('update') ||
|
|
98
|
-
process.argv.includes('mcp')
|
|
100
|
+
process.argv.includes('mcp') || // mcp reads connection-info file directly
|
|
101
|
+
process.argv.includes('doctor'); // doctor handles its own connection logic
|
|
99
102
|
if (!skipBootstrap) {
|
|
100
103
|
const spinner = process.stdout.isTTY ? true : false;
|
|
101
104
|
if (spinner) {
|
package/lib/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAoC;AACpC,4CAAgD;AAChD,sCAA0C;AAC1C,0CAA8C;AAC9C,wCAA4C;AAC5C,sDAA0D;AAC1D,8CAAkD;AAClD,4CAAgD;AAChD,gDAAoD;AACpD,sCAA0C;AAC1C,4CAAgD;AAChD,wCAA4C;AAC5C,2CAAwC;AACxC,6CAAqE;AACrE,6CAAqD;AACrD,iDAAqF;AAErF,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,IAAA,2BAAiB,GAAE,CAAC,CAAC;AAEhC,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,cAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,gBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,8BAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,gBAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/lib/common/schemas.d.ts
CHANGED
|
@@ -529,16 +529,13 @@ export declare const WpeRemoveSiteSchema: z.ZodObject<{
|
|
|
529
529
|
installId: string;
|
|
530
530
|
}>;
|
|
531
531
|
export declare const WpePullToLocalSchema: z.ZodObject<{
|
|
532
|
-
wpeSiteId: z.ZodString;
|
|
533
532
|
installName: z.ZodString;
|
|
534
533
|
installId: z.ZodString;
|
|
535
534
|
}, "strip", z.ZodTypeAny, {
|
|
536
535
|
installId: string;
|
|
537
|
-
wpeSiteId: string;
|
|
538
536
|
installName: string;
|
|
539
537
|
}, {
|
|
540
538
|
installId: string;
|
|
541
|
-
wpeSiteId: string;
|
|
542
539
|
installName: string;
|
|
543
540
|
}>;
|
|
544
541
|
export declare const WpeSyncSingleSchema: z.ZodObject<{
|
|
@@ -612,11 +609,11 @@ export declare const SidebarBulkActionSchema: z.ZodObject<{
|
|
|
612
609
|
action: z.ZodEnum<["start", "stop", "setup-ai"]>;
|
|
613
610
|
siteIds: z.ZodArray<z.ZodString, "many">;
|
|
614
611
|
}, "strip", z.ZodTypeAny, {
|
|
615
|
-
siteIds: string[];
|
|
616
612
|
action: "start" | "stop" | "setup-ai";
|
|
617
|
-
}, {
|
|
618
613
|
siteIds: string[];
|
|
614
|
+
}, {
|
|
619
615
|
action: "start" | "stop" | "setup-ai";
|
|
616
|
+
siteIds: string[];
|
|
620
617
|
}>;
|
|
621
618
|
export declare const SiteFinderAIParseSchema: z.ZodObject<{
|
|
622
619
|
conversation: z.ZodArray<z.ZodObject<{
|