@mainwp/control 1.0.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/LICENSE +674 -0
- package/README.md +583 -0
- package/bin/_exit.js +12 -0
- package/bin/dev.js +7 -0
- package/bin/run.js +7 -0
- package/dist/chat/chat-engine.d.ts +213 -0
- package/dist/chat/chat-engine.d.ts.map +1 -0
- package/dist/chat/chat-engine.js +636 -0
- package/dist/chat/chat-engine.js.map +1 -0
- package/dist/chat/index.d.ts +10 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +14 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/providers/anthropic.d.ts +52 -0
- package/dist/chat/providers/anthropic.d.ts.map +1 -0
- package/dist/chat/providers/anthropic.js +292 -0
- package/dist/chat/providers/anthropic.js.map +1 -0
- package/dist/chat/providers/gemini.d.ts +52 -0
- package/dist/chat/providers/gemini.d.ts.map +1 -0
- package/dist/chat/providers/gemini.js +284 -0
- package/dist/chat/providers/gemini.js.map +1 -0
- package/dist/chat/providers/index.d.ts +19 -0
- package/dist/chat/providers/index.d.ts.map +1 -0
- package/dist/chat/providers/index.js +23 -0
- package/dist/chat/providers/index.js.map +1 -0
- package/dist/chat/providers/local.d.ts +37 -0
- package/dist/chat/providers/local.d.ts.map +1 -0
- package/dist/chat/providers/local.js +130 -0
- package/dist/chat/providers/local.js.map +1 -0
- package/dist/chat/providers/openai-compatible.d.ts +155 -0
- package/dist/chat/providers/openai-compatible.d.ts.map +1 -0
- package/dist/chat/providers/openai-compatible.js +264 -0
- package/dist/chat/providers/openai-compatible.js.map +1 -0
- package/dist/chat/providers/openai.d.ts +24 -0
- package/dist/chat/providers/openai.d.ts.map +1 -0
- package/dist/chat/providers/openai.js +62 -0
- package/dist/chat/providers/openai.js.map +1 -0
- package/dist/chat/providers/openrouter.d.ts +26 -0
- package/dist/chat/providers/openrouter.d.ts.map +1 -0
- package/dist/chat/providers/openrouter.js +65 -0
- package/dist/chat/providers/openrouter.js.map +1 -0
- package/dist/chat/providers/provider-fetch.d.ts +15 -0
- package/dist/chat/providers/provider-fetch.d.ts.map +1 -0
- package/dist/chat/providers/provider-fetch.js +35 -0
- package/dist/chat/providers/provider-fetch.js.map +1 -0
- package/dist/chat/providers/provider.d.ts +214 -0
- package/dist/chat/providers/provider.d.ts.map +1 -0
- package/dist/chat/providers/provider.js +166 -0
- package/dist/chat/providers/provider.js.map +1 -0
- package/dist/chat/providers/sse-reader.d.ts +21 -0
- package/dist/chat/providers/sse-reader.d.ts.map +1 -0
- package/dist/chat/providers/sse-reader.js +48 -0
- package/dist/chat/providers/sse-reader.js.map +1 -0
- package/dist/chat/system-prompt.d.ts +33 -0
- package/dist/chat/system-prompt.d.ts.map +1 -0
- package/dist/chat/system-prompt.js +166 -0
- package/dist/chat/system-prompt.js.map +1 -0
- package/dist/chat/tool-envelope.d.ts +72 -0
- package/dist/chat/tool-envelope.d.ts.map +1 -0
- package/dist/chat/tool-envelope.js +263 -0
- package/dist/chat/tool-envelope.js.map +1 -0
- package/dist/commands/abilities/info.d.ts +21 -0
- package/dist/commands/abilities/info.d.ts.map +1 -0
- package/dist/commands/abilities/info.js +80 -0
- package/dist/commands/abilities/info.js.map +1 -0
- package/dist/commands/abilities/list.d.ts +19 -0
- package/dist/commands/abilities/list.d.ts.map +1 -0
- package/dist/commands/abilities/list.js +98 -0
- package/dist/commands/abilities/list.js.map +1 -0
- package/dist/commands/abilities/run.d.ts +75 -0
- package/dist/commands/abilities/run.d.ts.map +1 -0
- package/dist/commands/abilities/run.js +468 -0
- package/dist/commands/abilities/run.js.map +1 -0
- package/dist/commands/chat.d.ts +54 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +384 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config/show.d.ts +54 -0
- package/dist/commands/config/show.d.ts.map +1 -0
- package/dist/commands/config/show.js +324 -0
- package/dist/commands/config/show.js.map +1 -0
- package/dist/commands/doctor.d.ts +77 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +412 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/jobs/watch.d.ts +50 -0
- package/dist/commands/jobs/watch.d.ts.map +1 -0
- package/dist/commands/jobs/watch.js +269 -0
- package/dist/commands/jobs/watch.js.map +1 -0
- package/dist/commands/login.d.ts +25 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +165 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/profile/delete.d.ts +22 -0
- package/dist/commands/profile/delete.d.ts.map +1 -0
- package/dist/commands/profile/delete.js +57 -0
- package/dist/commands/profile/delete.js.map +1 -0
- package/dist/commands/profile/list.d.ts +19 -0
- package/dist/commands/profile/list.d.ts.map +1 -0
- package/dist/commands/profile/list.js +53 -0
- package/dist/commands/profile/list.js.map +1 -0
- package/dist/commands/profile/use.d.ts +22 -0
- package/dist/commands/profile/use.d.ts.map +1 -0
- package/dist/commands/profile/use.js +46 -0
- package/dist/commands/profile/use.js.map +1 -0
- package/dist/config/fs-utils.d.ts +14 -0
- package/dist/config/fs-utils.d.ts.map +1 -0
- package/dist/config/fs-utils.js +31 -0
- package/dist/config/fs-utils.js.map +1 -0
- package/dist/config/keychain.d.ts +53 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +175 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/config/profile-store.d.ts +85 -0
- package/dist/config/profile-store.d.ts.map +1 -0
- package/dist/config/profile-store.js +228 -0
- package/dist/config/profile-store.js.map +1 -0
- package/dist/config/settings.d.ts +71 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +151 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/core/abilities-executor.d.ts +126 -0
- package/dist/core/abilities-executor.d.ts.map +1 -0
- package/dist/core/abilities-executor.js +264 -0
- package/dist/core/abilities-executor.js.map +1 -0
- package/dist/core/batch-manager.d.ts +113 -0
- package/dist/core/batch-manager.d.ts.map +1 -0
- package/dist/core/batch-manager.js +244 -0
- package/dist/core/batch-manager.js.map +1 -0
- package/dist/core/http-client.d.ts +111 -0
- package/dist/core/http-client.d.ts.map +1 -0
- package/dist/core/http-client.js +329 -0
- package/dist/core/http-client.js.map +1 -0
- package/dist/core/safety-controller.d.ts +114 -0
- package/dist/core/safety-controller.d.ts.map +1 -0
- package/dist/core/safety-controller.js +229 -0
- package/dist/core/safety-controller.js.map +1 -0
- package/dist/hooks/command-not-found.d.ts +12 -0
- package/dist/hooks/command-not-found.d.ts.map +1 -0
- package/dist/hooks/command-not-found.js +58 -0
- package/dist/hooks/command-not-found.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/base-command.d.ts +123 -0
- package/dist/lib/base-command.d.ts.map +1 -0
- package/dist/lib/base-command.js +285 -0
- package/dist/lib/base-command.js.map +1 -0
- package/dist/output/formatter.d.ts +48 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +138 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/json-envelope.d.ts +43 -0
- package/dist/output/json-envelope.d.ts.map +1 -0
- package/dist/output/json-envelope.js +73 -0
- package/dist/output/json-envelope.js.map +1 -0
- package/dist/utils/audit-logger.d.ts +97 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +169 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/colors.d.ts +29 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +36 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/errors.d.ts +107 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +149 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/exit-codes.d.ts +21 -0
- package/dist/utils/exit-codes.d.ts.map +1 -0
- package/dist/utils/exit-codes.js +20 -0
- package/dist/utils/exit-codes.js.map +1 -0
- package/dist/utils/format.d.ts +64 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +69 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/prompt.d.ts +34 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +132 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/retry.d.ts +59 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +96 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/terminal-sanitizer.d.ts +60 -0
- package/dist/utils/terminal-sanitizer.d.ts.map +1 -0
- package/dist/utils/terminal-sanitizer.js +166 -0
- package/dist/utils/terminal-sanitizer.js.map +1 -0
- package/dist/validation/input-sanitizer.d.ts +76 -0
- package/dist/validation/input-sanitizer.d.ts.map +1 -0
- package/dist/validation/input-sanitizer.js +199 -0
- package/dist/validation/input-sanitizer.js.map +1 -0
- package/dist/validation/schema-validator.d.ts +75 -0
- package/dist/validation/schema-validator.d.ts.map +1 -0
- package/dist/validation/schema-validator.js +147 -0
- package/dist/validation/schema-validator.js.map +1 -0
- package/oclif.manifest.json +857 -0
- package/package.json +101 -0
- package/scripts/completions/README.md +221 -0
- package/scripts/completions/mainwpcontrol.bash +193 -0
- package/scripts/completions/mainwpcontrol.zsh +267 -0
- package/scripts/completions/profile-completer.sh +35 -0
- package/scripts/completions/regenerate.sh +78 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Command for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Diagnoses configuration issues and validates connectivity.
|
|
5
|
+
*
|
|
6
|
+
* Checks:
|
|
7
|
+
* - Profile configuration
|
|
8
|
+
* - Credential storage (keychain)
|
|
9
|
+
* - Dashboard connectivity
|
|
10
|
+
* - Abilities API availability
|
|
11
|
+
* - LLM provider configuration
|
|
12
|
+
*/
|
|
13
|
+
import { Flags } from '@oclif/core';
|
|
14
|
+
import { BaseCommand, commonFlags } from '../lib/base-command.js';
|
|
15
|
+
import { getProfileStore } from '../config/profile-store.js';
|
|
16
|
+
import { getKeychain } from '../config/keychain.js';
|
|
17
|
+
import { PROVIDER_ENV_VARS, resolveProviderSelection, } from '../chat/providers/provider.js';
|
|
18
|
+
import { ExitCode } from '../utils/exit-codes.js';
|
|
19
|
+
import { maskPassword, maskApiKey } from '../utils/format.js';
|
|
20
|
+
import { color, colors } from '../utils/colors.js';
|
|
21
|
+
/** Check names whose failure means the system is not ready */
|
|
22
|
+
const CRITICAL_CHECKS = ['Profiles', 'Active Profile', 'Credentials', 'Dashboard Connection'];
|
|
23
|
+
export default class DoctorCommand extends BaseCommand {
|
|
24
|
+
static description = 'Diagnose configuration and connectivity issues';
|
|
25
|
+
static examples = [
|
|
26
|
+
{
|
|
27
|
+
command: '<%= config.bin %> doctor',
|
|
28
|
+
description: 'Run all diagnostic checks',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
command: '<%= config.bin %> doctor --json',
|
|
32
|
+
description: 'Output results in JSON format',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
static flags = {
|
|
36
|
+
...commonFlags,
|
|
37
|
+
verbose: Flags.boolean({
|
|
38
|
+
char: 'v',
|
|
39
|
+
description: 'Show detailed output',
|
|
40
|
+
default: false,
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Don't require a profile for doctor command
|
|
45
|
+
*/
|
|
46
|
+
needsProfile() {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
async run() {
|
|
50
|
+
const { flags } = await this.parse(DoctorCommand);
|
|
51
|
+
await this.initCommon(flags);
|
|
52
|
+
const checks = [];
|
|
53
|
+
// Run all checks
|
|
54
|
+
checks.push(await this.checkProfiles());
|
|
55
|
+
checks.push(await this.checkKeychain());
|
|
56
|
+
checks.push(await this.checkActiveProfile());
|
|
57
|
+
checks.push(await this.checkCredentials());
|
|
58
|
+
// Fetch abilities once for both dashboard and API checks
|
|
59
|
+
const { abilities, connectionCheck } = await this.fetchAbilities();
|
|
60
|
+
checks.push(connectionCheck);
|
|
61
|
+
checks.push(this.checkAbilitiesFromList(abilities));
|
|
62
|
+
checks.push(await this.checkLLMProvider());
|
|
63
|
+
// Build report
|
|
64
|
+
const report = this.buildReport(checks);
|
|
65
|
+
// Output
|
|
66
|
+
if (this.jsonOutput) {
|
|
67
|
+
this.output(report);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.displayReport(report, flags.verbose);
|
|
71
|
+
}
|
|
72
|
+
// Exit with error if not ready
|
|
73
|
+
if (!report.ready) {
|
|
74
|
+
this.exit(ExitCode.INPUT_ERROR);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if profiles are configured
|
|
79
|
+
*/
|
|
80
|
+
async checkProfiles() {
|
|
81
|
+
try {
|
|
82
|
+
const profileStore = getProfileStore();
|
|
83
|
+
const profiles = await profileStore.list();
|
|
84
|
+
if (profiles.length === 0) {
|
|
85
|
+
return {
|
|
86
|
+
name: 'Profiles',
|
|
87
|
+
status: 'fail',
|
|
88
|
+
message: 'No profiles configured',
|
|
89
|
+
details: 'Run `mainwpcontrol login` to create a profile',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
name: 'Profiles',
|
|
94
|
+
status: 'pass',
|
|
95
|
+
message: `${profiles.length} profile(s) configured`,
|
|
96
|
+
details: profiles.map((p) => p.name).join(', '),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
return {
|
|
101
|
+
name: 'Profiles',
|
|
102
|
+
status: 'fail',
|
|
103
|
+
message: 'Failed to read profiles',
|
|
104
|
+
details: error instanceof Error ? error.message : String(error),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check keychain availability
|
|
110
|
+
*/
|
|
111
|
+
async checkKeychain() {
|
|
112
|
+
try {
|
|
113
|
+
const keychain = getKeychain();
|
|
114
|
+
const available = await keychain.isAvailable();
|
|
115
|
+
if (!available) {
|
|
116
|
+
return {
|
|
117
|
+
name: 'Keychain',
|
|
118
|
+
status: 'warn',
|
|
119
|
+
message: 'OS keychain not available',
|
|
120
|
+
details: 'Credentials will use MAINWP_APP_PASSWORD environment variable. ' +
|
|
121
|
+
'Consider installing keytar for secure storage.',
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
name: 'Keychain',
|
|
126
|
+
status: 'pass',
|
|
127
|
+
message: 'OS keychain available',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return {
|
|
132
|
+
name: 'Keychain',
|
|
133
|
+
status: 'warn',
|
|
134
|
+
message: 'Could not check keychain',
|
|
135
|
+
details: error instanceof Error ? error.message : String(error),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check active profile
|
|
141
|
+
*/
|
|
142
|
+
async checkActiveProfile() {
|
|
143
|
+
try {
|
|
144
|
+
const profileStore = getProfileStore();
|
|
145
|
+
const activeProfile = await profileStore.getActive();
|
|
146
|
+
if (!activeProfile) {
|
|
147
|
+
return {
|
|
148
|
+
name: 'Active Profile',
|
|
149
|
+
status: 'fail',
|
|
150
|
+
message: 'No active profile',
|
|
151
|
+
details: 'Run `mainwpcontrol login` or `mainwpcontrol profile use <name>`',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
this.currentProfile = activeProfile;
|
|
155
|
+
return {
|
|
156
|
+
name: 'Active Profile',
|
|
157
|
+
status: 'pass',
|
|
158
|
+
message: `Active: ${activeProfile.name}`,
|
|
159
|
+
details: activeProfile.dashboardUrl,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
return {
|
|
164
|
+
name: 'Active Profile',
|
|
165
|
+
status: 'fail',
|
|
166
|
+
message: 'Failed to load active profile',
|
|
167
|
+
details: error instanceof Error ? error.message : String(error),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check credentials
|
|
173
|
+
*/
|
|
174
|
+
async checkCredentials() {
|
|
175
|
+
if (!this.currentProfile) {
|
|
176
|
+
return {
|
|
177
|
+
name: 'Credentials',
|
|
178
|
+
status: 'fail',
|
|
179
|
+
message: 'No profile to check',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const keychain = getKeychain();
|
|
184
|
+
const password = await keychain.get(this.currentProfile.name);
|
|
185
|
+
if (!password) {
|
|
186
|
+
return {
|
|
187
|
+
name: 'Credentials',
|
|
188
|
+
status: 'fail',
|
|
189
|
+
message: 'No credentials found',
|
|
190
|
+
details: 'Run `mainwpcontrol login` or set MAINWP_APP_PASSWORD environment variable',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// Mask password for display
|
|
194
|
+
const masked = maskPassword(password);
|
|
195
|
+
return {
|
|
196
|
+
name: 'Credentials',
|
|
197
|
+
status: 'pass',
|
|
198
|
+
message: 'Credentials available',
|
|
199
|
+
details: `Application Password: ${masked}`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return {
|
|
204
|
+
name: 'Credentials',
|
|
205
|
+
status: 'fail',
|
|
206
|
+
message: 'Failed to load credentials',
|
|
207
|
+
details: error instanceof Error ? error.message : String(error),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Fetch abilities once for both dashboard connection and API checks
|
|
213
|
+
*/
|
|
214
|
+
async fetchAbilities() {
|
|
215
|
+
if (!this.currentProfile) {
|
|
216
|
+
return {
|
|
217
|
+
abilities: [],
|
|
218
|
+
connectionCheck: {
|
|
219
|
+
name: 'Dashboard Connection',
|
|
220
|
+
status: 'fail',
|
|
221
|
+
message: 'No profile to check',
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
const executor = await this.getExecutor();
|
|
227
|
+
const abilities = await executor.listAbilities();
|
|
228
|
+
return {
|
|
229
|
+
abilities,
|
|
230
|
+
connectionCheck: {
|
|
231
|
+
name: 'Dashboard Connection',
|
|
232
|
+
status: 'pass',
|
|
233
|
+
message: 'Connected to Dashboard',
|
|
234
|
+
details: `${abilities.length} abilities available`,
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
240
|
+
let details = message;
|
|
241
|
+
if (message.includes('ECONNREFUSED')) {
|
|
242
|
+
details = 'Connection refused. Is the Dashboard running?';
|
|
243
|
+
}
|
|
244
|
+
else if (message.includes('ENOTFOUND')) {
|
|
245
|
+
details = 'Host not found. Check the Dashboard URL.';
|
|
246
|
+
}
|
|
247
|
+
else if (message.includes('certificate')) {
|
|
248
|
+
details = 'SSL certificate error. Use --skip-ssl-verify if needed.';
|
|
249
|
+
}
|
|
250
|
+
else if (message.includes('401') || message.includes('Authentication')) {
|
|
251
|
+
details = 'Authentication failed. Check your credentials.';
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
abilities: [],
|
|
255
|
+
connectionCheck: {
|
|
256
|
+
name: 'Dashboard Connection',
|
|
257
|
+
status: 'fail',
|
|
258
|
+
message: 'Cannot connect to Dashboard',
|
|
259
|
+
details,
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Check Abilities API from pre-fetched list
|
|
266
|
+
*/
|
|
267
|
+
checkAbilitiesFromList(abilities) {
|
|
268
|
+
if (abilities.length === 0) {
|
|
269
|
+
return {
|
|
270
|
+
name: 'Abilities API',
|
|
271
|
+
status: 'fail',
|
|
272
|
+
message: 'No abilities available',
|
|
273
|
+
details: 'Dashboard connection may have failed',
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const requiredAbilities = ['list-sites-v1', 'get-site-v1'];
|
|
277
|
+
const missing = requiredAbilities.filter((name) => !abilities.find((a) => a.name === name));
|
|
278
|
+
if (missing.length > 0) {
|
|
279
|
+
return {
|
|
280
|
+
name: 'Abilities API',
|
|
281
|
+
status: 'warn',
|
|
282
|
+
message: 'Some abilities missing',
|
|
283
|
+
details: `Missing: ${missing.join(', ')}`,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const destructive = abilities.filter((a) => a.meta?.annotations?.destructive);
|
|
287
|
+
return {
|
|
288
|
+
name: 'Abilities API',
|
|
289
|
+
status: 'pass',
|
|
290
|
+
message: `${abilities.length} abilities available`,
|
|
291
|
+
details: `${destructive.length} destructive abilities (safety enforced)`,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check LLM provider configuration
|
|
296
|
+
*/
|
|
297
|
+
async checkLLMProvider() {
|
|
298
|
+
const resolution = resolveProviderSelection({
|
|
299
|
+
envProvider: process.env['MAINWP_LLM_PROVIDER'],
|
|
300
|
+
settingsProvider: this.settings.llmProvider,
|
|
301
|
+
timeout: this.settings.timeout,
|
|
302
|
+
});
|
|
303
|
+
if (!resolution.name) {
|
|
304
|
+
// List all possible env vars
|
|
305
|
+
const envVars = Object.entries(PROVIDER_ENV_VARS)
|
|
306
|
+
.map(([name, config]) => ` ${name}: ${config.key}`)
|
|
307
|
+
.join('\n');
|
|
308
|
+
return {
|
|
309
|
+
name: 'LLM Provider',
|
|
310
|
+
status: 'warn',
|
|
311
|
+
message: 'No LLM provider configured',
|
|
312
|
+
details: [...resolution.warnings, 'Chat mode will not work. Set one of these environment variables:'].join('\n') + '\n' +
|
|
313
|
+
envVars,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
if (!resolution.configured) {
|
|
317
|
+
return {
|
|
318
|
+
name: 'LLM Provider',
|
|
319
|
+
status: 'warn',
|
|
320
|
+
message: `${resolution.name} selected but no API key`,
|
|
321
|
+
details: [
|
|
322
|
+
...resolution.warnings,
|
|
323
|
+
`Source: ${resolution.source}`,
|
|
324
|
+
`Set ${PROVIDER_ENV_VARS[resolution.name]?.key ?? 'API key'}`,
|
|
325
|
+
].join('\n'),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
// Mask API key
|
|
329
|
+
const masked = maskApiKey(resolution.config.apiKey);
|
|
330
|
+
return {
|
|
331
|
+
name: 'LLM Provider',
|
|
332
|
+
status: 'pass',
|
|
333
|
+
message: `${resolution.name} configured`,
|
|
334
|
+
details: [`Source: ${resolution.source}`, `API Key: ${masked}`].join('\n'),
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Build summary report
|
|
339
|
+
*/
|
|
340
|
+
buildReport(checks) {
|
|
341
|
+
const summary = {
|
|
342
|
+
passed: checks.filter((c) => c.status === 'pass').length,
|
|
343
|
+
warnings: checks.filter((c) => c.status === 'warn').length,
|
|
344
|
+
failed: checks.filter((c) => c.status === 'fail').length,
|
|
345
|
+
};
|
|
346
|
+
// Ready if no critical failures (connection to dashboard)
|
|
347
|
+
const criticalFailed = checks.some((c) => CRITICAL_CHECKS.includes(c.name) && c.status === 'fail');
|
|
348
|
+
return {
|
|
349
|
+
checks,
|
|
350
|
+
summary,
|
|
351
|
+
ready: !criticalFailed,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Display report in human-readable format
|
|
356
|
+
*/
|
|
357
|
+
displayReport(report, verbose) {
|
|
358
|
+
this.log('\n MainWP Control CLI - System Check\n');
|
|
359
|
+
this.log(' ' + '─'.repeat(40));
|
|
360
|
+
for (const check of report.checks) {
|
|
361
|
+
const icon = this.getStatusIcon(check.status);
|
|
362
|
+
const statusColor = this.getStatusColorCode(check.status);
|
|
363
|
+
this.log(` ${icon} ${check.name}`);
|
|
364
|
+
this.log(` ${color(check.message, statusColor)}`);
|
|
365
|
+
if (verbose && check.details) {
|
|
366
|
+
const detailLines = check.details.split('\n');
|
|
367
|
+
for (const line of detailLines) {
|
|
368
|
+
this.log(` ${color(line, colors.gray)}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
this.log(' ' + '─'.repeat(40));
|
|
373
|
+
// Summary
|
|
374
|
+
this.log(` Summary: ${color(`${report.summary.passed} passed`, colors.green)}, ` +
|
|
375
|
+
`${color(`${report.summary.warnings} warnings`, colors.yellow)}, ` +
|
|
376
|
+
`${color(`${report.summary.failed} failed`, colors.red)}`);
|
|
377
|
+
if (report.ready) {
|
|
378
|
+
this.log(`\n ${color('✓ System is ready', colors.green)}\n`);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
this.log(`\n ${color('✗ System has critical issues', colors.red)}`);
|
|
382
|
+
this.log(' Run with -v for more details\n');
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Get status icon
|
|
387
|
+
*/
|
|
388
|
+
getStatusIcon(status) {
|
|
389
|
+
switch (status) {
|
|
390
|
+
case 'pass':
|
|
391
|
+
return color('✓', colors.green);
|
|
392
|
+
case 'warn':
|
|
393
|
+
return color('⚠', colors.yellow);
|
|
394
|
+
case 'fail':
|
|
395
|
+
return color('✗', colors.red);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Get status color code string
|
|
400
|
+
*/
|
|
401
|
+
getStatusColorCode(status) {
|
|
402
|
+
switch (status) {
|
|
403
|
+
case 'pass':
|
|
404
|
+
return colors.green;
|
|
405
|
+
case 'warn':
|
|
406
|
+
return colors.yellow;
|
|
407
|
+
case 'fail':
|
|
408
|
+
return colors.red;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jobs watch command for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Monitor batch job status with exponential backoff polling.
|
|
5
|
+
* Streams progress updates until job completes or times out.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseCommand } from '../../lib/base-command.js';
|
|
8
|
+
export default class JobsWatch extends BaseCommand {
|
|
9
|
+
static description: string;
|
|
10
|
+
static examples: string[];
|
|
11
|
+
static flags: {
|
|
12
|
+
timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
'initial-delay': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
'max-delay': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
'no-progress': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
20
|
+
};
|
|
21
|
+
static args: {
|
|
22
|
+
id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
23
|
+
};
|
|
24
|
+
run(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Watch job with progress updates
|
|
27
|
+
*/
|
|
28
|
+
private watchJob;
|
|
29
|
+
/**
|
|
30
|
+
* Display progress update
|
|
31
|
+
*/
|
|
32
|
+
private displayProgress;
|
|
33
|
+
/**
|
|
34
|
+
* Calculate progress percentage from processed/total
|
|
35
|
+
*/
|
|
36
|
+
private calculateProgress;
|
|
37
|
+
/**
|
|
38
|
+
* Format status text with color
|
|
39
|
+
*/
|
|
40
|
+
private formatStatusText;
|
|
41
|
+
/**
|
|
42
|
+
* Output final result
|
|
43
|
+
*/
|
|
44
|
+
private outputResult;
|
|
45
|
+
/**
|
|
46
|
+
* Format human-readable output
|
|
47
|
+
*/
|
|
48
|
+
private formatHumanOutput;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/commands/jobs/watch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAe,MAAM,2BAA2B,CAAC;AA0BrE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,SAA8B;IAEhD,MAAM,CAAC,QAAQ,WAYb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;MAmBV;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C1B;;OAEG;YACW,QAAQ;IAyCtB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAuE1B"}
|