@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../../src/lib/search/debounce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple debounce utility for search API calls.
|
|
3
|
+
* Ensures we don't hammer APIs with rapid successive requests.
|
|
4
|
+
*/
|
|
5
|
+
const lastCallTimes = new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Debounce delay in milliseconds per source.
|
|
8
|
+
*/
|
|
9
|
+
const DEBOUNCE_MS = 300;
|
|
10
|
+
/**
|
|
11
|
+
* Ensures a minimum delay between calls to the same source.
|
|
12
|
+
* If called too quickly, waits until the debounce period has passed.
|
|
13
|
+
*
|
|
14
|
+
* @param sourceId - Unique identifier for the source being called
|
|
15
|
+
* @returns Promise that resolves when it's safe to make the call
|
|
16
|
+
*/
|
|
17
|
+
export async function debounce(sourceId) {
|
|
18
|
+
const now = Date.now(), lastCall = lastCallTimes.get(sourceId);
|
|
19
|
+
if (lastCall !== undefined) {
|
|
20
|
+
const elapsed = now - lastCall, remaining = DEBOUNCE_MS - elapsed;
|
|
21
|
+
if (remaining > 0) {
|
|
22
|
+
await new Promise((resolve) => setTimeout(resolve, remaining));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
lastCallTimes.set(sourceId, Date.now());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clear debounce state (useful for testing).
|
|
29
|
+
*/
|
|
30
|
+
export function clearDebounceState() {
|
|
31
|
+
lastCallTimes.clear();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=debounce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../../src/lib/search/debounce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAChB,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,GAAG,GAAG,QAAQ,EACxB,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;QAExC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAC/B,aAAa,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/search/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/search/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { SearchSource, SearchResult, SearchType, SearchOptions, ExperimentalSourceId } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for creating a SearchRegistry.
|
|
4
|
+
*/
|
|
5
|
+
export interface SearchRegistryOptions {
|
|
6
|
+
/** NPM registry URL for skill searches */
|
|
7
|
+
npmRegistry?: string;
|
|
8
|
+
/** Set of experimental source IDs to enable */
|
|
9
|
+
experimentalSources?: Set<ExperimentalSourceId>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Registry that manages multiple search sources and aggregates results.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SearchRegistry {
|
|
15
|
+
private readonly sources;
|
|
16
|
+
constructor(options?: SearchRegistryOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Get all registered sources.
|
|
19
|
+
*/
|
|
20
|
+
getSources(): readonly SearchSource[];
|
|
21
|
+
/**
|
|
22
|
+
* Get sources that support a specific search type.
|
|
23
|
+
*/
|
|
24
|
+
getSourcesForType(type: SearchType): SearchSource[];
|
|
25
|
+
/**
|
|
26
|
+
* Check if any sources support a specific search type.
|
|
27
|
+
*/
|
|
28
|
+
hasSourcesForType(type: SearchType): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Search across all sources for a given type, aggregating results.
|
|
31
|
+
* Results are deduplicated by name, preferring results from non-experimental sources.
|
|
32
|
+
*/
|
|
33
|
+
search(type: SearchType, options: SearchOptions): Promise<SearchResult[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Search for skills across all skill sources.
|
|
36
|
+
*/
|
|
37
|
+
searchSkills(options: SearchOptions): Promise<SearchResult[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Search for MCP servers across all MCP sources.
|
|
40
|
+
*/
|
|
41
|
+
searchMcp(options: SearchOptions): Promise<SearchResult[]>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/search/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACT,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa,EACb,oBAAoB,EACtB,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACnC,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,mBAAmB,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC;CAClD;AAED;;GAEG;AACH,qBAAa,cAAc;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAElC,OAAO,GAAE,qBAA0B;IAa/C;;OAEG;IACH,UAAU,IAAI,SAAS,YAAY,EAAE;IAIrC;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,EAAE;IAInD;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAI5C;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqC/E;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAInE;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAGlE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { NpmSearchSource, McpRegistrySearchSource, ClaudePluginsDevSearchSource, } from './sources/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registry that manages multiple search sources and aggregates results.
|
|
4
|
+
*/
|
|
5
|
+
export class SearchRegistry {
|
|
6
|
+
sources = [];
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
// MCP registry is always available
|
|
9
|
+
this.sources.push(new McpRegistrySearchSource());
|
|
10
|
+
// Register experimental sources if enabled
|
|
11
|
+
if (options.experimentalSources?.has('claude-plugins-dev')) {
|
|
12
|
+
// NPM skill search only makes sense alongside claude-plugins-dev for now
|
|
13
|
+
// (there are no aix-skill-* packages published yet)
|
|
14
|
+
this.sources.push(new NpmSearchSource(options.npmRegistry));
|
|
15
|
+
this.sources.push(new ClaudePluginsDevSearchSource());
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get all registered sources.
|
|
20
|
+
*/
|
|
21
|
+
getSources() {
|
|
22
|
+
return this.sources;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get sources that support a specific search type.
|
|
26
|
+
*/
|
|
27
|
+
getSourcesForType(type) {
|
|
28
|
+
return this.sources.filter((s) => s.types.includes(type));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if any sources support a specific search type.
|
|
32
|
+
*/
|
|
33
|
+
hasSourcesForType(type) {
|
|
34
|
+
return this.sources.some((s) => s.types.includes(type));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Search across all sources for a given type, aggregating results.
|
|
38
|
+
* Results are deduplicated by name, preferring results from non-experimental sources.
|
|
39
|
+
*/
|
|
40
|
+
async search(type, options) {
|
|
41
|
+
const sources = this.getSourcesForType(type);
|
|
42
|
+
if (sources.length === 0) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
// Search all sources in parallel
|
|
46
|
+
const searchPromises = sources.map(async (source) => {
|
|
47
|
+
try {
|
|
48
|
+
return await source.search(type, options);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// Log but don't fail the entire search if one source fails
|
|
52
|
+
console.error(`Search source ${source.id} failed:`, error);
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
const resultsArrays = await Promise.all(searchPromises);
|
|
57
|
+
// Flatten and deduplicate results
|
|
58
|
+
const seen = new Map();
|
|
59
|
+
for (const results of resultsArrays) {
|
|
60
|
+
for (const result of results) {
|
|
61
|
+
const existing = seen.get(result.name);
|
|
62
|
+
if (!existing) {
|
|
63
|
+
seen.set(result.name, result);
|
|
64
|
+
}
|
|
65
|
+
// If we already have this result from a non-experimental source, keep that one
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return Array.from(seen.values());
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Search for skills across all skill sources.
|
|
72
|
+
*/
|
|
73
|
+
async searchSkills(options) {
|
|
74
|
+
return this.search('skills', options);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Search for MCP servers across all MCP sources.
|
|
78
|
+
*/
|
|
79
|
+
async searchMcp(options) {
|
|
80
|
+
return this.search('mcp', options);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/lib/search/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SearchSource, SearchResult, SearchType, SearchOptions } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Claude Plugins Dev registry search source.
|
|
4
|
+
* Experimental source - must be explicitly enabled.
|
|
5
|
+
*
|
|
6
|
+
* API: https://api.claude-plugins.dev/api/skills/search
|
|
7
|
+
*/
|
|
8
|
+
export declare class ClaudePluginsDevSearchSource implements SearchSource {
|
|
9
|
+
readonly id = "claude-plugins-dev";
|
|
10
|
+
readonly name = "Claude Plugins Dev";
|
|
11
|
+
readonly types: SearchType[];
|
|
12
|
+
readonly experimental = true;
|
|
13
|
+
private readonly baseUrl;
|
|
14
|
+
search(type: SearchType, options: SearchOptions): Promise<SearchResult[]>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=claude-plugins-dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-plugins-dev.d.ts","sourceRoot":"","sources":["../../../../src/lib/search/sources/claude-plugins-dev.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsBzF;;;;;GAKG;AACH,qBAAa,4BAA6B,YAAW,YAAY;IAC9D,QAAQ,CAAC,EAAE,wBAAwB;IACnC,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAc;IAC1C,QAAQ,CAAC,YAAY,QAAQ;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAEtD,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAoCjF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { debounce } from '../debounce.js';
|
|
2
|
+
/**
|
|
3
|
+
* Claude Plugins Dev registry search source.
|
|
4
|
+
* Experimental source - must be explicitly enabled.
|
|
5
|
+
*
|
|
6
|
+
* API: https://api.claude-plugins.dev/api/skills/search
|
|
7
|
+
*/
|
|
8
|
+
export class ClaudePluginsDevSearchSource {
|
|
9
|
+
id = 'claude-plugins-dev';
|
|
10
|
+
name = 'Claude Plugins Dev';
|
|
11
|
+
types = ['skills'];
|
|
12
|
+
experimental = true;
|
|
13
|
+
baseUrl = 'https://api.claude-plugins.dev';
|
|
14
|
+
async search(type, options) {
|
|
15
|
+
if (type !== 'skills') {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
await debounce(this.id);
|
|
19
|
+
const searchUrl = new URL('/api/skills/search', this.baseUrl);
|
|
20
|
+
searchUrl.searchParams.set('q', options.query);
|
|
21
|
+
if (options.limit) {
|
|
22
|
+
searchUrl.searchParams.set('limit', String(options.limit));
|
|
23
|
+
}
|
|
24
|
+
if (options.offset) {
|
|
25
|
+
searchUrl.searchParams.set('offset', String(options.offset));
|
|
26
|
+
}
|
|
27
|
+
const response = await fetch(searchUrl);
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(`Failed to search claude-plugins.dev: ${response.status}`);
|
|
30
|
+
}
|
|
31
|
+
const data = (await response.json());
|
|
32
|
+
return (data.skills ?? []).map((skill) => ({
|
|
33
|
+
name: skill.name,
|
|
34
|
+
version: skill.version,
|
|
35
|
+
description: skill.description,
|
|
36
|
+
source: this.id,
|
|
37
|
+
meta: {
|
|
38
|
+
author: skill.author,
|
|
39
|
+
installs: skill.installs,
|
|
40
|
+
},
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=claude-plugins-dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-plugins-dev.js","sourceRoot":"","sources":["../../../../src/lib/search/sources/claude-plugins-dev.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAqB1C;;;;;GAKG;AACH,MAAM,OAAO,4BAA4B;IAC7B,EAAE,GAAG,oBAAoB,CAAC;IAC1B,IAAI,GAAG,oBAAoB,CAAC;IAC5B,KAAK,GAAiB,CAAC,QAAQ,CAAC,CAAC;IACjC,YAAY,GAAG,IAAI,CAAC;IAEZ,OAAO,GAAG,gCAAgC,CAAC;IAE5D,KAAK,CAAC,MAAM,CAAC,IAAgB,EAAE,OAAsB;QAClD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE9D,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjB,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAClB,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QAExC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAC;QAEpE,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE;gBACH,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aAC1B;SACH,CAAC,CAAC,CAAC;IACP,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/search/sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/search/sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SearchSource, SearchResult, SearchType, SearchOptions } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Official MCP Registry search source.
|
|
4
|
+
*/
|
|
5
|
+
export declare class McpRegistrySearchSource implements SearchSource {
|
|
6
|
+
readonly id = "mcp-registry";
|
|
7
|
+
readonly name = "MCP Registry";
|
|
8
|
+
readonly types: SearchType[];
|
|
9
|
+
readonly experimental = false;
|
|
10
|
+
private readonly client;
|
|
11
|
+
constructor();
|
|
12
|
+
search(type: SearchType, options: SearchOptions): Promise<SearchResult[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mcp-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry.d.ts","sourceRoot":"","sources":["../../../../src/lib/search/sources/mcp-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGzF;;GAEG;AACH,qBAAa,uBAAwB,YAAW,YAAY;IACzD,QAAQ,CAAC,EAAE,kBAAkB;IAC7B,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAW;IACvC,QAAQ,CAAC,YAAY,SAAS;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;;IAMrC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA6BjF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { McpRegistryClient } from '@a1st/mcp-registry-client';
|
|
2
|
+
import { debounce } from '../debounce.js';
|
|
3
|
+
/**
|
|
4
|
+
* Official MCP Registry search source.
|
|
5
|
+
*/
|
|
6
|
+
export class McpRegistrySearchSource {
|
|
7
|
+
id = 'mcp-registry';
|
|
8
|
+
name = 'MCP Registry';
|
|
9
|
+
types = ['mcp'];
|
|
10
|
+
experimental = false;
|
|
11
|
+
client;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.client = new McpRegistryClient();
|
|
14
|
+
}
|
|
15
|
+
async search(type, options) {
|
|
16
|
+
if (type !== 'mcp') {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
await debounce(this.id);
|
|
20
|
+
const response = await this.client.search(options.query, {
|
|
21
|
+
limit: options.limit ?? 20,
|
|
22
|
+
});
|
|
23
|
+
const servers = response.servers ?? [];
|
|
24
|
+
return servers.map((s) => {
|
|
25
|
+
const nameParts = s.server.name.split('/'), friendlyName = nameParts[nameParts.length - 1] ?? s.server.name;
|
|
26
|
+
return {
|
|
27
|
+
name: friendlyName,
|
|
28
|
+
version: s.server.version,
|
|
29
|
+
description: s.server.description,
|
|
30
|
+
source: this.id,
|
|
31
|
+
meta: {
|
|
32
|
+
fullName: s.server.name,
|
|
33
|
+
repositoryUrl: s.server.repository?.url,
|
|
34
|
+
websiteUrl: s.server.websiteUrl,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=mcp-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry.js","sourceRoot":"","sources":["../../../../src/lib/search/sources/mcp-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAuB,MAAM,2BAA2B,CAAC;AAEnF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;GAEG;AACH,MAAM,OAAO,uBAAuB;IACxB,EAAE,GAAG,cAAc,CAAC;IACpB,IAAI,GAAG,cAAc,CAAC;IACtB,KAAK,GAAiB,CAAC,KAAK,CAAC,CAAC;IAC9B,YAAY,GAAG,KAAK,CAAC;IAEb,MAAM,CAAoB;IAE3C;QACG,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAgB,EAAE,OAAsB;QAClD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;YACtD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;SAC5B,CAAC,CAAC;QACH,MAAM,OAAO,GAAqB,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;QAEzD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EACpC,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAEtE,OAAO;gBACJ,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;gBACzB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW;gBACjC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,IAAI,EAAE;oBACH,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;oBACvB,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG;oBACvC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;iBACjC;aACH,CAAC;QACL,CAAC,CAAC,CAAC;IACN,CAAC;CACH"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SearchSource, SearchResult, SearchType, SearchOptions } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* NPM Registry search source for aix-skill packages.
|
|
4
|
+
*/
|
|
5
|
+
export declare class NpmSearchSource implements SearchSource {
|
|
6
|
+
private readonly registryUrl;
|
|
7
|
+
readonly id = "npm";
|
|
8
|
+
readonly name = "NPM Registry";
|
|
9
|
+
readonly types: SearchType[];
|
|
10
|
+
readonly experimental = false;
|
|
11
|
+
constructor(registryUrl?: string);
|
|
12
|
+
search(type: SearchType, options: SearchOptions): Promise<SearchResult[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=npm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../../../src/lib/search/sources/npm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAczF;;GAEG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAMrC,OAAO,CAAC,QAAQ,CAAC,WAAW;IALxC,QAAQ,CAAC,EAAE,SAAS;IACpB,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAc;IAC1C,QAAQ,CAAC,YAAY,SAAS;gBAED,WAAW,GAAE,MAAqC;IAEzE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAqCjF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { debounce } from '../debounce.js';
|
|
2
|
+
/**
|
|
3
|
+
* NPM Registry search source for aix-skill packages.
|
|
4
|
+
*/
|
|
5
|
+
export class NpmSearchSource {
|
|
6
|
+
registryUrl;
|
|
7
|
+
id = 'npm';
|
|
8
|
+
name = 'NPM Registry';
|
|
9
|
+
types = ['skills'];
|
|
10
|
+
experimental = false;
|
|
11
|
+
constructor(registryUrl = 'https://registry.npmjs.org') {
|
|
12
|
+
this.registryUrl = registryUrl;
|
|
13
|
+
}
|
|
14
|
+
async search(type, options) {
|
|
15
|
+
if (type !== 'skills') {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
await debounce(this.id);
|
|
19
|
+
const searchUrl = new URL('/-/v1/search', this.registryUrl);
|
|
20
|
+
searchUrl.searchParams.set('text', `aix-skill ${options.query}`);
|
|
21
|
+
searchUrl.searchParams.set('size', String(options.limit ?? 20));
|
|
22
|
+
if (options.offset) {
|
|
23
|
+
searchUrl.searchParams.set('from', String(options.offset));
|
|
24
|
+
}
|
|
25
|
+
const response = await fetch(searchUrl);
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`Failed to search npm registry: ${response.status}`);
|
|
28
|
+
}
|
|
29
|
+
const data = (await response.json());
|
|
30
|
+
return data.objects
|
|
31
|
+
.filter((obj) => obj.package.name.startsWith('aix-skill-') ||
|
|
32
|
+
obj.package.name.includes('/aix-skill-') ||
|
|
33
|
+
obj.package.keywords?.includes('aix-skill'))
|
|
34
|
+
.map((obj) => ({
|
|
35
|
+
name: obj.package.name,
|
|
36
|
+
version: obj.package.version,
|
|
37
|
+
description: obj.package.description,
|
|
38
|
+
source: this.id,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=npm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../../../src/lib/search/sources/npm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAa1C;;GAEG;AACH,MAAM,OAAO,eAAe;IAMI;IALpB,EAAE,GAAG,KAAK,CAAC;IACX,IAAI,GAAG,cAAc,CAAC;IACtB,KAAK,GAAiB,CAAC,QAAQ,CAAC,CAAC;IACjC,YAAY,GAAG,KAAK,CAAC;IAE9B,YAA6B,cAAsB,4BAA4B;QAAlD,gBAAW,GAAX,WAAW,CAAuC;IAAG,CAAC;IAEnF,KAAK,CAAC,MAAM,CAAC,IAAgB,EAAE,OAAsB;QAClD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACb,CAAC;QAED,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE5D,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAClB,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QAExC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB,CAAC;QAExD,OAAO,IAAI,CAAC,OAAO;aACf,MAAM,CACJ,CAAC,GAAG,EAAE,EAAE,CACL,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YACzC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAChD;aACA,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;YAC5B,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW;YACpC,MAAM,EAAE,IAAI,CAAC,EAAE;SACjB,CAAC,CAAC,CAAC;IACV,CAAC;CACH"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common search result type returned by all sources.
|
|
3
|
+
*/
|
|
4
|
+
export interface SearchResult {
|
|
5
|
+
name: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
source: string;
|
|
9
|
+
/** Additional metadata from the source */
|
|
10
|
+
meta?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Type of resource being searched.
|
|
14
|
+
*/
|
|
15
|
+
export type SearchType = 'skills' | 'mcp';
|
|
16
|
+
/**
|
|
17
|
+
* Options passed to search sources.
|
|
18
|
+
*/
|
|
19
|
+
export interface SearchOptions {
|
|
20
|
+
query: string;
|
|
21
|
+
limit?: number;
|
|
22
|
+
offset?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Interface that all search sources must implement.
|
|
26
|
+
*/
|
|
27
|
+
export interface SearchSource {
|
|
28
|
+
/** Unique identifier for this source */
|
|
29
|
+
readonly id: string;
|
|
30
|
+
/** Human-readable name */
|
|
31
|
+
readonly name: string;
|
|
32
|
+
/** Types of resources this source provides */
|
|
33
|
+
readonly types: SearchType[];
|
|
34
|
+
/** Whether this source is experimental (requires opt-in) */
|
|
35
|
+
readonly experimental: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Search for resources matching the query.
|
|
38
|
+
* @param type - The type of resource to search for
|
|
39
|
+
* @param options - Search options including query, limit, offset
|
|
40
|
+
* @returns Array of search results
|
|
41
|
+
*/
|
|
42
|
+
search(type: SearchType, options: SearchOptions): Promise<SearchResult[]>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Experimental source identifiers that can be enabled via --experimental flag.
|
|
46
|
+
*/
|
|
47
|
+
export type ExperimentalSourceId = 'claude-plugins-dev';
|
|
48
|
+
/**
|
|
49
|
+
* Parse experimental flag values like "source:claude-plugins-dev".
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseExperimentalFlags(flags: string[]): Set<ExperimentalSourceId>;
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/search/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAE/B;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CAC5E;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAExD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAWjF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse experimental flag values like "source:claude-plugins-dev".
|
|
3
|
+
*/
|
|
4
|
+
export function parseExperimentalFlags(flags) {
|
|
5
|
+
const sources = new Set();
|
|
6
|
+
for (const flag of flags) {
|
|
7
|
+
if (flag.startsWith('source:')) {
|
|
8
|
+
const sourceId = flag.slice('source:'.length);
|
|
9
|
+
sources.add(sourceId);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return sources;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/search/types.ts"],"names":[],"mappings":"AAqDA;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAe;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAyB,CAAC;YAEtE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SearchResult } from '../../../lib/search/types.js';
|
|
3
|
+
interface DetailsPanelProps {
|
|
4
|
+
result: SearchResult | null;
|
|
5
|
+
width?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function DetailsPanel({ result, width }: DetailsPanelProps): React.ReactElement;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=DetailsPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailsPanel.d.ts","sourceRoot":"","sources":["../../../../src/ui/search/components/DetailsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,UAAU,iBAAiB;IACxB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CA6CrF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { sanitizeForTerminal, sanitizeDescription } from '../utils/sanitize.js';
|
|
4
|
+
export function DetailsPanel({ result, width }) {
|
|
5
|
+
if (!result) {
|
|
6
|
+
return (_jsx(Box, { flexDirection: "column", borderStyle: "single", borderColor: "gray", paddingX: 1, width: width, children: _jsx(Text, { dimColor: true, children: "Select an item to see details" }) }));
|
|
7
|
+
}
|
|
8
|
+
const meta = result.meta, repoUrl = meta?.repositoryUrl, websiteUrl = meta?.websiteUrl;
|
|
9
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", paddingX: 1, width: width, children: [_jsx(Text, { bold: true, color: "cyan", children: sanitizeForTerminal(result.name) }), result.version && _jsxs(Text, { dimColor: true, children: ["v", sanitizeForTerminal(result.version)] }), _jsx(Text, { children: " " }), result.description && _jsx(Text, { wrap: "wrap", children: sanitizeDescription(result.description) }), _jsx(Text, { children: " " }), _jsxs(Text, { children: ["\uD83D\uDCE6 Source: ", _jsx(Text, { color: "yellow", children: sanitizeForTerminal(result.source) })] }), meta?.author !== undefined && (_jsxs(Text, { children: ["\uD83D\uDC64 Author: ", _jsx(Text, { children: sanitizeForTerminal(String(meta.author)) })] })), repoUrl && (_jsxs(Text, { children: ["\uD83D\uDD17 Repo: ", _jsx(Text, { color: "blue", children: sanitizeForTerminal(repoUrl) })] })), websiteUrl && !repoUrl && (_jsxs(Text, { children: ["\uD83C\uDF10 Web: ", _jsx(Text, { color: "blue", children: sanitizeForTerminal(websiteUrl) })] })), meta?.fullName !== undefined && (_jsxs(Text, { dimColor: true, children: ["Full name: ", sanitizeForTerminal(String(meta.fullName))] }))] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=DetailsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailsPanel.js","sourceRoot":"","sources":["../../../../src/ui/search/components/DetailsPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAOhF,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAqB;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACX,OAAO,CACJ,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,YAC1F,KAAC,IAAI,IAAC,QAAQ,oDAAqC,GAChD,CACR,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAA2C,EACzD,OAAO,GAAG,IAAI,EAAE,aAAmC,EACnD,UAAU,GAAG,IAAI,EAAE,UAAgC,CAAC;IAE1D,OAAO,CACJ,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,aAC1F,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YACnB,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,GAC7B,EACN,MAAM,CAAC,OAAO,IAAI,MAAC,IAAI,IAAC,QAAQ,wBAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAQ,EAC/E,KAAC,IAAI,oBAAS,EACb,MAAM,CAAC,WAAW,IAAI,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,GAAQ,EACzF,KAAC,IAAI,oBAAS,EACd,MAAC,IAAI,wCACS,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAQ,IACvE,EACN,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,CAC5B,MAAC,IAAI,wCACS,KAAC,IAAI,cAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAQ,IAC9D,CACT,EACA,OAAO,IAAI,CACT,MAAC,IAAI,sCACO,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,mBAAmB,CAAC,OAAO,CAAC,GAAQ,IAC7D,CACT,EACA,UAAU,IAAI,CAAC,OAAO,IAAI,CACxB,MAAC,IAAI,qCACM,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,mBAAmB,CAAC,UAAU,CAAC,GAAQ,IAC/D,CACT,EACA,IAAI,EAAE,QAAQ,KAAK,SAAS,IAAI,CAC9B,MAAC,IAAI,IAAC,QAAQ,kCAAa,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAQ,CAC/E,IACE,CACR,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SearchResult } from '../../../lib/search/types.js';
|
|
3
|
+
interface ResultsListProps {
|
|
4
|
+
results: SearchResult[];
|
|
5
|
+
selectedIndex: number;
|
|
6
|
+
/** Items that have been installed (shows checkmark) */
|
|
7
|
+
installedItems: Set<string>;
|
|
8
|
+
/** Item currently being installed (shows spinner) */
|
|
9
|
+
installingItem: string | null;
|
|
10
|
+
maxHeight?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function ResultsList({ results, selectedIndex, installedItems, installingItem, maxHeight, }: ResultsListProps): React.ReactElement;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=ResultsList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResultsList.d.ts","sourceRoot":"","sources":["../../../../src/ui/search/components/ResultsList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,UAAU,gBAAgB;IACvB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,qDAAqD;IACrD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EACzB,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAc,GAChB,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CA8DvC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { sanitizeForTerminal } from '../utils/sanitize.js';
|
|
4
|
+
export function ResultsList({ results, selectedIndex, installedItems, installingItem, maxHeight = 10, }) {
|
|
5
|
+
if (results.length === 0) {
|
|
6
|
+
return (_jsx(Box, { flexDirection: "column", paddingLeft: 1, children: _jsx(Text, { dimColor: true, children: "No results. Type to search." }) }));
|
|
7
|
+
}
|
|
8
|
+
// Calculate visible window
|
|
9
|
+
const halfWindow = Math.floor(maxHeight / 2);
|
|
10
|
+
let startIndex = Math.max(0, selectedIndex - halfWindow);
|
|
11
|
+
const endIndex = Math.min(results.length, startIndex + maxHeight);
|
|
12
|
+
if (endIndex - startIndex < maxHeight) {
|
|
13
|
+
startIndex = Math.max(0, endIndex - maxHeight);
|
|
14
|
+
}
|
|
15
|
+
const visibleResults = results.slice(startIndex, endIndex);
|
|
16
|
+
return (_jsxs(Box, { flexDirection: "column", children: [visibleResults.map((result, i) => {
|
|
17
|
+
const actualIndex = startIndex + i, isSelected = actualIndex === selectedIndex, isInstalled = installedItems.has(result.name), isInstalling = installingItem === result.name, prefix = isSelected ? '>' : ' ';
|
|
18
|
+
// Determine the status indicator (fixed width to prevent layout shift)
|
|
19
|
+
let statusIcon;
|
|
20
|
+
if (isInstalling) {
|
|
21
|
+
statusIcon = _jsx(Text, { color: "yellow", children: "\u23F3" });
|
|
22
|
+
}
|
|
23
|
+
else if (isInstalled) {
|
|
24
|
+
statusIcon = _jsx(Text, { color: "green", children: "\u2713" });
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
statusIcon = _jsx(Text, { dimColor: true, children: "\u25CB" });
|
|
28
|
+
}
|
|
29
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: isSelected ? 'cyan' : undefined, bold: isSelected, children: [prefix, ' '] }), statusIcon, _jsxs(Text, { color: isSelected ? 'cyan' : undefined, bold: isSelected, children: [' ', sanitizeForTerminal(result.name)] }), result.version && _jsxs(Text, { dimColor: true, children: [" v", sanitizeForTerminal(result.version)] })] }, result.name));
|
|
30
|
+
}), results.length > maxHeight && (_jsxs(Text, { dimColor: true, children: [' ', "\u2195 ", selectedIndex + 1, "/", results.length] }))] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ResultsList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResultsList.js","sourceRoot":"","sources":["../../../../src/ui/search/components/ResultsList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SearchUIProps } from '../types.js';
|
|
3
|
+
export declare function SearchApp({ initialQuery, types, registry, onInstall, onUninstall, onExit, alreadyInstalled, }: SearchUIProps): React.ReactElement;
|
|
4
|
+
//# sourceMappingURL=SearchApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchApp.d.ts","sourceRoot":"","sources":["../../../../src/ui/search/components/SearchApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAUrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,wBAAgB,SAAS,CAAC,EACvB,YAAiB,EACjB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,gBAA4B,GAC9B,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAiHpC"}
|