@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,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safety Controller for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Enforces the destructive action protocol defined in PLAN.md:
|
|
5
|
+
* - Safety check happens BEFORE any network call
|
|
6
|
+
* - dry_run and confirm are mutually exclusive
|
|
7
|
+
* - Destructive abilities require preview first
|
|
8
|
+
*
|
|
9
|
+
* INVARIANT: AI is the primary interaction surface, NOT the execution authority.
|
|
10
|
+
*/
|
|
11
|
+
import { MutualExclusionError, ConfirmationRequiredError } from '../utils/errors.js';
|
|
12
|
+
/**
|
|
13
|
+
* Safety Controller class
|
|
14
|
+
*
|
|
15
|
+
* SAFETY RULES (HARD - from PLAN.md §2.1):
|
|
16
|
+
* 1. If destructive === true:
|
|
17
|
+
* - dry_run: true → preview mode
|
|
18
|
+
* - confirm: true → execution mode
|
|
19
|
+
* - Neither → error mainwp_confirmation_required
|
|
20
|
+
* 2. dry_run and confirm are MUTUALLY EXCLUSIVE
|
|
21
|
+
* 3. Safety check happens BEFORE any network call
|
|
22
|
+
*/
|
|
23
|
+
/** Default annotations for abilities without explicit metadata */
|
|
24
|
+
const DEFAULT_ANNOTATIONS = {
|
|
25
|
+
readonly: false,
|
|
26
|
+
destructive: false,
|
|
27
|
+
idempotent: false,
|
|
28
|
+
};
|
|
29
|
+
export class SafetyController {
|
|
30
|
+
/**
|
|
31
|
+
* Classify an ability's safety requirements
|
|
32
|
+
*
|
|
33
|
+
* Safety classification derives ONLY from ability annotations.
|
|
34
|
+
* No heuristics are permitted.
|
|
35
|
+
*/
|
|
36
|
+
classify(ability) {
|
|
37
|
+
const annotations = this.validateAnnotations(ability.meta?.annotations ?? DEFAULT_ANNOTATIONS);
|
|
38
|
+
// SECURITY: Defense-in-depth — force destructive classification for
|
|
39
|
+
// abilities whose names match known-destructive patterns, regardless
|
|
40
|
+
// of what the API reports. Prevents a compromised server from
|
|
41
|
+
// downgrading destructive abilities to bypass the safety flow.
|
|
42
|
+
const destructive = annotations.destructive || this.isKnownDestructivePattern(ability.name);
|
|
43
|
+
const readonly_ = destructive ? false : annotations.readonly;
|
|
44
|
+
return {
|
|
45
|
+
isDestructive: destructive,
|
|
46
|
+
isReadOnly: readonly_,
|
|
47
|
+
isIdempotent: annotations.idempotent,
|
|
48
|
+
requiresSafetyFlow: destructive && !readonly_,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Known-destructive ability name patterns.
|
|
53
|
+
* These abilities require the safety flow regardless of API-reported annotations.
|
|
54
|
+
*/
|
|
55
|
+
static DESTRUCTIVE_PATTERNS = [
|
|
56
|
+
/^(?:mainwp\/)?delete-/,
|
|
57
|
+
/^(?:mainwp\/)?disconnect-/,
|
|
58
|
+
/^(?:mainwp\/)?suspend-/,
|
|
59
|
+
/^(?:mainwp\/)?deactivate-/,
|
|
60
|
+
/^(?:mainwp\/)?remove-/,
|
|
61
|
+
/^(?:mainwp\/)?run-updates-/,
|
|
62
|
+
/^(?:mainwp\/)?update-all-/,
|
|
63
|
+
];
|
|
64
|
+
isKnownDestructivePattern(name) {
|
|
65
|
+
return SafetyController.DESTRUCTIVE_PATTERNS.some(pattern => pattern.test(name));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validate annotation fields and resolve contradictions.
|
|
69
|
+
*
|
|
70
|
+
* - Non-boolean values fall back to safe defaults.
|
|
71
|
+
* - Contradictory annotations (destructive + readonly) → warn and treat as destructive.
|
|
72
|
+
*/
|
|
73
|
+
validateAnnotations(annotations) {
|
|
74
|
+
const defaults = DEFAULT_ANNOTATIONS;
|
|
75
|
+
const destructive = typeof annotations.destructive === 'boolean'
|
|
76
|
+
? annotations.destructive : defaults.destructive;
|
|
77
|
+
let readonly_ = typeof annotations.readonly === 'boolean'
|
|
78
|
+
? annotations.readonly : defaults.readonly;
|
|
79
|
+
const idempotent = typeof annotations.idempotent === 'boolean'
|
|
80
|
+
? annotations.idempotent : defaults.idempotent;
|
|
81
|
+
// Contradictory: both destructive and readonly — treat as destructive (safe default)
|
|
82
|
+
if (destructive && readonly_) {
|
|
83
|
+
console.error('Warning: Ability has contradictory annotations (destructive + readonly). ' +
|
|
84
|
+
'Treating as destructive for safety.');
|
|
85
|
+
readonly_ = false;
|
|
86
|
+
}
|
|
87
|
+
return { destructive, readonly: readonly_, idempotent };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if an ability requires the safety flow
|
|
91
|
+
*/
|
|
92
|
+
requiresSafetyFlow(ability) {
|
|
93
|
+
return this.classify(ability).requiresSafetyFlow;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate execution flags BEFORE any network call
|
|
97
|
+
*
|
|
98
|
+
* @throws MutualExclusionError if dry_run and confirm are both true
|
|
99
|
+
* @throws InputError if destructive ability has neither flag
|
|
100
|
+
*/
|
|
101
|
+
validateExecutionFlags(ability, dryRun, confirm) {
|
|
102
|
+
// RULE 2: Mutual exclusion check
|
|
103
|
+
if (dryRun === true && confirm === true) {
|
|
104
|
+
throw new MutualExclusionError('dry_run and confirm are mutually exclusive', 'Use either --dry-run (preview) or --confirm (execute), not both');
|
|
105
|
+
}
|
|
106
|
+
const classification = this.classify(ability);
|
|
107
|
+
// RULE 1: Destructive abilities require explicit flag
|
|
108
|
+
if (classification.requiresSafetyFlow) {
|
|
109
|
+
if (dryRun !== true && confirm !== true) {
|
|
110
|
+
throw new ConfirmationRequiredError(`Destructive ability "${ability.name}" requires --dry-run (preview) or --confirm (execute).`, undefined, 'Use --dry-run to preview changes or --confirm to execute');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Determine execution intent from flags
|
|
116
|
+
*/
|
|
117
|
+
determineIntent(dryRun, confirm) {
|
|
118
|
+
if (dryRun === true) {
|
|
119
|
+
return { mode: 'preview' };
|
|
120
|
+
}
|
|
121
|
+
if (confirm === true) {
|
|
122
|
+
return { mode: 'execute' };
|
|
123
|
+
}
|
|
124
|
+
return { mode: 'auto' };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if execution should proceed directly (without preview)
|
|
128
|
+
*
|
|
129
|
+
* Returns true for:
|
|
130
|
+
* - Read-only abilities
|
|
131
|
+
* - Explicit confirm flag
|
|
132
|
+
* - Non-destructive abilities
|
|
133
|
+
*/
|
|
134
|
+
shouldExecuteDirectly(ability, dryRun, confirm) {
|
|
135
|
+
const classification = this.classify(ability);
|
|
136
|
+
// Read-only abilities always execute directly
|
|
137
|
+
if (classification.isReadOnly) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
// Explicit confirm flag means execute
|
|
141
|
+
if (confirm === true) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
// Non-destructive abilities execute directly
|
|
145
|
+
if (!classification.requiresSafetyFlow) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
// Preview mode
|
|
149
|
+
if (dryRun === true) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
// Destructive without flags - this should have been caught by validateExecutionFlags
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Format a preview result from API response
|
|
157
|
+
*/
|
|
158
|
+
formatPreviewResult(ability, input, apiResult) {
|
|
159
|
+
// Extract affected items from result
|
|
160
|
+
const data = apiResult.data;
|
|
161
|
+
const affected = this.extractAffectedItems(data);
|
|
162
|
+
return {
|
|
163
|
+
affected,
|
|
164
|
+
summary: this.generatePreviewSummary(ability, affected),
|
|
165
|
+
requiresApproval: true,
|
|
166
|
+
abilityName: ability.name,
|
|
167
|
+
input,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extract affected items from API preview response
|
|
172
|
+
*/
|
|
173
|
+
extractAffectedItems(data) {
|
|
174
|
+
if (!data) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
// Common patterns for affected items
|
|
178
|
+
if (Array.isArray(data['affected'])) {
|
|
179
|
+
return data['affected'];
|
|
180
|
+
}
|
|
181
|
+
if (Array.isArray(data['items'])) {
|
|
182
|
+
return data['items'];
|
|
183
|
+
}
|
|
184
|
+
if (Array.isArray(data['sites'])) {
|
|
185
|
+
return data['sites'];
|
|
186
|
+
}
|
|
187
|
+
if (Array.isArray(data['data'])) {
|
|
188
|
+
return data['data'];
|
|
189
|
+
}
|
|
190
|
+
// Single item preview
|
|
191
|
+
if (data['preview']) {
|
|
192
|
+
return [data['preview']];
|
|
193
|
+
}
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
/** Ability name keywords → past-tense action verbs */
|
|
197
|
+
static ACTION_VERBS = [
|
|
198
|
+
['delete', 'deleted'], ['remove', 'removed'], ['update', 'updated'],
|
|
199
|
+
['deactivate', 'deactivated'], ['activate', 'activated'],
|
|
200
|
+
['suspend', 'suspended'], ['disconnect', 'disconnected'],
|
|
201
|
+
];
|
|
202
|
+
/**
|
|
203
|
+
* Generate human-readable preview summary
|
|
204
|
+
*/
|
|
205
|
+
generatePreviewSummary(ability, affected) {
|
|
206
|
+
const count = affected.length;
|
|
207
|
+
const name = ability.name.toLowerCase();
|
|
208
|
+
const action = SafetyController.ACTION_VERBS.find(([k]) => name.includes(k))?.[1] ?? 'affected';
|
|
209
|
+
if (count === 0)
|
|
210
|
+
return `No items would be ${action}.`;
|
|
211
|
+
if (count === 1)
|
|
212
|
+
return `1 item would be ${action}.`;
|
|
213
|
+
return `${count} items would be ${action}.`;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Singleton instance
|
|
218
|
+
*/
|
|
219
|
+
let instance = null;
|
|
220
|
+
/**
|
|
221
|
+
* Get the safety controller singleton
|
|
222
|
+
*/
|
|
223
|
+
export function getSafetyController() {
|
|
224
|
+
if (!instance) {
|
|
225
|
+
instance = new SafetyController();
|
|
226
|
+
}
|
|
227
|
+
return instance;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=safety-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety-controller.js","sourceRoot":"","sources":["../../src/core/safety-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oclif hook: command_not_found
|
|
3
|
+
*
|
|
4
|
+
* Provides helpful suggestions when a user enters an unknown command:
|
|
5
|
+
* 1. Ability names typed as commands → suggest `abilities run <name>`
|
|
6
|
+
* 2. Typos in known commands → "Did you mean ...?"
|
|
7
|
+
* 3. Everything else → generic error with help hint
|
|
8
|
+
*/
|
|
9
|
+
import { Hook } from '@oclif/core';
|
|
10
|
+
declare const hook: Hook<'command_not_found'>;
|
|
11
|
+
export default hook;
|
|
12
|
+
//# sourceMappingURL=command-not-found.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-not-found.d.ts","sourceRoot":"","sources":["../../src/hooks/command-not-found.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAuBnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,mBAAmB,CA2CnC,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oclif hook: command_not_found
|
|
3
|
+
*
|
|
4
|
+
* Provides helpful suggestions when a user enters an unknown command:
|
|
5
|
+
* 1. Ability names typed as commands → suggest `abilities run <name>`
|
|
6
|
+
* 2. Typos in known commands → "Did you mean ...?"
|
|
7
|
+
* 3. Everything else → generic error with help hint
|
|
8
|
+
*/
|
|
9
|
+
import { ExitCode } from '../utils/exit-codes.js';
|
|
10
|
+
/** Simple Levenshtein distance (no external deps) */
|
|
11
|
+
function levenshtein(a, b) {
|
|
12
|
+
const m = a.length;
|
|
13
|
+
const n = b.length;
|
|
14
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
15
|
+
for (let i = 0; i <= m; i++)
|
|
16
|
+
dp[i][0] = i;
|
|
17
|
+
for (let j = 0; j <= n; j++)
|
|
18
|
+
dp[0][j] = j;
|
|
19
|
+
for (let i = 1; i <= m; i++) {
|
|
20
|
+
for (let j = 1; j <= n; j++) {
|
|
21
|
+
dp[i][j] =
|
|
22
|
+
a[i - 1] === b[j - 1]
|
|
23
|
+
? dp[i - 1][j - 1]
|
|
24
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return dp[m][n];
|
|
28
|
+
}
|
|
29
|
+
const hook = async function ({ id, config }) {
|
|
30
|
+
// Strip common prefix mistakes (e.g., "mainwp/list-updates-v1")
|
|
31
|
+
const name = id.replace(/^mainwp\//, '');
|
|
32
|
+
// Ability name pattern: suggest abilities run
|
|
33
|
+
if (/-v\d+$/.test(name)) {
|
|
34
|
+
const suggestion = `${config.bin} abilities run ${name}`;
|
|
35
|
+
this.error(`"${id}" is not a command. It looks like an ability name.\n\nRun it with:\n ${suggestion}`, { exit: ExitCode.INPUT_ERROR });
|
|
36
|
+
}
|
|
37
|
+
// Find closest matching command using Levenshtein distance
|
|
38
|
+
const commandIDs = [
|
|
39
|
+
...config.commandIDs,
|
|
40
|
+
...config.commands.flatMap((c) => c.aliases),
|
|
41
|
+
].filter((cid) => !config.commands.find((cmd) => cmd.id === cid || cmd.aliases?.includes(cid))?.hidden);
|
|
42
|
+
if (commandIDs.length > 0) {
|
|
43
|
+
const matches = commandIDs
|
|
44
|
+
.map((cmd) => ({ cmd, distance: levenshtein(id, cmd) }))
|
|
45
|
+
.sort((a, b) => a.distance - b.distance);
|
|
46
|
+
const best = matches[0];
|
|
47
|
+
const threshold = Math.max(Math.ceil(id.length * 0.4), 3);
|
|
48
|
+
if (best && best.distance <= threshold) {
|
|
49
|
+
// Convert oclif internal separator (:) to display format (space)
|
|
50
|
+
const displayCmd = best.cmd.replace(/:/g, ' ');
|
|
51
|
+
this.error(`"${id.replace(/:/g, ' ')}" is not a ${config.bin} command. Did you mean "${displayCmd}"?\n\nRun ${config.bin} help for a list of available commands.`, { exit: ExitCode.INPUT_ERROR });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Fallback: no close match found
|
|
55
|
+
this.error(`command "${id.replace(/:/g, ' ')}" not found. Run ${config.bin} help for a list of available commands.`, { exit: ExitCode.INPUT_ERROR });
|
|
56
|
+
};
|
|
57
|
+
export default hook;
|
|
58
|
+
//# sourceMappingURL=command-not-found.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-not-found.js","sourceRoot":"","sources":["../../src/hooks/command-not-found.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base command for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Provides common functionality for all CLI commands:
|
|
5
|
+
* - Profile and authentication management
|
|
6
|
+
* - JSON/human output handling
|
|
7
|
+
* - AbilitiesExecutor initialization
|
|
8
|
+
*/
|
|
9
|
+
import { Command, Interfaces } from '@oclif/core';
|
|
10
|
+
import { type Profile } from '../config/profile-store.js';
|
|
11
|
+
import { type ResolvedSettings, type Settings } from '../config/settings.js';
|
|
12
|
+
import { type AbilitiesExecutor } from '../core/abilities-executor.js';
|
|
13
|
+
import { type BatchManager } from '../core/batch-manager.js';
|
|
14
|
+
/**
|
|
15
|
+
* Common flags available to all commands
|
|
16
|
+
*/
|
|
17
|
+
export declare const commonFlags: {
|
|
18
|
+
json: Interfaces.BooleanFlag<boolean>;
|
|
19
|
+
quiet: Interfaces.BooleanFlag<boolean>;
|
|
20
|
+
profile: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
21
|
+
debug: Interfaces.BooleanFlag<boolean>;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Parsed flags type helper
|
|
25
|
+
*/
|
|
26
|
+
type CommonFlags = Interfaces.InferredFlags<typeof commonFlags>;
|
|
27
|
+
/**
|
|
28
|
+
* Base command class
|
|
29
|
+
*
|
|
30
|
+
* All mainwpcontrol commands should extend this class.
|
|
31
|
+
*/
|
|
32
|
+
export declare abstract class BaseCommand extends Command {
|
|
33
|
+
/**
|
|
34
|
+
* Current active profile
|
|
35
|
+
*/
|
|
36
|
+
protected currentProfile: Profile | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Whether to output JSON
|
|
39
|
+
*/
|
|
40
|
+
protected jsonOutput: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Debug mode flag
|
|
43
|
+
*/
|
|
44
|
+
protected debugMode: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Whether debug was explicitly requested on the CLI.
|
|
47
|
+
*/
|
|
48
|
+
protected explicitDebugMode: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Quiet mode flag — suppress stdout output (exit code only)
|
|
51
|
+
*/
|
|
52
|
+
protected quietMode: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Raw settings from settings.json
|
|
55
|
+
*/
|
|
56
|
+
protected rawSettings: Settings;
|
|
57
|
+
/**
|
|
58
|
+
* Validated and normalized settings
|
|
59
|
+
*/
|
|
60
|
+
protected settings: ResolvedSettings;
|
|
61
|
+
/**
|
|
62
|
+
* Cached executor instance
|
|
63
|
+
*/
|
|
64
|
+
private executor;
|
|
65
|
+
/**
|
|
66
|
+
* Cached batch manager instance
|
|
67
|
+
*/
|
|
68
|
+
private batchManagerInstance;
|
|
69
|
+
/**
|
|
70
|
+
* Whether this command needs a profile to be loaded.
|
|
71
|
+
* Override to return false for commands like `login` that don't need a profile.
|
|
72
|
+
*/
|
|
73
|
+
protected needsProfile(): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Initialize common functionality.
|
|
76
|
+
* Call this at the start of each command's run() method.
|
|
77
|
+
*/
|
|
78
|
+
protected initCommon(flags: CommonFlags): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Load the specified or active profile
|
|
81
|
+
*/
|
|
82
|
+
private loadProfile;
|
|
83
|
+
/**
|
|
84
|
+
* Get the AbilitiesExecutor instance
|
|
85
|
+
*/
|
|
86
|
+
protected getExecutor(): Promise<AbilitiesExecutor>;
|
|
87
|
+
/**
|
|
88
|
+
* Get the BatchManager instance (lazy, cached)
|
|
89
|
+
*/
|
|
90
|
+
protected getBatchManager(): Promise<BatchManager>;
|
|
91
|
+
/**
|
|
92
|
+
* Build common transport configuration using profile-scoped settings first.
|
|
93
|
+
*/
|
|
94
|
+
protected getTransportConfig(): {
|
|
95
|
+
skipSSLVerification: boolean;
|
|
96
|
+
allowInsecureHttp: boolean;
|
|
97
|
+
timeout: number;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Emit redacted debug output to stderr.
|
|
101
|
+
*/
|
|
102
|
+
protected debugLog(message: string, context?: Record<string, unknown>): void;
|
|
103
|
+
private shouldEmitDebug;
|
|
104
|
+
private redactDebugContext;
|
|
105
|
+
/**
|
|
106
|
+
* Output data in JSON or human-readable format.
|
|
107
|
+
*
|
|
108
|
+
* @param data - The data to output (used for JSON mode)
|
|
109
|
+
* @param humanFormatter - Optional function that returns human-readable string
|
|
110
|
+
*/
|
|
111
|
+
protected output<T>(data: T, humanFormatter?: () => string): void;
|
|
112
|
+
/**
|
|
113
|
+
* Handle errors with appropriate exit codes
|
|
114
|
+
*/
|
|
115
|
+
protected catch(err: Error & {
|
|
116
|
+
exitCode?: number;
|
|
117
|
+
oclif?: {
|
|
118
|
+
exit?: number;
|
|
119
|
+
};
|
|
120
|
+
}): Promise<void>;
|
|
121
|
+
}
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=base-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/lib/base-command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAS,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMjF;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;CAkBvB,CAAC;AAEF;;GAEG;AACH,KAAK,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,WAAW,CAAC,CAAC;AAEhE;;;;GAIG;AACH,8BAAsB,WAAY,SAAQ,OAAO;IAC/C;;OAEG;IACH,SAAS,CAAC,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IAE9C;;OAEG;IACH,SAAS,CAAC,UAAU,UAAS;IAE7B;;OAEG;IACH,SAAS,CAAC,SAAS,UAAS;IAE5B;;OAEG;IACH,SAAS,CAAC,iBAAiB,UAAS;IAEpC;;OAEG;IACH,SAAS,CAAC,SAAS,UAAS;IAE5B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAM;IAErC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAOlC;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAA2B;IAEvD;;;OAGG;IACH,SAAS,CAAC,YAAY,IAAI,OAAO;IAIjC;;;OAGG;cACa,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB7D;;OAEG;YACW,WAAW;IAiCzB;;OAEG;cACa,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAgCzD;;OAEG;cACa,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC;IAgCxD;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI;QAC9B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,iBAAiB,EAAE,OAAO,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC;KACjB;IASD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAa5E,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,kBAAkB;IA0B1B;;;;;OAKG;IACH,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI;IAcjE;;OAEG;cACa,KAAK,CAAC,GAAG,EAAE,KAAK,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBpG"}
|