@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.
Files changed (204) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +583 -0
  3. package/bin/_exit.js +12 -0
  4. package/bin/dev.js +7 -0
  5. package/bin/run.js +7 -0
  6. package/dist/chat/chat-engine.d.ts +213 -0
  7. package/dist/chat/chat-engine.d.ts.map +1 -0
  8. package/dist/chat/chat-engine.js +636 -0
  9. package/dist/chat/chat-engine.js.map +1 -0
  10. package/dist/chat/index.d.ts +10 -0
  11. package/dist/chat/index.d.ts.map +1 -0
  12. package/dist/chat/index.js +14 -0
  13. package/dist/chat/index.js.map +1 -0
  14. package/dist/chat/providers/anthropic.d.ts +52 -0
  15. package/dist/chat/providers/anthropic.d.ts.map +1 -0
  16. package/dist/chat/providers/anthropic.js +292 -0
  17. package/dist/chat/providers/anthropic.js.map +1 -0
  18. package/dist/chat/providers/gemini.d.ts +52 -0
  19. package/dist/chat/providers/gemini.d.ts.map +1 -0
  20. package/dist/chat/providers/gemini.js +284 -0
  21. package/dist/chat/providers/gemini.js.map +1 -0
  22. package/dist/chat/providers/index.d.ts +19 -0
  23. package/dist/chat/providers/index.d.ts.map +1 -0
  24. package/dist/chat/providers/index.js +23 -0
  25. package/dist/chat/providers/index.js.map +1 -0
  26. package/dist/chat/providers/local.d.ts +37 -0
  27. package/dist/chat/providers/local.d.ts.map +1 -0
  28. package/dist/chat/providers/local.js +130 -0
  29. package/dist/chat/providers/local.js.map +1 -0
  30. package/dist/chat/providers/openai-compatible.d.ts +155 -0
  31. package/dist/chat/providers/openai-compatible.d.ts.map +1 -0
  32. package/dist/chat/providers/openai-compatible.js +264 -0
  33. package/dist/chat/providers/openai-compatible.js.map +1 -0
  34. package/dist/chat/providers/openai.d.ts +24 -0
  35. package/dist/chat/providers/openai.d.ts.map +1 -0
  36. package/dist/chat/providers/openai.js +62 -0
  37. package/dist/chat/providers/openai.js.map +1 -0
  38. package/dist/chat/providers/openrouter.d.ts +26 -0
  39. package/dist/chat/providers/openrouter.d.ts.map +1 -0
  40. package/dist/chat/providers/openrouter.js +65 -0
  41. package/dist/chat/providers/openrouter.js.map +1 -0
  42. package/dist/chat/providers/provider-fetch.d.ts +15 -0
  43. package/dist/chat/providers/provider-fetch.d.ts.map +1 -0
  44. package/dist/chat/providers/provider-fetch.js +35 -0
  45. package/dist/chat/providers/provider-fetch.js.map +1 -0
  46. package/dist/chat/providers/provider.d.ts +214 -0
  47. package/dist/chat/providers/provider.d.ts.map +1 -0
  48. package/dist/chat/providers/provider.js +166 -0
  49. package/dist/chat/providers/provider.js.map +1 -0
  50. package/dist/chat/providers/sse-reader.d.ts +21 -0
  51. package/dist/chat/providers/sse-reader.d.ts.map +1 -0
  52. package/dist/chat/providers/sse-reader.js +48 -0
  53. package/dist/chat/providers/sse-reader.js.map +1 -0
  54. package/dist/chat/system-prompt.d.ts +33 -0
  55. package/dist/chat/system-prompt.d.ts.map +1 -0
  56. package/dist/chat/system-prompt.js +166 -0
  57. package/dist/chat/system-prompt.js.map +1 -0
  58. package/dist/chat/tool-envelope.d.ts +72 -0
  59. package/dist/chat/tool-envelope.d.ts.map +1 -0
  60. package/dist/chat/tool-envelope.js +263 -0
  61. package/dist/chat/tool-envelope.js.map +1 -0
  62. package/dist/commands/abilities/info.d.ts +21 -0
  63. package/dist/commands/abilities/info.d.ts.map +1 -0
  64. package/dist/commands/abilities/info.js +80 -0
  65. package/dist/commands/abilities/info.js.map +1 -0
  66. package/dist/commands/abilities/list.d.ts +19 -0
  67. package/dist/commands/abilities/list.d.ts.map +1 -0
  68. package/dist/commands/abilities/list.js +98 -0
  69. package/dist/commands/abilities/list.js.map +1 -0
  70. package/dist/commands/abilities/run.d.ts +75 -0
  71. package/dist/commands/abilities/run.d.ts.map +1 -0
  72. package/dist/commands/abilities/run.js +468 -0
  73. package/dist/commands/abilities/run.js.map +1 -0
  74. package/dist/commands/chat.d.ts +54 -0
  75. package/dist/commands/chat.d.ts.map +1 -0
  76. package/dist/commands/chat.js +384 -0
  77. package/dist/commands/chat.js.map +1 -0
  78. package/dist/commands/config/show.d.ts +54 -0
  79. package/dist/commands/config/show.d.ts.map +1 -0
  80. package/dist/commands/config/show.js +324 -0
  81. package/dist/commands/config/show.js.map +1 -0
  82. package/dist/commands/doctor.d.ts +77 -0
  83. package/dist/commands/doctor.d.ts.map +1 -0
  84. package/dist/commands/doctor.js +412 -0
  85. package/dist/commands/doctor.js.map +1 -0
  86. package/dist/commands/jobs/watch.d.ts +50 -0
  87. package/dist/commands/jobs/watch.d.ts.map +1 -0
  88. package/dist/commands/jobs/watch.js +269 -0
  89. package/dist/commands/jobs/watch.js.map +1 -0
  90. package/dist/commands/login.d.ts +25 -0
  91. package/dist/commands/login.d.ts.map +1 -0
  92. package/dist/commands/login.js +165 -0
  93. package/dist/commands/login.js.map +1 -0
  94. package/dist/commands/profile/delete.d.ts +22 -0
  95. package/dist/commands/profile/delete.d.ts.map +1 -0
  96. package/dist/commands/profile/delete.js +57 -0
  97. package/dist/commands/profile/delete.js.map +1 -0
  98. package/dist/commands/profile/list.d.ts +19 -0
  99. package/dist/commands/profile/list.d.ts.map +1 -0
  100. package/dist/commands/profile/list.js +53 -0
  101. package/dist/commands/profile/list.js.map +1 -0
  102. package/dist/commands/profile/use.d.ts +22 -0
  103. package/dist/commands/profile/use.d.ts.map +1 -0
  104. package/dist/commands/profile/use.js +46 -0
  105. package/dist/commands/profile/use.js.map +1 -0
  106. package/dist/config/fs-utils.d.ts +14 -0
  107. package/dist/config/fs-utils.d.ts.map +1 -0
  108. package/dist/config/fs-utils.js +31 -0
  109. package/dist/config/fs-utils.js.map +1 -0
  110. package/dist/config/keychain.d.ts +53 -0
  111. package/dist/config/keychain.d.ts.map +1 -0
  112. package/dist/config/keychain.js +175 -0
  113. package/dist/config/keychain.js.map +1 -0
  114. package/dist/config/profile-store.d.ts +85 -0
  115. package/dist/config/profile-store.d.ts.map +1 -0
  116. package/dist/config/profile-store.js +228 -0
  117. package/dist/config/profile-store.js.map +1 -0
  118. package/dist/config/settings.d.ts +71 -0
  119. package/dist/config/settings.d.ts.map +1 -0
  120. package/dist/config/settings.js +151 -0
  121. package/dist/config/settings.js.map +1 -0
  122. package/dist/core/abilities-executor.d.ts +126 -0
  123. package/dist/core/abilities-executor.d.ts.map +1 -0
  124. package/dist/core/abilities-executor.js +264 -0
  125. package/dist/core/abilities-executor.js.map +1 -0
  126. package/dist/core/batch-manager.d.ts +113 -0
  127. package/dist/core/batch-manager.d.ts.map +1 -0
  128. package/dist/core/batch-manager.js +244 -0
  129. package/dist/core/batch-manager.js.map +1 -0
  130. package/dist/core/http-client.d.ts +111 -0
  131. package/dist/core/http-client.d.ts.map +1 -0
  132. package/dist/core/http-client.js +329 -0
  133. package/dist/core/http-client.js.map +1 -0
  134. package/dist/core/safety-controller.d.ts +114 -0
  135. package/dist/core/safety-controller.d.ts.map +1 -0
  136. package/dist/core/safety-controller.js +229 -0
  137. package/dist/core/safety-controller.js.map +1 -0
  138. package/dist/hooks/command-not-found.d.ts +12 -0
  139. package/dist/hooks/command-not-found.d.ts.map +1 -0
  140. package/dist/hooks/command-not-found.js +58 -0
  141. package/dist/hooks/command-not-found.js.map +1 -0
  142. package/dist/index.d.ts +7 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +7 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/lib/base-command.d.ts +123 -0
  147. package/dist/lib/base-command.d.ts.map +1 -0
  148. package/dist/lib/base-command.js +285 -0
  149. package/dist/lib/base-command.js.map +1 -0
  150. package/dist/output/formatter.d.ts +48 -0
  151. package/dist/output/formatter.d.ts.map +1 -0
  152. package/dist/output/formatter.js +138 -0
  153. package/dist/output/formatter.js.map +1 -0
  154. package/dist/output/json-envelope.d.ts +43 -0
  155. package/dist/output/json-envelope.d.ts.map +1 -0
  156. package/dist/output/json-envelope.js +73 -0
  157. package/dist/output/json-envelope.js.map +1 -0
  158. package/dist/utils/audit-logger.d.ts +97 -0
  159. package/dist/utils/audit-logger.d.ts.map +1 -0
  160. package/dist/utils/audit-logger.js +169 -0
  161. package/dist/utils/audit-logger.js.map +1 -0
  162. package/dist/utils/colors.d.ts +29 -0
  163. package/dist/utils/colors.d.ts.map +1 -0
  164. package/dist/utils/colors.js +36 -0
  165. package/dist/utils/colors.js.map +1 -0
  166. package/dist/utils/errors.d.ts +107 -0
  167. package/dist/utils/errors.d.ts.map +1 -0
  168. package/dist/utils/errors.js +149 -0
  169. package/dist/utils/errors.js.map +1 -0
  170. package/dist/utils/exit-codes.d.ts +21 -0
  171. package/dist/utils/exit-codes.d.ts.map +1 -0
  172. package/dist/utils/exit-codes.js +20 -0
  173. package/dist/utils/exit-codes.js.map +1 -0
  174. package/dist/utils/format.d.ts +64 -0
  175. package/dist/utils/format.d.ts.map +1 -0
  176. package/dist/utils/format.js +69 -0
  177. package/dist/utils/format.js.map +1 -0
  178. package/dist/utils/prompt.d.ts +34 -0
  179. package/dist/utils/prompt.d.ts.map +1 -0
  180. package/dist/utils/prompt.js +132 -0
  181. package/dist/utils/prompt.js.map +1 -0
  182. package/dist/utils/retry.d.ts +59 -0
  183. package/dist/utils/retry.d.ts.map +1 -0
  184. package/dist/utils/retry.js +96 -0
  185. package/dist/utils/retry.js.map +1 -0
  186. package/dist/utils/terminal-sanitizer.d.ts +60 -0
  187. package/dist/utils/terminal-sanitizer.d.ts.map +1 -0
  188. package/dist/utils/terminal-sanitizer.js +166 -0
  189. package/dist/utils/terminal-sanitizer.js.map +1 -0
  190. package/dist/validation/input-sanitizer.d.ts +76 -0
  191. package/dist/validation/input-sanitizer.d.ts.map +1 -0
  192. package/dist/validation/input-sanitizer.js +199 -0
  193. package/dist/validation/input-sanitizer.js.map +1 -0
  194. package/dist/validation/schema-validator.d.ts +75 -0
  195. package/dist/validation/schema-validator.d.ts.map +1 -0
  196. package/dist/validation/schema-validator.js +147 -0
  197. package/dist/validation/schema-validator.js.map +1 -0
  198. package/oclif.manifest.json +857 -0
  199. package/package.json +101 -0
  200. package/scripts/completions/README.md +221 -0
  201. package/scripts/completions/mainwpcontrol.bash +193 -0
  202. package/scripts/completions/mainwpcontrol.zsh +267 -0
  203. package/scripts/completions/profile-completer.sh +35 -0
  204. 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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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MainWP Control CLI
3
+ *
4
+ * AI-first command-line interface for managing MainWP Dashboards.
5
+ */
6
+ export { run } from '@oclif/core';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * MainWP Control CLI
3
+ *
4
+ * AI-first command-line interface for managing MainWP Dashboards.
5
+ */
6
+ export { run } from '@oclif/core';
7
+ //# sourceMappingURL=index.js.map
@@ -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"}