@a1st/aix 0.0.3
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/bin/dev.js +13 -0
- package/bin/run.js +5 -0
- package/dist/base-command.d.ts +48 -0
- package/dist/base-command.d.ts.map +1 -0
- package/dist/base-command.js +131 -0
- package/dist/base-command.js.map +1 -0
- package/dist/commands/add/index.d.ts +7 -0
- package/dist/commands/add/index.d.ts.map +1 -0
- package/dist/commands/add/index.js +10 -0
- package/dist/commands/add/index.js.map +1 -0
- package/dist/commands/add/mcp.d.ts +32 -0
- package/dist/commands/add/mcp.d.ts.map +1 -0
- package/dist/commands/add/mcp.js +209 -0
- package/dist/commands/add/mcp.js.map +1 -0
- package/dist/commands/add/prompt.d.ts +18 -0
- package/dist/commands/add/prompt.d.ts.map +1 -0
- package/dist/commands/add/prompt.js +196 -0
- package/dist/commands/add/prompt.js.map +1 -0
- package/dist/commands/add/rule.d.ts +20 -0
- package/dist/commands/add/rule.d.ts.map +1 -0
- package/dist/commands/add/rule.js +207 -0
- package/dist/commands/add/rule.js.map +1 -0
- package/dist/commands/add/skill.d.ts +16 -0
- package/dist/commands/add/skill.d.ts.map +1 -0
- package/dist/commands/add/skill.js +212 -0
- package/dist/commands/add/skill.js.map +1 -0
- package/dist/commands/backups.d.ts +9 -0
- package/dist/commands/backups.d.ts.map +1 -0
- package/dist/commands/backups.js +147 -0
- package/dist/commands/backups.js.map +1 -0
- package/dist/commands/cache/clear.d.ts +8 -0
- package/dist/commands/cache/clear.d.ts.map +1 -0
- package/dist/commands/cache/clear.js +34 -0
- package/dist/commands/cache/clear.js.map +1 -0
- package/dist/commands/cache/index.d.ts +7 -0
- package/dist/commands/cache/index.d.ts.map +1 -0
- package/dist/commands/cache/index.js +10 -0
- package/dist/commands/cache/index.js.map +1 -0
- package/dist/commands/config/get.d.ts +11 -0
- package/dist/commands/config/get.d.ts.map +1 -0
- package/dist/commands/config/get.js +49 -0
- package/dist/commands/config/get.js.map +1 -0
- package/dist/commands/config/index.d.ts +7 -0
- package/dist/commands/config/index.d.ts.map +1 -0
- package/dist/commands/config/index.js +10 -0
- package/dist/commands/config/index.js.map +1 -0
- package/dist/commands/config/set.d.ts +12 -0
- package/dist/commands/config/set.d.ts.map +1 -0
- package/dist/commands/config/set.js +58 -0
- package/dist/commands/config/set.js.map +1 -0
- package/dist/commands/config/show.d.ts +10 -0
- package/dist/commands/config/show.d.ts.map +1 -0
- package/dist/commands/config/show.js +49 -0
- package/dist/commands/config/show.js.map +1 -0
- package/dist/commands/global/cleanup.d.ts +14 -0
- package/dist/commands/global/cleanup.d.ts.map +1 -0
- package/dist/commands/global/cleanup.js +92 -0
- package/dist/commands/global/cleanup.js.map +1 -0
- package/dist/commands/global/index.d.ts +7 -0
- package/dist/commands/global/index.d.ts.map +1 -0
- package/dist/commands/global/index.js +10 -0
- package/dist/commands/global/index.js.map +1 -0
- package/dist/commands/global/list.d.ts +7 -0
- package/dist/commands/global/list.d.ts.map +1 -0
- package/dist/commands/global/list.js +40 -0
- package/dist/commands/global/list.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +110 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +55 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +412 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list/editors.d.ts +7 -0
- package/dist/commands/list/editors.d.ts.map +1 -0
- package/dist/commands/list/editors.js +36 -0
- package/dist/commands/list/editors.js.map +1 -0
- package/dist/commands/list/index.d.ts +12 -0
- package/dist/commands/list/index.d.ts.map +1 -0
- package/dist/commands/list/index.js +60 -0
- package/dist/commands/list/index.js.map +1 -0
- package/dist/commands/list/mcp.d.ts +8 -0
- package/dist/commands/list/mcp.d.ts.map +1 -0
- package/dist/commands/list/mcp.js +45 -0
- package/dist/commands/list/mcp.js.map +1 -0
- package/dist/commands/list/rules.d.ts +7 -0
- package/dist/commands/list/rules.d.ts.map +1 -0
- package/dist/commands/list/rules.js +59 -0
- package/dist/commands/list/rules.js.map +1 -0
- package/dist/commands/list/skills.d.ts +7 -0
- package/dist/commands/list/skills.d.ts.map +1 -0
- package/dist/commands/list/skills.js +34 -0
- package/dist/commands/list/skills.js.map +1 -0
- package/dist/commands/remove/index.d.ts +7 -0
- package/dist/commands/remove/index.d.ts.map +1 -0
- package/dist/commands/remove/index.js +10 -0
- package/dist/commands/remove/index.js.map +1 -0
- package/dist/commands/remove/mcp.d.ts +15 -0
- package/dist/commands/remove/mcp.d.ts.map +1 -0
- package/dist/commands/remove/mcp.js +125 -0
- package/dist/commands/remove/mcp.js.map +1 -0
- package/dist/commands/remove/skill.d.ts +15 -0
- package/dist/commands/remove/skill.d.ts.map +1 -0
- package/dist/commands/remove/skill.js +115 -0
- package/dist/commands/remove/skill.js.map +1 -0
- package/dist/commands/search.d.ts +18 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +221 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +57 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/flags/local.d.ts +8 -0
- package/dist/flags/local.d.ts.map +1 -0
- package/dist/flags/local.js +13 -0
- package/dist/flags/local.js.map +1 -0
- package/dist/flags/scope.d.ts +20 -0
- package/dist/flags/scope.d.ts.map +1 -0
- package/dist/flags/scope.js +30 -0
- package/dist/flags/scope.js.map +1 -0
- package/dist/hooks/postrun/patch-autocomplete.d.ts +18 -0
- package/dist/hooks/postrun/patch-autocomplete.d.ts.map +1 -0
- package/dist/hooks/postrun/patch-autocomplete.js +49 -0
- package/dist/hooks/postrun/patch-autocomplete.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/add-helper.d.ts +49 -0
- package/dist/lib/add-helper.d.ts.map +1 -0
- package/dist/lib/add-helper.js +172 -0
- package/dist/lib/add-helper.js.map +1 -0
- package/dist/lib/delete-helper.d.ts +25 -0
- package/dist/lib/delete-helper.d.ts.map +1 -0
- package/dist/lib/delete-helper.js +76 -0
- package/dist/lib/delete-helper.js.map +1 -0
- package/dist/lib/errors.d.ts +30 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +41 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/help.d.ts +7 -0
- package/dist/lib/help.d.ts.map +1 -0
- package/dist/lib/help.js +39 -0
- package/dist/lib/help.js.map +1 -0
- package/dist/lib/install-helper.d.ts +23 -0
- package/dist/lib/install-helper.d.ts.map +1 -0
- package/dist/lib/install-helper.js +49 -0
- package/dist/lib/install-helper.js.map +1 -0
- package/dist/lib/output.d.ts +26 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +77 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/search/debounce.d.ts +17 -0
- package/dist/lib/search/debounce.d.ts.map +1 -0
- package/dist/lib/search/debounce.js +33 -0
- package/dist/lib/search/debounce.js.map +1 -0
- package/dist/lib/search/index.d.ts +5 -0
- package/dist/lib/search/index.d.ts.map +1 -0
- package/dist/lib/search/index.js +5 -0
- package/dist/lib/search/index.js.map +1 -0
- package/dist/lib/search/registry.d.ts +43 -0
- package/dist/lib/search/registry.d.ts.map +1 -0
- package/dist/lib/search/registry.js +83 -0
- package/dist/lib/search/registry.js.map +1 -0
- package/dist/lib/search/sources/claude-plugins-dev.d.ts +16 -0
- package/dist/lib/search/sources/claude-plugins-dev.d.ts.map +1 -0
- package/dist/lib/search/sources/claude-plugins-dev.js +44 -0
- package/dist/lib/search/sources/claude-plugins-dev.js.map +1 -0
- package/dist/lib/search/sources/index.d.ts +4 -0
- package/dist/lib/search/sources/index.d.ts.map +1 -0
- package/dist/lib/search/sources/index.js +4 -0
- package/dist/lib/search/sources/index.js.map +1 -0
- package/dist/lib/search/sources/mcp-registry.d.ts +14 -0
- package/dist/lib/search/sources/mcp-registry.d.ts.map +1 -0
- package/dist/lib/search/sources/mcp-registry.js +40 -0
- package/dist/lib/search/sources/mcp-registry.js.map +1 -0
- package/dist/lib/search/sources/npm.d.ts +14 -0
- package/dist/lib/search/sources/npm.d.ts.map +1 -0
- package/dist/lib/search/sources/npm.js +42 -0
- package/dist/lib/search/sources/npm.js.map +1 -0
- package/dist/lib/search/types.d.ts +52 -0
- package/dist/lib/search/types.d.ts.map +1 -0
- package/dist/lib/search/types.js +14 -0
- package/dist/lib/search/types.js.map +1 -0
- package/dist/ui/search/components/DetailsPanel.d.ts +9 -0
- package/dist/ui/search/components/DetailsPanel.d.ts.map +1 -0
- package/dist/ui/search/components/DetailsPanel.js +11 -0
- package/dist/ui/search/components/DetailsPanel.js.map +1 -0
- package/dist/ui/search/components/ResultsList.d.ts +14 -0
- package/dist/ui/search/components/ResultsList.d.ts.map +1 -0
- package/dist/ui/search/components/ResultsList.js +32 -0
- package/dist/ui/search/components/ResultsList.js.map +1 -0
- package/dist/ui/search/components/SearchApp.d.ts +4 -0
- package/dist/ui/search/components/SearchApp.d.ts.map +1 -0
- package/dist/ui/search/components/SearchApp.js +61 -0
- package/dist/ui/search/components/SearchApp.js.map +1 -0
- package/dist/ui/search/components/SearchInput.d.ts +12 -0
- package/dist/ui/search/components/SearchInput.d.ts.map +1 -0
- package/dist/ui/search/components/SearchInput.js +14 -0
- package/dist/ui/search/components/SearchInput.js.map +1 -0
- package/dist/ui/search/components/StatusBar.d.ts +10 -0
- package/dist/ui/search/components/StatusBar.d.ts.map +1 -0
- package/dist/ui/search/components/StatusBar.js +13 -0
- package/dist/ui/search/components/StatusBar.js.map +1 -0
- package/dist/ui/search/components/TabBar.d.ts +10 -0
- package/dist/ui/search/components/TabBar.d.ts.map +1 -0
- package/dist/ui/search/components/TabBar.js +6 -0
- package/dist/ui/search/components/TabBar.js.map +1 -0
- package/dist/ui/search/hooks/use-install.d.ts +18 -0
- package/dist/ui/search/hooks/use-install.d.ts.map +1 -0
- package/dist/ui/search/hooks/use-install.js +51 -0
- package/dist/ui/search/hooks/use-install.js.map +1 -0
- package/dist/ui/search/hooks/use-keyboard.d.ts +25 -0
- package/dist/ui/search/hooks/use-keyboard.d.ts.map +1 -0
- package/dist/ui/search/hooks/use-keyboard.js +58 -0
- package/dist/ui/search/hooks/use-keyboard.js.map +1 -0
- package/dist/ui/search/hooks/use-search.d.ts +21 -0
- package/dist/ui/search/hooks/use-search.d.ts.map +1 -0
- package/dist/ui/search/hooks/use-search.js +73 -0
- package/dist/ui/search/hooks/use-search.js.map +1 -0
- package/dist/ui/search/index.d.ts +10 -0
- package/dist/ui/search/index.d.ts.map +1 -0
- package/dist/ui/search/index.js +10 -0
- package/dist/ui/search/index.js.map +1 -0
- package/dist/ui/search/render.d.ts +11 -0
- package/dist/ui/search/render.d.ts.map +1 -0
- package/dist/ui/search/render.js +22 -0
- package/dist/ui/search/render.js.map +1 -0
- package/dist/ui/search/types.d.ts +37 -0
- package/dist/ui/search/types.d.ts.map +1 -0
- package/dist/ui/search/types.js +2 -0
- package/dist/ui/search/types.js.map +1 -0
- package/dist/ui/search/utils/index.d.ts +2 -0
- package/dist/ui/search/utils/index.d.ts.map +1 -0
- package/dist/ui/search/utils/index.js +2 -0
- package/dist/ui/search/utils/index.js.map +1 -0
- package/dist/ui/search/utils/sanitize.d.ts +11 -0
- package/dist/ui/search/utils/sanitize.d.ts.map +1 -0
- package/dist/ui/search/utils/sanitize.js +33 -0
- package/dist/ui/search/utils/sanitize.js.map +1 -0
- package/oclif.manifest.json +1772 -0
- package/package.json +103 -0
- package/theme.json +15 -0
package/bin/dev.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { register } from 'node:module';
|
|
4
|
+
import { dirname } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
|
|
7
|
+
// Resolve ts-exec from this file's directory, not cwd
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
register('@poppinss/ts-exec', new URL(`file://${__dirname}/`));
|
|
10
|
+
|
|
11
|
+
const { execute } = await import('@oclif/core');
|
|
12
|
+
|
|
13
|
+
await execute({ development: true, dir: import.meta.url });
|
package/bin/run.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Command, Interfaces } from '@oclif/core';
|
|
2
|
+
import { ConfigParseError, type LoadedConfig } from '@a1st/aix-core';
|
|
3
|
+
import { Output } from './lib/output.js';
|
|
4
|
+
export type InferredFlags<T extends typeof Command> = Interfaces.InferredFlags<(typeof BaseCommand)['baseFlags'] & T['flags']>;
|
|
5
|
+
export declare abstract class BaseCommand<T extends typeof Command> extends Command {
|
|
6
|
+
static baseFlags: {
|
|
7
|
+
config: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
8
|
+
quiet: Interfaces.BooleanFlag<boolean>;
|
|
9
|
+
json: Interfaces.BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
protected flags: InferredFlags<T>;
|
|
12
|
+
protected output: Output;
|
|
13
|
+
protected loadedConfig?: LoadedConfig;
|
|
14
|
+
init(): Promise<void>;
|
|
15
|
+
protected loadConfig(): Promise<LoadedConfig | undefined>;
|
|
16
|
+
protected requireConfig(): Promise<LoadedConfig>;
|
|
17
|
+
/** Log formatted install results */
|
|
18
|
+
protected logInstallResults(results: Array<{
|
|
19
|
+
message: string;
|
|
20
|
+
success: boolean;
|
|
21
|
+
}>): void;
|
|
22
|
+
/** Log delete operation results */
|
|
23
|
+
protected logDeleteResults(results: Array<{
|
|
24
|
+
editor: string;
|
|
25
|
+
deleted: string[];
|
|
26
|
+
errors: string[];
|
|
27
|
+
}>): void;
|
|
28
|
+
protected catch(error: Error & {
|
|
29
|
+
exitCode?: number;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Display a ConfigParseError in human-readable format.
|
|
33
|
+
*
|
|
34
|
+
* Format:
|
|
35
|
+
* ```
|
|
36
|
+
* ✗ Configuration Error
|
|
37
|
+
*
|
|
38
|
+
* File: ai.local.json
|
|
39
|
+
*
|
|
40
|
+
* ● mcp.playwright
|
|
41
|
+
* Expected object or false, received true
|
|
42
|
+
*
|
|
43
|
+
* Found 2 validation errors.
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
protected displayConfigParseError(error: ConfigParseError): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=base-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../src/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAgC,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,OAAO,IAAI,UAAU,CAAC,aAAa,CAC3E,CAAC,OAAO,WAAW,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAChD,CAAC;AAEF,8BAAsB,WAAW,CAAC,CAAC,SAAS,OAAO,OAAO,CAAE,SAAQ,OAAO;IACxE,MAAM,CAAC,SAAS;;;;MAed;IAEF,SAAS,CAAC,KAAK,EAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACnC,SAAS,CAAC,MAAM,EAAG,MAAM,CAAC;IAC1B,SAAS,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IAEzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAgBlB,UAAU,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;cAiB/C,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC;IAStD,oCAAoC;IACpC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;IAUxF,mCAAmC;IACnC,SAAS,CAAC,gBAAgB,CACvB,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GACvE,IAAI;cAWS,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;CA6BlE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { basename } from 'pathe';
|
|
4
|
+
import { loadConfig as coreLoadConfig, ConfigParseError } from '@a1st/aix-core';
|
|
5
|
+
import { Output } from './lib/output.js';
|
|
6
|
+
export class BaseCommand extends Command {
|
|
7
|
+
static baseFlags = {
|
|
8
|
+
config: Flags.string({
|
|
9
|
+
char: 'c',
|
|
10
|
+
description: 'Path to ai.json config file',
|
|
11
|
+
env: 'AI_JSON_CONFIG',
|
|
12
|
+
}),
|
|
13
|
+
quiet: Flags.boolean({
|
|
14
|
+
char: 'q',
|
|
15
|
+
description: 'Suppress non-essential output',
|
|
16
|
+
default: false,
|
|
17
|
+
}),
|
|
18
|
+
json: Flags.boolean({
|
|
19
|
+
description: 'Output as JSON',
|
|
20
|
+
default: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
flags;
|
|
24
|
+
output;
|
|
25
|
+
loadedConfig;
|
|
26
|
+
async init() {
|
|
27
|
+
await super.init();
|
|
28
|
+
const { flags } = await this.parse({
|
|
29
|
+
flags: this.ctor.flags,
|
|
30
|
+
baseFlags: super.ctor.baseFlags,
|
|
31
|
+
args: this.ctor.args,
|
|
32
|
+
strict: this.ctor.strict,
|
|
33
|
+
});
|
|
34
|
+
this.flags = flags;
|
|
35
|
+
this.output = new Output({
|
|
36
|
+
quiet: this.flags.quiet,
|
|
37
|
+
json: this.flags.json,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async loadConfig() {
|
|
41
|
+
if (this.loadedConfig) {
|
|
42
|
+
return this.loadedConfig;
|
|
43
|
+
}
|
|
44
|
+
const result = await coreLoadConfig(this.flags.config);
|
|
45
|
+
if (result) {
|
|
46
|
+
this.loadedConfig = result;
|
|
47
|
+
// Log when local overrides are applied
|
|
48
|
+
if (result.hasLocalOverrides && result.localPath) {
|
|
49
|
+
this.output.info(`Using local overrides from ${result.localPath}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return this.loadedConfig;
|
|
53
|
+
}
|
|
54
|
+
async requireConfig() {
|
|
55
|
+
const config = await this.loadConfig();
|
|
56
|
+
if (!config) {
|
|
57
|
+
this.error('No ai.json found. Run `aix init` to create one.');
|
|
58
|
+
}
|
|
59
|
+
return config;
|
|
60
|
+
}
|
|
61
|
+
/** Log formatted install results */
|
|
62
|
+
logInstallResults(results) {
|
|
63
|
+
for (const r of results) {
|
|
64
|
+
if (r.success) {
|
|
65
|
+
this.output.info(r.message);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.output.warn(r.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Log delete operation results */
|
|
73
|
+
logDeleteResults(results) {
|
|
74
|
+
for (const result of results) {
|
|
75
|
+
if (result.deleted.length > 0) {
|
|
76
|
+
this.output.info(`Deleted ${result.deleted.length} file(s) from ${result.editor}`);
|
|
77
|
+
}
|
|
78
|
+
for (const err of result.errors) {
|
|
79
|
+
this.output.warn(`Failed to delete: ${err}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async catch(error) {
|
|
84
|
+
// Handle ConfigParseError with human-readable formatting (unless --json)
|
|
85
|
+
if (error instanceof ConfigParseError && error.issues && !this.flags?.json) {
|
|
86
|
+
this.displayConfigParseError(error);
|
|
87
|
+
this.exit(1);
|
|
88
|
+
}
|
|
89
|
+
// Let oclif handle other errors
|
|
90
|
+
return super.catch(error);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Display a ConfigParseError in human-readable format.
|
|
94
|
+
*
|
|
95
|
+
* Format:
|
|
96
|
+
* ```
|
|
97
|
+
* ✗ Configuration Error
|
|
98
|
+
*
|
|
99
|
+
* File: ai.local.json
|
|
100
|
+
*
|
|
101
|
+
* ● mcp.playwright
|
|
102
|
+
* Expected object or false, received true
|
|
103
|
+
*
|
|
104
|
+
* Found 2 validation errors.
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
displayConfigParseError(error) {
|
|
108
|
+
const fileName = basename(error.filePath), issues = error.issues ?? [];
|
|
109
|
+
console.error('');
|
|
110
|
+
console.error(chalk.red('✗') + ' Configuration ' + chalk.red('Error'));
|
|
111
|
+
console.error('');
|
|
112
|
+
console.error(' File: ' + chalk.cyan(fileName));
|
|
113
|
+
console.error('');
|
|
114
|
+
for (const issue of issues) {
|
|
115
|
+
console.error(' ' + chalk.yellow('●') + ' ' + chalk.yellow(issue.path));
|
|
116
|
+
console.error(' ' + issue.message);
|
|
117
|
+
console.error('');
|
|
118
|
+
}
|
|
119
|
+
if (issues.length > 1) {
|
|
120
|
+
console.error(chalk.dim(` Found ${issues.length} validation errors.`));
|
|
121
|
+
}
|
|
122
|
+
else if (issues.length === 1) {
|
|
123
|
+
// Add a hint for single errors about object/false types
|
|
124
|
+
const firstIssue = issues[0];
|
|
125
|
+
if (firstIssue && firstIssue.message.includes('object or false')) {
|
|
126
|
+
console.error(chalk.dim(' Hint: Set to false to disable, or use { "command": "..." } to configure.'));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=base-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../src/base-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SAAkD;IAE7E,OAAgB,MAAM,UAAQ;IAExB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command, Help } from '@oclif/core';
|
|
2
|
+
export default class AddIndex extends Command {
|
|
3
|
+
static description = 'Add skills, MCP servers, or rules to ai.json';
|
|
4
|
+
static hidden = true;
|
|
5
|
+
async run() {
|
|
6
|
+
const help = new Help(this.config);
|
|
7
|
+
await help.showHelp(['add']);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC1C,MAAM,CAAU,WAAW,GAAG,8CAA8C,CAAC;IAE7E,MAAM,CAAU,MAAM,GAAG,IAAI,CAAC;IAE9B,KAAK,CAAC,GAAG;QACN,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base-command.js';
|
|
2
|
+
export default class AddMcp extends BaseCommand<typeof AddMcp> {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
command: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
args: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
url: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
env: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
'no-install': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
local: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Search the MCP Registry for a server by name.
|
|
19
|
+
* If multiple results are found, prompts the user to select one.
|
|
20
|
+
* Returns the server config and name, or undefined if cancelled/not found.
|
|
21
|
+
*/
|
|
22
|
+
private searchRegistry;
|
|
23
|
+
/**
|
|
24
|
+
* Find the first npm package with stdio transport from the packages array.
|
|
25
|
+
*/
|
|
26
|
+
private findNpmPackage;
|
|
27
|
+
/**
|
|
28
|
+
* Build an MCP server config from a registry package.
|
|
29
|
+
*/
|
|
30
|
+
private buildConfigFromPackage;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/commands/add/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW,CAAC,OAAO,MAAM,CAAC;IAC3D,OAAgB,WAAW,SAAkC;IAE7D,OAAgB,QAAQ,WAOtB;IAEF,OAAgB,IAAI;;MAKlB;IAEF,OAAgB,KAAK;;;;;;;MAkBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAyF1B;;;;OAIG;YACW,cAAc;IAmE5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAwBhC"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { select } from '@inquirer/prompts';
|
|
3
|
+
import { BaseCommand } from '../../base-command.js';
|
|
4
|
+
import { installAfterAdd, formatInstallResults } from '../../lib/install-helper.js';
|
|
5
|
+
import { localFlag } from '../../flags/local.js';
|
|
6
|
+
import { updateConfig, updateLocalConfig, getLocalConfigPath } from '@a1st/aix-core';
|
|
7
|
+
import { McpRegistryClient } from '@a1st/mcp-registry-client';
|
|
8
|
+
export default class AddMcp extends BaseCommand {
|
|
9
|
+
static description = 'Add an MCP server to ai.json';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %> playwright',
|
|
12
|
+
'<%= config.bin %> <%= command.id %> filesystem',
|
|
13
|
+
'<%= config.bin %> <%= command.id %> github --command "npx @modelcontextprotocol/server-github"',
|
|
14
|
+
'<%= config.bin %> <%= command.id %> filesystem --command "npx @modelcontextprotocol/server-filesystem" --args "/path/to/dir"',
|
|
15
|
+
'<%= config.bin %> <%= command.id %> custom --url "http://localhost:3000/mcp"',
|
|
16
|
+
'<%= config.bin %> <%= command.id %> github --command "npx @modelcontextprotocol/server-github" --no-install',
|
|
17
|
+
];
|
|
18
|
+
static args = {
|
|
19
|
+
name: Args.string({
|
|
20
|
+
description: 'MCP server name',
|
|
21
|
+
required: true,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
static flags = {
|
|
25
|
+
...localFlag,
|
|
26
|
+
command: Flags.string({
|
|
27
|
+
description: 'Command to run (stdio transport)',
|
|
28
|
+
}),
|
|
29
|
+
args: Flags.string({
|
|
30
|
+
description: 'Command arguments (comma-separated)',
|
|
31
|
+
}),
|
|
32
|
+
url: Flags.string({
|
|
33
|
+
description: 'SSE endpoint URL',
|
|
34
|
+
}),
|
|
35
|
+
env: Flags.string({
|
|
36
|
+
description: 'Environment variables (KEY=value,KEY2=value2)',
|
|
37
|
+
}),
|
|
38
|
+
'no-install': Flags.boolean({
|
|
39
|
+
description: 'Skip installing to editors after adding',
|
|
40
|
+
default: false,
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
async run() {
|
|
44
|
+
const { args, flags } = await this.parse(AddMcp);
|
|
45
|
+
const loaded = await this.loadConfig();
|
|
46
|
+
let serverConfig;
|
|
47
|
+
let serverName = args.name;
|
|
48
|
+
if (flags.command) {
|
|
49
|
+
const config = { command: flags.command };
|
|
50
|
+
if (flags.args) {
|
|
51
|
+
config.args = flags.args.split(',').map((a) => a.trim());
|
|
52
|
+
}
|
|
53
|
+
if (flags.env) {
|
|
54
|
+
config.env = Object.fromEntries(flags.env.split(',').map((e) => {
|
|
55
|
+
const idx = e.indexOf('=');
|
|
56
|
+
if (idx === -1) {
|
|
57
|
+
return [e.trim(), ''];
|
|
58
|
+
}
|
|
59
|
+
return [e.slice(0, idx).trim(), e.slice(idx + 1).trim()];
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
serverConfig = config;
|
|
63
|
+
}
|
|
64
|
+
else if (flags.url) {
|
|
65
|
+
serverConfig = { url: flags.url };
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// No --command or --url provided: search the MCP Registry
|
|
69
|
+
const result = await this.searchRegistry(args.name);
|
|
70
|
+
if (!result) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
serverConfig = result.config;
|
|
74
|
+
serverName = result.name;
|
|
75
|
+
}
|
|
76
|
+
// Determine target file based on --local flag
|
|
77
|
+
if (flags.local) {
|
|
78
|
+
const localPath = loaded ? getLocalConfigPath(loaded.path) : 'ai.local.json';
|
|
79
|
+
await updateLocalConfig(localPath, (config) => ({
|
|
80
|
+
...config,
|
|
81
|
+
mcp: {
|
|
82
|
+
...config.mcp,
|
|
83
|
+
[serverName]: serverConfig,
|
|
84
|
+
},
|
|
85
|
+
}));
|
|
86
|
+
this.output.success(`Added MCP server "${serverName}" to ai.local.json`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
if (!loaded) {
|
|
90
|
+
this.error('No ai.json found. Run `aix init` to create one, or use --local to write to ai.local.json.');
|
|
91
|
+
}
|
|
92
|
+
await updateConfig(loaded.path, (config) => ({
|
|
93
|
+
...config,
|
|
94
|
+
mcp: {
|
|
95
|
+
...config.mcp,
|
|
96
|
+
[serverName]: serverConfig,
|
|
97
|
+
},
|
|
98
|
+
}));
|
|
99
|
+
this.output.success(`Added MCP server "${serverName}"`);
|
|
100
|
+
// Auto-install to configured editors unless --no-install
|
|
101
|
+
if (!flags['no-install']) {
|
|
102
|
+
const installResult = await installAfterAdd({
|
|
103
|
+
configPath: loaded.path,
|
|
104
|
+
scopes: ['mcp'],
|
|
105
|
+
});
|
|
106
|
+
if (installResult.installed) {
|
|
107
|
+
this.logInstallResults(formatInstallResults(installResult.results));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (this.flags.json) {
|
|
112
|
+
this.output.json({
|
|
113
|
+
action: 'add',
|
|
114
|
+
type: 'mcp',
|
|
115
|
+
name: serverName,
|
|
116
|
+
config: serverConfig,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Search the MCP Registry for a server by name.
|
|
122
|
+
* If multiple results are found, prompts the user to select one.
|
|
123
|
+
* Returns the server config and name, or undefined if cancelled/not found.
|
|
124
|
+
*/
|
|
125
|
+
async searchRegistry(query) {
|
|
126
|
+
this.output.startSpinner(`Searching MCP Registry for "${query}"...`);
|
|
127
|
+
const client = new McpRegistryClient();
|
|
128
|
+
let results;
|
|
129
|
+
try {
|
|
130
|
+
const response = await client.search(query);
|
|
131
|
+
results = response.servers ?? [];
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
this.output.stopSpinner(false, 'Failed to search MCP Registry');
|
|
135
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
136
|
+
this.error(`Registry search failed: ${message}`);
|
|
137
|
+
}
|
|
138
|
+
if (results.length === 0) {
|
|
139
|
+
this.output.stopSpinner(false, 'No servers found');
|
|
140
|
+
this.error(`No MCP servers found matching "${query}".\n\n` +
|
|
141
|
+
'You can manually specify a server with:\n' +
|
|
142
|
+
` aix add mcp ${query} --command "npx @some/mcp-server"\n` +
|
|
143
|
+
` aix add mcp ${query} --url "http://localhost:3000/mcp"`);
|
|
144
|
+
}
|
|
145
|
+
this.output.stopSpinner(true, `Found ${results.length} server(s)`);
|
|
146
|
+
// Select server (prompt if multiple)
|
|
147
|
+
let selected;
|
|
148
|
+
if (results.length === 1) {
|
|
149
|
+
selected = results[0];
|
|
150
|
+
this.output.info(`Using: ${selected.server.name}`);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
selected = await select({
|
|
154
|
+
message: 'Multiple servers found. Which one do you want to add?',
|
|
155
|
+
choices: results.map((r) => ({
|
|
156
|
+
name: `${r.server.name} - ${r.server.description}`,
|
|
157
|
+
value: r,
|
|
158
|
+
})),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// Find an npm package with stdio transport
|
|
162
|
+
const pkg = this.findNpmPackage(selected.server.packages);
|
|
163
|
+
if (!pkg) {
|
|
164
|
+
this.error(`Server "${selected.server.name}" has no compatible npm package with stdio transport.\n\n` +
|
|
165
|
+
'You may need to configure it manually with --command or --url.');
|
|
166
|
+
}
|
|
167
|
+
// Build the config from the registry package info
|
|
168
|
+
const config = this.buildConfigFromPackage(pkg);
|
|
169
|
+
// Use a friendly name (last part of reverse-DNS name)
|
|
170
|
+
const nameParts = selected.server.name.split('/');
|
|
171
|
+
const friendlyName = nameParts[nameParts.length - 1] ?? selected.server.name;
|
|
172
|
+
return { config, name: friendlyName };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Find the first npm package with stdio transport from the packages array.
|
|
176
|
+
*/
|
|
177
|
+
findNpmPackage(packages) {
|
|
178
|
+
if (!packages) {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
return packages.find((p) => p.registryType === 'npm' && p.transport.type === 'stdio');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Build an MCP server config from a registry package.
|
|
185
|
+
*/
|
|
186
|
+
buildConfigFromPackage(pkg) {
|
|
187
|
+
const config = {
|
|
188
|
+
command: `npx ${pkg.identifier}${pkg.version ? `@${pkg.version}` : ''}`,
|
|
189
|
+
};
|
|
190
|
+
// Add environment variables if specified
|
|
191
|
+
if (pkg.environmentVariables && pkg.environmentVariables.length > 0) {
|
|
192
|
+
const env = {};
|
|
193
|
+
for (const envVar of pkg.environmentVariables) {
|
|
194
|
+
// Use default value, or placeholder for required secrets
|
|
195
|
+
if (envVar.default) {
|
|
196
|
+
env[envVar.name] = envVar.default;
|
|
197
|
+
}
|
|
198
|
+
else if (envVar.isRequired) {
|
|
199
|
+
env[envVar.name] = envVar.isSecret ? '<YOUR_SECRET>' : '<REQUIRED>';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (Object.keys(env).length > 0) {
|
|
203
|
+
config.env = env;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return config;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/add/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseCommand } from '../../base-command.js';
|
|
2
|
+
export default class AddPrompt extends BaseCommand<typeof AddPrompt> {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
source: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'argument-hint': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
ref: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
'no-install': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
local: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/commands/add/prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAsHpD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW,CAAC,OAAO,SAAS,CAAC;IACjE,OAAgB,WAAW,SAAqC;IAEhE,OAAgB,QAAQ,WAOtB;IAEF,OAAgB,IAAI;;MAKlB;IAEF,OAAgB,KAAK;;;;;;;MAsBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsF5B"}
|