@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 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/profile/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,MAAM,CAAC,WAAW,GAAG,+BAA+B,CAAC;IAErD,MAAM,CAAC,QAAQ,GAAG;QAChB,gCAAgC;QAChC,uCAAuC;KACxC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW;KACf,CAAC;IAEF,gCAAgC;IACtB,YAAY;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC;QAEtD,IAAI,CAAC,MAAM,CACT;YACE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,GAAG,EAAE,CAAC,CAAC,YAAY;gBACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,UAAU;aAC9B,CAAC,CAAC;YACH,aAAa,EAAE,UAAU;SAC1B,EACD,GAAG,EAAE;YACH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,+DAA+D,CAAC;YACzE,CAAC;YAED,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAE9C,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC/B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;aACjC,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAEvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile use command for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Switches the active Dashboard profile.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseCommand } from '../../lib/base-command.js';
|
|
7
|
+
export default class ProfileUse extends BaseCommand {
|
|
8
|
+
static description: string;
|
|
9
|
+
static examples: string[];
|
|
10
|
+
static flags: {
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
static args: {
|
|
17
|
+
name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
18
|
+
};
|
|
19
|
+
protected needsProfile(): boolean;
|
|
20
|
+
run(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../../src/commands/profile/use.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAe,MAAM,2BAA2B,CAAC;AAKrE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,WAAW,SAAqC;IAEvD,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;MAEV;IAEF,MAAM,CAAC,IAAI;;MAKT;IAGF,SAAS,CAAC,YAAY,IAAI,OAAO;IAI3B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB3B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile use command for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Switches the active Dashboard profile.
|
|
5
|
+
*/
|
|
6
|
+
import { Args } from '@oclif/core';
|
|
7
|
+
import { BaseCommand, commonFlags } from '../../lib/base-command.js';
|
|
8
|
+
import { getProfileStore } from '../../config/profile-store.js';
|
|
9
|
+
import { formatSuccess } from '../../output/formatter.js';
|
|
10
|
+
import { ConfigError } from '../../utils/errors.js';
|
|
11
|
+
export default class ProfileUse extends BaseCommand {
|
|
12
|
+
static description = 'Switch active Dashboard profile';
|
|
13
|
+
static examples = [
|
|
14
|
+
'<%= config.bin %> profile use production',
|
|
15
|
+
'<%= config.bin %> profile use staging --json',
|
|
16
|
+
];
|
|
17
|
+
static flags = {
|
|
18
|
+
...commonFlags,
|
|
19
|
+
};
|
|
20
|
+
static args = {
|
|
21
|
+
name: Args.string({
|
|
22
|
+
description: 'Profile name to activate',
|
|
23
|
+
required: true,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
// Doesn't need a profile loaded initially
|
|
27
|
+
needsProfile() {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
async run() {
|
|
31
|
+
const { args, flags } = await this.parse(ProfileUse);
|
|
32
|
+
await this.initCommon(flags);
|
|
33
|
+
const profileStore = getProfileStore();
|
|
34
|
+
const profile = await profileStore.get(args.name);
|
|
35
|
+
if (!profile) {
|
|
36
|
+
throw new ConfigError(`Profile not found: ${args.name}. Run \`mainwpcontrol profile list\` to see available profiles.`);
|
|
37
|
+
}
|
|
38
|
+
await profileStore.setActive(args.name);
|
|
39
|
+
this.output({
|
|
40
|
+
profile: args.name,
|
|
41
|
+
url: profile.dashboardUrl,
|
|
42
|
+
username: profile.username,
|
|
43
|
+
}, () => formatSuccess(`Switched to profile: ${args.name}`));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../../src/commands/profile/use.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,WAAW,GAAG,iCAAiC,CAAC;IAEvD,MAAM,CAAC,QAAQ,GAAG;QAChB,0CAA0C;QAC1C,8CAA8C;KAC/C,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW;KACf,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,0BAA0B;YACvC,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,0CAA0C;IAChC,YAAY;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CACnB,sBAAsB,IAAI,CAAC,IAAI,iEAAiE,CACjG,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,CACT;YACE,OAAO,EAAE,IAAI,CAAC,IAAI;YAClB,GAAG,EAAE,OAAO,CAAC,YAAY;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,EACD,GAAG,EAAE,CAAC,aAAa,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CACzD,CAAC;IACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem utilities for secure config file operations
|
|
3
|
+
*
|
|
4
|
+
* Provides atomic write with restricted permissions for config files.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Write content to a file atomically with restricted permissions.
|
|
8
|
+
*
|
|
9
|
+
* Creates the parent directory (mode 0o700) if needed, writes to a
|
|
10
|
+
* temporary file (mode 0o600), then renames. Cleans up the temp file
|
|
11
|
+
* on rename failure.
|
|
12
|
+
*/
|
|
13
|
+
export declare function atomicWriteFile(filePath: string, content: string): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=fs-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/config/fs-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem utilities for secure config file operations
|
|
3
|
+
*
|
|
4
|
+
* Provides atomic write with restricted permissions for config files.
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from 'node:fs';
|
|
7
|
+
import { dirname } from 'node:path';
|
|
8
|
+
/**
|
|
9
|
+
* Write content to a file atomically with restricted permissions.
|
|
10
|
+
*
|
|
11
|
+
* Creates the parent directory (mode 0o700) if needed, writes to a
|
|
12
|
+
* temporary file (mode 0o600), then renames. Cleans up the temp file
|
|
13
|
+
* on rename failure.
|
|
14
|
+
*/
|
|
15
|
+
export async function atomicWriteFile(filePath, content) {
|
|
16
|
+
const dir = dirname(filePath);
|
|
17
|
+
const tmpPath = `${filePath}.tmp`;
|
|
18
|
+
await fs.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
19
|
+
await fs.writeFile(tmpPath, content, {
|
|
20
|
+
encoding: 'utf-8',
|
|
21
|
+
mode: 0o600,
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
await fs.rename(tmpPath, filePath);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
await fs.unlink(tmpPath).catch(() => { });
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=fs-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/config/fs-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,CAAC;IAElC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE;QACnC,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keychain integration for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Secure credential storage with environment variable fallback.
|
|
5
|
+
*
|
|
6
|
+
* Fallback chain:
|
|
7
|
+
* 1. OS keychain (via keytar)
|
|
8
|
+
* 2. Environment variable: MAINWP_APP_PASSWORD
|
|
9
|
+
* 3. Error if neither available
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Result of a credential storage operation
|
|
13
|
+
*/
|
|
14
|
+
export interface KeychainSetResult {
|
|
15
|
+
/** Whether credentials were successfully stored */
|
|
16
|
+
stored: boolean;
|
|
17
|
+
/** Where credentials were stored (or 'none' if storage failed) */
|
|
18
|
+
location: 'keychain' | 'none';
|
|
19
|
+
/** Error message if storage failed */
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Keychain class
|
|
24
|
+
*/
|
|
25
|
+
export declare class Keychain {
|
|
26
|
+
/**
|
|
27
|
+
* Check if keychain is available
|
|
28
|
+
*/
|
|
29
|
+
isAvailable(): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Store a credential
|
|
32
|
+
*
|
|
33
|
+
* @returns Result indicating whether storage succeeded and where credentials are stored
|
|
34
|
+
*/
|
|
35
|
+
set(profileName: string, password: string): Promise<KeychainSetResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Retrieve a credential
|
|
38
|
+
*/
|
|
39
|
+
get(profileName: string): Promise<string | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* Delete a credential
|
|
42
|
+
*/
|
|
43
|
+
delete(profileName: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Get credential or throw
|
|
46
|
+
*/
|
|
47
|
+
getOrThrow(profileName: string): Promise<string>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the keychain instance
|
|
51
|
+
*/
|
|
52
|
+
export declare function getKeychain(): Keychain;
|
|
53
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/config/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgFH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC;;;;OAIG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwB5E;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAwB3D;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAchD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAavD;AAOD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAKtC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keychain integration for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Secure credential storage with environment variable fallback.
|
|
5
|
+
*
|
|
6
|
+
* Fallback chain:
|
|
7
|
+
* 1. OS keychain (via keytar)
|
|
8
|
+
* 2. Environment variable: MAINWP_APP_PASSWORD
|
|
9
|
+
* 3. Error if neither available
|
|
10
|
+
*/
|
|
11
|
+
import { AuthError } from '../utils/errors.js';
|
|
12
|
+
/**
|
|
13
|
+
* Service name for keychain entries
|
|
14
|
+
*/
|
|
15
|
+
const SERVICE_NAME = 'mainwpcontrol';
|
|
16
|
+
/**
|
|
17
|
+
* Environment variable for fallback
|
|
18
|
+
*/
|
|
19
|
+
const ENV_VAR = 'MAINWP_APP_PASSWORD';
|
|
20
|
+
/**
|
|
21
|
+
* Timeout for keytar operations (ms). If macOS shows a blocking keychain
|
|
22
|
+
* dialog, this prevents the CLI from hanging indefinitely.
|
|
23
|
+
*/
|
|
24
|
+
const KEYTAR_TIMEOUT_MS = 5_000;
|
|
25
|
+
function withTimeout(promise, ms) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const timer = setTimeout(() => reject(new Error('Keychain access timed out — the system keychain may be locked or unavailable')), ms);
|
|
28
|
+
timer.unref();
|
|
29
|
+
promise.then((val) => { clearTimeout(timer); resolve(val); }, (err) => { clearTimeout(timer); reject(err); });
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Keytar module (lazy loaded)
|
|
34
|
+
*/
|
|
35
|
+
let keytar = null;
|
|
36
|
+
let keytarAvailable = null;
|
|
37
|
+
/**
|
|
38
|
+
* Try to load keytar
|
|
39
|
+
*/
|
|
40
|
+
async function loadKeytar() {
|
|
41
|
+
if (keytar !== null) {
|
|
42
|
+
return keytar;
|
|
43
|
+
}
|
|
44
|
+
if (keytarAvailable === false) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
// Allow explicit opt-out for CI/containers where native keychain is unavailable
|
|
48
|
+
if (process.env['MAINWPCONTROL_NO_KEYTAR'] === '1') {
|
|
49
|
+
keytarAvailable = false;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const mod = await import('keytar');
|
|
54
|
+
// CJS/ESM interop: on newer Node versions, CJS exports are nested under .default.
|
|
55
|
+
// Check for the expected API on mod first; only unwrap .default if needed.
|
|
56
|
+
keytar = typeof mod.setPassword === 'function'
|
|
57
|
+
? mod
|
|
58
|
+
: typeof mod.default?.setPassword === 'function'
|
|
59
|
+
? mod.default
|
|
60
|
+
: undefined;
|
|
61
|
+
if (!keytar) {
|
|
62
|
+
keytarAvailable = false;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
keytarAvailable = true;
|
|
66
|
+
return keytar;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
keytarAvailable = false;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Keychain class
|
|
75
|
+
*/
|
|
76
|
+
export class Keychain {
|
|
77
|
+
/**
|
|
78
|
+
* Check if keychain is available
|
|
79
|
+
*/
|
|
80
|
+
async isAvailable() {
|
|
81
|
+
const kt = await loadKeytar();
|
|
82
|
+
return kt !== null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Store a credential
|
|
86
|
+
*
|
|
87
|
+
* @returns Result indicating whether storage succeeded and where credentials are stored
|
|
88
|
+
*/
|
|
89
|
+
async set(profileName, password) {
|
|
90
|
+
const kt = await loadKeytar();
|
|
91
|
+
if (kt) {
|
|
92
|
+
try {
|
|
93
|
+
await withTimeout(kt.setPassword(SERVICE_NAME, profileName, password), KEYTAR_TIMEOUT_MS);
|
|
94
|
+
return { stored: true, location: 'keychain' };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const errorMessage = error.message;
|
|
98
|
+
return {
|
|
99
|
+
stored: false,
|
|
100
|
+
location: 'none',
|
|
101
|
+
error: errorMessage,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
stored: false,
|
|
107
|
+
location: 'none',
|
|
108
|
+
error: 'Keychain (keytar) is not available',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Retrieve a credential
|
|
113
|
+
*/
|
|
114
|
+
async get(profileName) {
|
|
115
|
+
// First try keytar
|
|
116
|
+
const kt = await loadKeytar();
|
|
117
|
+
if (kt) {
|
|
118
|
+
try {
|
|
119
|
+
const password = await withTimeout(kt.getPassword(SERVICE_NAME, profileName), KEYTAR_TIMEOUT_MS);
|
|
120
|
+
if (password) {
|
|
121
|
+
return password;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Keytar failed, fall through to env var
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Fallback to environment variable
|
|
129
|
+
const envPassword = process.env[ENV_VAR];
|
|
130
|
+
if (envPassword) {
|
|
131
|
+
return envPassword;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Delete a credential
|
|
137
|
+
*/
|
|
138
|
+
async delete(profileName) {
|
|
139
|
+
const kt = await loadKeytar();
|
|
140
|
+
if (kt) {
|
|
141
|
+
try {
|
|
142
|
+
await withTimeout(kt.deletePassword(SERVICE_NAME, profileName), KEYTAR_TIMEOUT_MS);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (process.stderr.isTTY) {
|
|
146
|
+
console.error(`Warning: Failed to remove credentials from keychain: ${error.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get credential or throw
|
|
153
|
+
*/
|
|
154
|
+
async getOrThrow(profileName) {
|
|
155
|
+
const password = await this.get(profileName);
|
|
156
|
+
if (!password) {
|
|
157
|
+
throw new AuthError(`No credentials found for profile "${profileName}".`, undefined, `Run \`mainwpcontrol login\` or set ${ENV_VAR} environment variable`);
|
|
158
|
+
}
|
|
159
|
+
return password;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Singleton instance
|
|
164
|
+
*/
|
|
165
|
+
let keychainInstance = null;
|
|
166
|
+
/**
|
|
167
|
+
* Get the keychain instance
|
|
168
|
+
*/
|
|
169
|
+
export function getKeychain() {
|
|
170
|
+
if (!keychainInstance) {
|
|
171
|
+
keychainInstance = new Keychain();
|
|
172
|
+
}
|
|
173
|
+
return keychainInstance;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/config/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile store for mainwpcontrol
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple Dashboard connection profiles.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Profile data (credentials stored separately in keychain)
|
|
8
|
+
*/
|
|
9
|
+
export interface Profile {
|
|
10
|
+
/** Profile name (unique identifier) */
|
|
11
|
+
name: string;
|
|
12
|
+
/** Dashboard URL */
|
|
13
|
+
dashboardUrl: string;
|
|
14
|
+
/** WordPress admin username */
|
|
15
|
+
username: string;
|
|
16
|
+
/** Skip SSL verification for this profile */
|
|
17
|
+
skipSSLVerification?: boolean;
|
|
18
|
+
/** Created timestamp */
|
|
19
|
+
createdAt: string;
|
|
20
|
+
/** Last used timestamp */
|
|
21
|
+
lastUsedAt?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Profile store class
|
|
25
|
+
*/
|
|
26
|
+
export declare class ProfileStore {
|
|
27
|
+
private data;
|
|
28
|
+
/**
|
|
29
|
+
* Validate a URL format and protocol
|
|
30
|
+
*/
|
|
31
|
+
private validateUrl;
|
|
32
|
+
/**
|
|
33
|
+
* Validate a profile's required fields and URL format
|
|
34
|
+
*/
|
|
35
|
+
private validateProfile;
|
|
36
|
+
/**
|
|
37
|
+
* Validate entire profiles file structure
|
|
38
|
+
*/
|
|
39
|
+
private validateProfilesFile;
|
|
40
|
+
/**
|
|
41
|
+
* Ensure data is loaded
|
|
42
|
+
*/
|
|
43
|
+
private ensureLoaded;
|
|
44
|
+
/**
|
|
45
|
+
* List all profiles
|
|
46
|
+
*/
|
|
47
|
+
list(): Promise<Profile[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Get the active profile
|
|
50
|
+
*/
|
|
51
|
+
getActive(): Promise<Profile | undefined>;
|
|
52
|
+
/**
|
|
53
|
+
* Get the active profile name
|
|
54
|
+
*/
|
|
55
|
+
getActiveName(): Promise<string | undefined>;
|
|
56
|
+
/**
|
|
57
|
+
* Set the active profile
|
|
58
|
+
*/
|
|
59
|
+
setActive(name: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Get a profile by name
|
|
62
|
+
*/
|
|
63
|
+
get(name: string): Promise<Profile | undefined>;
|
|
64
|
+
/**
|
|
65
|
+
* Save a profile (create or update)
|
|
66
|
+
*/
|
|
67
|
+
save(profile: Profile): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Remove a profile
|
|
70
|
+
*/
|
|
71
|
+
remove(name: string): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Check if a profile exists
|
|
74
|
+
*/
|
|
75
|
+
exists(name: string): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Reload profiles from disk
|
|
78
|
+
*/
|
|
79
|
+
reload(): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the profile store instance
|
|
83
|
+
*/
|
|
84
|
+
export declare function getProfileStore(): ProfileStore;
|
|
85
|
+
//# sourceMappingURL=profile-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-store.d.ts","sourceRoot":"","sources":["../../src/config/profile-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IAEjB,6CAA6C;IAC7C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAElB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgDD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAA6B;IAEzC;;OAEG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;OAEG;YACW,YAAY;IAS1B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAW/C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKlD;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5C;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAKrD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzC;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B;AAOD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
|