ankui 0.1.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 +21 -0
- package/README.md +369 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +192 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/access.d.ts +6 -0
- package/dist/commands/access.js +12 -0
- package/dist/commands/access.js.map +1 -0
- package/dist/commands/caps.d.ts +6 -0
- package/dist/commands/caps.js +12 -0
- package/dist/commands/caps.js.map +1 -0
- package/dist/commands/discover.d.ts +10 -0
- package/dist/commands/discover.js +120 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.js +12 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/launch-tui.d.ts +15 -0
- package/dist/commands/launch-tui.js +53 -0
- package/dist/commands/launch-tui.js.map +1 -0
- package/dist/commands/list.d.ts +11 -0
- package/dist/commands/list.js +51 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mcp.d.ts +6 -0
- package/dist/commands/mcp.js +12 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/scan-all.d.ts +15 -0
- package/dist/commands/scan-all.js +32 -0
- package/dist/commands/scan-all.js.map +1 -0
- package/dist/commands/show.d.ts +7 -0
- package/dist/commands/show.js +12 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/watch.d.ts +32 -0
- package/dist/commands/watch.js +205 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/ankui-config.d.ts +13 -0
- package/dist/config/ankui-config.js +123 -0
- package/dist/config/ankui-config.js.map +1 -0
- package/dist/scanner/access-review.d.ts +2 -0
- package/dist/scanner/access-review.js +183 -0
- package/dist/scanner/access-review.js.map +1 -0
- package/dist/scanner/adapters/claude.d.ts +2 -0
- package/dist/scanner/adapters/claude.js +298 -0
- package/dist/scanner/adapters/claude.js.map +1 -0
- package/dist/scanner/adapters/codex.d.ts +2 -0
- package/dist/scanner/adapters/codex.js +152 -0
- package/dist/scanner/adapters/codex.js.map +1 -0
- package/dist/scanner/adapters/cursor.d.ts +2 -0
- package/dist/scanner/adapters/cursor.js +114 -0
- package/dist/scanner/adapters/cursor.js.map +1 -0
- package/dist/scanner/adapters/gemini.d.ts +2 -0
- package/dist/scanner/adapters/gemini.js +191 -0
- package/dist/scanner/adapters/gemini.js.map +1 -0
- package/dist/scanner/adapters/index.d.ts +35 -0
- package/dist/scanner/adapters/index.js +85 -0
- package/dist/scanner/adapters/index.js.map +1 -0
- package/dist/scanner/adapters/opencode.d.ts +2 -0
- package/dist/scanner/adapters/opencode.js +231 -0
- package/dist/scanner/adapters/opencode.js.map +1 -0
- package/dist/scanner/adapters/shared.d.ts +57 -0
- package/dist/scanner/adapters/shared.js +239 -0
- package/dist/scanner/adapters/shared.js.map +1 -0
- package/dist/scanner/adapters/skills-sh.d.ts +2 -0
- package/dist/scanner/adapters/skills-sh.js +71 -0
- package/dist/scanner/adapters/skills-sh.js.map +1 -0
- package/dist/scanner/capability-map.d.ts +8 -0
- package/dist/scanner/capability-map.js +57 -0
- package/dist/scanner/capability-map.js.map +1 -0
- package/dist/scanner/discovery.d.ts +31 -0
- package/dist/scanner/discovery.js +320 -0
- package/dist/scanner/discovery.js.map +1 -0
- package/dist/scanner/filesystem-crawler.d.ts +32 -0
- package/dist/scanner/filesystem-crawler.js +210 -0
- package/dist/scanner/filesystem-crawler.js.map +1 -0
- package/dist/scanner/index.d.ts +8 -0
- package/dist/scanner/index.js +120 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/multi-project.d.ts +31 -0
- package/dist/scanner/multi-project.js +227 -0
- package/dist/scanner/multi-project.js.map +1 -0
- package/dist/scanner/parallel.d.ts +4 -0
- package/dist/scanner/parallel.js +41 -0
- package/dist/scanner/parallel.js.map +1 -0
- package/dist/scanner/parsing.d.ts +9 -0
- package/dist/scanner/parsing.js +135 -0
- package/dist/scanner/parsing.js.map +1 -0
- package/dist/scanner/paths.d.ts +8 -0
- package/dist/scanner/paths.js +39 -0
- package/dist/scanner/paths.js.map +1 -0
- package/dist/scanner/preview.d.ts +12 -0
- package/dist/scanner/preview.js +29 -0
- package/dist/scanner/preview.js.map +1 -0
- package/dist/scanner/project-discovery.d.ts +11 -0
- package/dist/scanner/project-discovery.js +35 -0
- package/dist/scanner/project-discovery.js.map +1 -0
- package/dist/scanner/ripgrep.d.ts +11 -0
- package/dist/scanner/ripgrep.js +61 -0
- package/dist/scanner/ripgrep.js.map +1 -0
- package/dist/scanner/safety.d.ts +37 -0
- package/dist/scanner/safety.js +330 -0
- package/dist/scanner/safety.js.map +1 -0
- package/dist/scanner/skill-naming.d.ts +5 -0
- package/dist/scanner/skill-naming.js +53 -0
- package/dist/scanner/skill-naming.js.map +1 -0
- package/dist/scanner/watcher.d.ts +15 -0
- package/dist/scanner/watcher.js +71 -0
- package/dist/scanner/watcher.js.map +1 -0
- package/dist/tui/App.d.ts +33 -0
- package/dist/tui/App.js +201 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/Breadcrumb.d.ts +10 -0
- package/dist/tui/components/Breadcrumb.js +11 -0
- package/dist/tui/components/Breadcrumb.js.map +1 -0
- package/dist/tui/components/DisclosureRow.d.ts +17 -0
- package/dist/tui/components/DisclosureRow.js +13 -0
- package/dist/tui/components/DisclosureRow.js.map +1 -0
- package/dist/tui/components/DotLeaderRow.d.ts +17 -0
- package/dist/tui/components/DotLeaderRow.js +34 -0
- package/dist/tui/components/DotLeaderRow.js.map +1 -0
- package/dist/tui/components/EmptyStateWhisper.d.ts +5 -0
- package/dist/tui/components/EmptyStateWhisper.js +6 -0
- package/dist/tui/components/EmptyStateWhisper.js.map +1 -0
- package/dist/tui/components/Frame.d.ts +15 -0
- package/dist/tui/components/Frame.js +21 -0
- package/dist/tui/components/Frame.js.map +1 -0
- package/dist/tui/components/IdleWhisper.d.ts +11 -0
- package/dist/tui/components/IdleWhisper.js +12 -0
- package/dist/tui/components/IdleWhisper.js.map +1 -0
- package/dist/tui/components/KeyHint.d.ts +13 -0
- package/dist/tui/components/KeyHint.js +12 -0
- package/dist/tui/components/KeyHint.js.map +1 -0
- package/dist/tui/components/LoadingSplash.d.ts +12 -0
- package/dist/tui/components/LoadingSplash.js +55 -0
- package/dist/tui/components/LoadingSplash.js.map +1 -0
- package/dist/tui/components/ProgressBar.d.ts +16 -0
- package/dist/tui/components/ProgressBar.js +24 -0
- package/dist/tui/components/ProgressBar.js.map +1 -0
- package/dist/tui/components/SearchBox.d.ts +5 -0
- package/dist/tui/components/SearchBox.js +6 -0
- package/dist/tui/components/SearchBox.js.map +1 -0
- package/dist/tui/components/SectionHeader.d.ts +12 -0
- package/dist/tui/components/SectionHeader.js +14 -0
- package/dist/tui/components/SectionHeader.js.map +1 -0
- package/dist/tui/components/SkillViewport.d.ts +8 -0
- package/dist/tui/components/SkillViewport.js +42 -0
- package/dist/tui/components/SkillViewport.js.map +1 -0
- package/dist/tui/components/Spinner.d.ts +11 -0
- package/dist/tui/components/Spinner.js +13 -0
- package/dist/tui/components/Spinner.js.map +1 -0
- package/dist/tui/components/StatusPill.d.ts +13 -0
- package/dist/tui/components/StatusPill.js +15 -0
- package/dist/tui/components/StatusPill.js.map +1 -0
- package/dist/tui/components/TabBar.d.ts +20 -0
- package/dist/tui/components/TabBar.js +26 -0
- package/dist/tui/components/TabBar.js.map +1 -0
- package/dist/tui/components/TextInput.d.ts +13 -0
- package/dist/tui/components/TextInput.js +34 -0
- package/dist/tui/components/TextInput.js.map +1 -0
- package/dist/tui/hooks/use-idle-whisper.d.ts +17 -0
- package/dist/tui/hooks/use-idle-whisper.js +66 -0
- package/dist/tui/hooks/use-idle-whisper.js.map +1 -0
- package/dist/tui/hooks/use-rotating-message.d.ts +20 -0
- package/dist/tui/hooks/use-rotating-message.js +34 -0
- package/dist/tui/hooks/use-rotating-message.js.map +1 -0
- package/dist/tui/input/use-keys.d.ts +16 -0
- package/dist/tui/input/use-keys.js +32 -0
- package/dist/tui/input/use-keys.js.map +1 -0
- package/dist/tui/messages.d.ts +18 -0
- package/dist/tui/messages.js +59 -0
- package/dist/tui/messages.js.map +1 -0
- package/dist/tui/render.d.ts +12 -0
- package/dist/tui/render.js +112 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/screens/AccessTab.d.ts +6 -0
- package/dist/tui/screens/AccessTab.js +26 -0
- package/dist/tui/screens/AccessTab.js.map +1 -0
- package/dist/tui/screens/DoctorTab.d.ts +6 -0
- package/dist/tui/screens/DoctorTab.js +24 -0
- package/dist/tui/screens/DoctorTab.js.map +1 -0
- package/dist/tui/screens/FirstRunScan.d.ts +11 -0
- package/dist/tui/screens/FirstRunScan.js +128 -0
- package/dist/tui/screens/FirstRunScan.js.map +1 -0
- package/dist/tui/screens/McpsTab.d.ts +6 -0
- package/dist/tui/screens/McpsTab.js +30 -0
- package/dist/tui/screens/McpsTab.js.map +1 -0
- package/dist/tui/screens/Overview.d.ts +6 -0
- package/dist/tui/screens/Overview.js +75 -0
- package/dist/tui/screens/Overview.js.map +1 -0
- package/dist/tui/screens/ProjectDrillIn.d.ts +10 -0
- package/dist/tui/screens/ProjectDrillIn.js +16 -0
- package/dist/tui/screens/ProjectDrillIn.js.map +1 -0
- package/dist/tui/screens/Settings.d.ts +8 -0
- package/dist/tui/screens/Settings.js +71 -0
- package/dist/tui/screens/Settings.js.map +1 -0
- package/dist/tui/screens/ToolTab.d.ts +9 -0
- package/dist/tui/screens/ToolTab.js +38 -0
- package/dist/tui/screens/ToolTab.js.map +1 -0
- package/dist/tui/screens/UserScopeDrillIn.d.ts +13 -0
- package/dist/tui/screens/UserScopeDrillIn.js +15 -0
- package/dist/tui/screens/UserScopeDrillIn.js.map +1 -0
- package/dist/tui/state/navigation.d.ts +1 -0
- package/dist/tui/state/navigation.js +11 -0
- package/dist/tui/state/navigation.js.map +1 -0
- package/dist/tui/state/settings-state.d.ts +22 -0
- package/dist/tui/state/settings-state.js +30 -0
- package/dist/tui/state/settings-state.js.map +1 -0
- package/dist/tui/state/tui-state.d.ts +57 -0
- package/dist/tui/state/tui-state.js +86 -0
- package/dist/tui/state/tui-state.js.map +1 -0
- package/dist/tui/theme/borders.d.ts +20 -0
- package/dist/tui/theme/borders.js +25 -0
- package/dist/tui/theme/borders.js.map +1 -0
- package/dist/tui/theme/colors.d.ts +14 -0
- package/dist/tui/theme/colors.js +18 -0
- package/dist/tui/theme/colors.js.map +1 -0
- package/dist/tui/theme/icons.d.ts +30 -0
- package/dist/tui/theme/icons.js +51 -0
- package/dist/tui/theme/icons.js.map +1 -0
- package/dist/tui/util/doctor-grouping.d.ts +27 -0
- package/dist/tui/util/doctor-grouping.js +67 -0
- package/dist/tui/util/doctor-grouping.js.map +1 -0
- package/dist/tui/util/finding-grouping.d.ts +24 -0
- package/dist/tui/util/finding-grouping.js +43 -0
- package/dist/tui/util/finding-grouping.js.map +1 -0
- package/dist/tui/util/mcp-grouping.d.ts +27 -0
- package/dist/tui/util/mcp-grouping.js +96 -0
- package/dist/tui/util/mcp-grouping.js.map +1 -0
- package/dist/tui/util/scan-history.d.ts +15 -0
- package/dist/tui/util/scan-history.js +43 -0
- package/dist/tui/util/scan-history.js.map +1 -0
- package/dist/tui/util/skill-filter.d.ts +2 -0
- package/dist/tui/util/skill-filter.js +7 -0
- package/dist/tui/util/skill-filter.js.map +1 -0
- package/dist/tui/util/skill-grouping.d.ts +3 -0
- package/dist/tui/util/skill-grouping.js +31 -0
- package/dist/tui/util/skill-grouping.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.js +143 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +1 -0
- package/dist/utils/errors.js +7 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/format-access.d.ts +3 -0
- package/dist/utils/format-access.js +94 -0
- package/dist/utils/format-access.js.map +1 -0
- package/dist/utils/format-caps.d.ts +3 -0
- package/dist/utils/format-caps.js +139 -0
- package/dist/utils/format-caps.js.map +1 -0
- package/dist/utils/format-doctor.d.ts +3 -0
- package/dist/utils/format-doctor.js +105 -0
- package/dist/utils/format-doctor.js.map +1 -0
- package/dist/utils/format-list.d.ts +7 -0
- package/dist/utils/format-list.js +112 -0
- package/dist/utils/format-list.js.map +1 -0
- package/dist/utils/format-mcp.d.ts +3 -0
- package/dist/utils/format-mcp.js +130 -0
- package/dist/utils/format-mcp.js.map +1 -0
- package/dist/utils/format-multi-project.d.ts +3 -0
- package/dist/utils/format-multi-project.js +100 -0
- package/dist/utils/format-multi-project.js.map +1 -0
- package/dist/utils/format-show.d.ts +6 -0
- package/dist/utils/format-show.js +143 -0
- package/dist/utils/format-show.js.map +1 -0
- package/dist/utils/format.d.ts +3 -0
- package/dist/utils/format.js +53 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/paths.d.ts +1 -0
- package/dist/utils/paths.js +10 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Priority order for cross-tool access findings — matches
|
|
3
|
+
* `src/utils/format-access.ts`'s `CATEGORY_ORDER`. Categories not present
|
|
4
|
+
* here (`skipped_sensitive_file`, `parse_issue`) are surfaced in Doctor,
|
|
5
|
+
* not Access.
|
|
6
|
+
*/
|
|
7
|
+
export const FINDING_CATEGORY_ORDER = [
|
|
8
|
+
{ category: "broad_access_capability", label: "Broad-access MCP servers" },
|
|
9
|
+
{ category: "duplicate_mcp", label: "Duplicate MCP servers" },
|
|
10
|
+
{ category: "secret_reference", label: "Secret-bearing env keys" },
|
|
11
|
+
{ category: "unknown_capability", label: "Uncatalogued MCP servers" },
|
|
12
|
+
{ category: "dangerous_pattern", label: "Review-worthy command patterns" }
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Aggregates findings from user-scope + every project. Groups by category
|
|
16
|
+
* in priority order. Returns only sections that have at least one finding.
|
|
17
|
+
* Within a section, findings are sorted by title (case-insensitive).
|
|
18
|
+
*/
|
|
19
|
+
export function aggregateFindings(result) {
|
|
20
|
+
const all = [];
|
|
21
|
+
all.push(...result.userScope.findings);
|
|
22
|
+
for (const project of result.projects) {
|
|
23
|
+
all.push(...project.scan.findings);
|
|
24
|
+
}
|
|
25
|
+
if (all.length === 0)
|
|
26
|
+
return [];
|
|
27
|
+
const grouped = new Map();
|
|
28
|
+
for (const finding of all) {
|
|
29
|
+
const list = grouped.get(finding.category) ?? [];
|
|
30
|
+
list.push(finding);
|
|
31
|
+
grouped.set(finding.category, list);
|
|
32
|
+
}
|
|
33
|
+
const sections = [];
|
|
34
|
+
for (const spec of FINDING_CATEGORY_ORDER) {
|
|
35
|
+
const list = grouped.get(spec.category);
|
|
36
|
+
if (!list || list.length === 0)
|
|
37
|
+
continue;
|
|
38
|
+
const sorted = [...list].sort((a, b) => a.title.localeCompare(b.title, undefined, { sensitivity: "base" }));
|
|
39
|
+
sections.push({ category: spec.category, label: spec.label, findings: sorted });
|
|
40
|
+
}
|
|
41
|
+
return sections;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=finding-grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-grouping.js","sourceRoot":"","sources":["../../../src/tui/util/finding-grouping.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAuC;IACxE,EAAE,QAAQ,EAAE,yBAAyB,EAAE,KAAK,EAAE,0BAA0B,EAAE;IAC1E,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,uBAAuB,EAAE;IAC7D,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,yBAAyB,EAAE;IAClE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,0BAA0B,EAAE;IACrE,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,gCAAgC,EAAE;CAC3E,CAAC;AAQF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA8B;IAE9B,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,sBAAsB,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACzC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CACnE,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AccessLevel, CapabilityCategory, MultiProjectScanResult, Skill, ToolId } from "../../types.js";
|
|
2
|
+
export interface McpConfiguration {
|
|
3
|
+
toolId: ToolId;
|
|
4
|
+
scope: Skill["scope"];
|
|
5
|
+
sourcePath: string;
|
|
6
|
+
envKeys: ReadonlyArray<string>;
|
|
7
|
+
}
|
|
8
|
+
export interface McpGroup {
|
|
9
|
+
name: string;
|
|
10
|
+
capabilityCategories: ReadonlyArray<CapabilityCategory>;
|
|
11
|
+
accessLevel: AccessLevel;
|
|
12
|
+
configurations: ReadonlyArray<McpConfiguration>;
|
|
13
|
+
secretEnvKeys: ReadonlyArray<string>;
|
|
14
|
+
duplicatedAcrossTools: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Aggregates every `mcp_server` skill in the multi-project result —
|
|
18
|
+
* user-scope and every project — into one ordered list of groups keyed by
|
|
19
|
+
* canonical (lowercased) name. Mirrors `formatMcpOverview`'s grouping rules:
|
|
20
|
+
*
|
|
21
|
+
* - Sort: most configurations first, then name ascending (case-insensitive).
|
|
22
|
+
* - `duplicatedAcrossTools` is true when ≥2 unique `toolId`s contribute.
|
|
23
|
+
* - `secretEnvKeys` are env keys flagged by `isSecretLikeKey`, deduped, sorted.
|
|
24
|
+
*/
|
|
25
|
+
export declare function aggregateMcps(result: MultiProjectScanResult): McpGroup[];
|
|
26
|
+
/** Returns the `"<capabilities> · <level>"` tag, or `"(uncatalogued)"` when unknown. */
|
|
27
|
+
export declare function formatCapabilityTag(group: McpGroup): string;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { isSecretLikeKey } from "../../scanner/safety.js";
|
|
2
|
+
/**
|
|
3
|
+
* Aggregates every `mcp_server` skill in the multi-project result —
|
|
4
|
+
* user-scope and every project — into one ordered list of groups keyed by
|
|
5
|
+
* canonical (lowercased) name. Mirrors `formatMcpOverview`'s grouping rules:
|
|
6
|
+
*
|
|
7
|
+
* - Sort: most configurations first, then name ascending (case-insensitive).
|
|
8
|
+
* - `duplicatedAcrossTools` is true when ≥2 unique `toolId`s contribute.
|
|
9
|
+
* - `secretEnvKeys` are env keys flagged by `isSecretLikeKey`, deduped, sorted.
|
|
10
|
+
*/
|
|
11
|
+
export function aggregateMcps(result) {
|
|
12
|
+
const map = new Map();
|
|
13
|
+
collectFromScan(result.userScope, map);
|
|
14
|
+
for (const project of result.projects) {
|
|
15
|
+
collectFromScan(project.scan, map);
|
|
16
|
+
}
|
|
17
|
+
const groups = [];
|
|
18
|
+
for (const builder of map.values()) {
|
|
19
|
+
const toolSet = new Set(builder.configurations.map((c) => c.toolId));
|
|
20
|
+
const allEnvKeys = new Set();
|
|
21
|
+
for (const config of builder.configurations) {
|
|
22
|
+
for (const key of config.envKeys)
|
|
23
|
+
allEnvKeys.add(key);
|
|
24
|
+
}
|
|
25
|
+
const secretEnvKeys = [...allEnvKeys].filter(isSecretLikeKey).sort();
|
|
26
|
+
groups.push({
|
|
27
|
+
name: builder.name,
|
|
28
|
+
capabilityCategories: builder.capabilityCategories,
|
|
29
|
+
accessLevel: builder.accessLevel,
|
|
30
|
+
configurations: builder.configurations,
|
|
31
|
+
secretEnvKeys,
|
|
32
|
+
duplicatedAcrossTools: toolSet.size >= 2
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
groups.sort((a, b) => {
|
|
36
|
+
if (a.configurations.length !== b.configurations.length) {
|
|
37
|
+
return b.configurations.length - a.configurations.length;
|
|
38
|
+
}
|
|
39
|
+
return a.name.localeCompare(b.name, undefined, { sensitivity: "base" });
|
|
40
|
+
});
|
|
41
|
+
return groups;
|
|
42
|
+
}
|
|
43
|
+
function collectFromScan(scan, map) {
|
|
44
|
+
for (const tool of scan.tools) {
|
|
45
|
+
for (const skill of tool.skills) {
|
|
46
|
+
if (skill.kind !== "mcp_server")
|
|
47
|
+
continue;
|
|
48
|
+
addSkill(map, tool, skill);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function addSkill(map, tool, skill) {
|
|
53
|
+
const key = skill.name.toLowerCase();
|
|
54
|
+
const configuration = {
|
|
55
|
+
toolId: tool.id,
|
|
56
|
+
scope: skill.scope,
|
|
57
|
+
sourcePath: skill.sourcePath,
|
|
58
|
+
envKeys: readEnvKeys(skill.details)
|
|
59
|
+
};
|
|
60
|
+
const existing = map.get(key);
|
|
61
|
+
if (existing) {
|
|
62
|
+
// De-dupe: project scans frequently re-discover user-level MCP files
|
|
63
|
+
// (e.g. `~/.cursor/mcp.json`) once per project, producing many copies of
|
|
64
|
+
// the same (toolId, scope, sourcePath) tuple. Treat those as one config.
|
|
65
|
+
const isDuplicate = existing.configurations.some((c) => c.toolId === configuration.toolId &&
|
|
66
|
+
c.scope === configuration.scope &&
|
|
67
|
+
c.sourcePath === configuration.sourcePath);
|
|
68
|
+
if (!isDuplicate) {
|
|
69
|
+
existing.configurations.push(configuration);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
map.set(key, {
|
|
74
|
+
name: skill.name,
|
|
75
|
+
capabilityCategories: skill.capabilityCategories,
|
|
76
|
+
accessLevel: skill.accessLevel,
|
|
77
|
+
configurations: [configuration]
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function readEnvKeys(details) {
|
|
81
|
+
if (!details || typeof details !== "object")
|
|
82
|
+
return [];
|
|
83
|
+
const raw = details.envKeys;
|
|
84
|
+
if (!Array.isArray(raw))
|
|
85
|
+
return [];
|
|
86
|
+
return raw.filter((k) => typeof k === "string");
|
|
87
|
+
}
|
|
88
|
+
/** Returns the `"<capabilities> · <level>"` tag, or `"(uncatalogued)"` when unknown. */
|
|
89
|
+
export function formatCapabilityTag(group) {
|
|
90
|
+
if (group.accessLevel === "unknown" ||
|
|
91
|
+
(group.capabilityCategories.length === 1 && group.capabilityCategories[0] === "unknown")) {
|
|
92
|
+
return "(uncatalogued)";
|
|
93
|
+
}
|
|
94
|
+
return `${group.capabilityCategories.join(", ")} · ${group.accessLevel}`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=mcp-grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-grouping.js","sourceRoot":"","sources":["../../../src/tui/util/mcp-grouping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface FormatLastScanInput {
|
|
2
|
+
scannedAt: string;
|
|
3
|
+
totalSkills: number;
|
|
4
|
+
/** Optional IANA timeZone. Tests pin to "UTC" for deterministic output. */
|
|
5
|
+
timeZone?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Pure formatter for the Settings → Scan History row.
|
|
9
|
+
*
|
|
10
|
+
* "2026-05-14 00:42 · 273 skills"
|
|
11
|
+
*
|
|
12
|
+
* Returns `"never"` when scannedAt is empty or unparseable so the caller
|
|
13
|
+
* does not have to special-case the empty state.
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatLastScan(input: FormatLastScanInput): string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure formatter for the Settings → Scan History row.
|
|
3
|
+
*
|
|
4
|
+
* "2026-05-14 00:42 · 273 skills"
|
|
5
|
+
*
|
|
6
|
+
* Returns `"never"` when scannedAt is empty or unparseable so the caller
|
|
7
|
+
* does not have to special-case the empty state.
|
|
8
|
+
*/
|
|
9
|
+
export function formatLastScan(input) {
|
|
10
|
+
if (!input.scannedAt)
|
|
11
|
+
return "never";
|
|
12
|
+
const date = new Date(input.scannedAt);
|
|
13
|
+
if (Number.isNaN(date.getTime()))
|
|
14
|
+
return "never";
|
|
15
|
+
const formatter = new Intl.DateTimeFormat("en-CA", {
|
|
16
|
+
year: "numeric",
|
|
17
|
+
month: "2-digit",
|
|
18
|
+
day: "2-digit",
|
|
19
|
+
hour: "2-digit",
|
|
20
|
+
minute: "2-digit",
|
|
21
|
+
hour12: false,
|
|
22
|
+
timeZone: input.timeZone
|
|
23
|
+
});
|
|
24
|
+
const parts = formatter.formatToParts(date);
|
|
25
|
+
const get = (type) => parts.find((p) => p.type === type)?.value ?? "";
|
|
26
|
+
const year = get("year");
|
|
27
|
+
const month = get("month");
|
|
28
|
+
const day = get("day");
|
|
29
|
+
const hour = normalizeHour(get("hour"));
|
|
30
|
+
const minute = get("minute");
|
|
31
|
+
const skillsLabel = input.totalSkills === 1 ? "skill" : "skills";
|
|
32
|
+
return `${year}-${month}-${day} ${hour}:${minute} · ${input.totalSkills} ${skillsLabel}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Intl.DateTimeFormat with `hour12: false` and `hour: "2-digit"` sometimes
|
|
36
|
+
* emits "24" at midnight in certain ICU versions; we normalize that to "00".
|
|
37
|
+
*/
|
|
38
|
+
function normalizeHour(raw) {
|
|
39
|
+
if (raw === "24")
|
|
40
|
+
return "00";
|
|
41
|
+
return raw;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=scan-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-history.js","sourceRoot":"","sources":["../../../src/tui/util/scan-history.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,OAAO,CAAC;IAEjD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACjD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,CAAC,IAAkC,EAAU,EAAE,CACzD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE7B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjE,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,MAAM,MAAM,KAAK,CAAC,WAAW,IAAI,WAAW,EAAE,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function filterSkillsByQuery(skills, query) {
|
|
2
|
+
if (!query || query.length === 0)
|
|
3
|
+
return skills;
|
|
4
|
+
const needle = query.toLowerCase();
|
|
5
|
+
return skills.filter((skill) => skill.name.toLowerCase().includes(needle));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=skill-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-filter.js","sourceRoot":"","sources":["../../../src/tui/util/skill-filter.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CACjC,MAA4B,EAC5B,KAAyB;IAEzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const SKILL_KIND_ORDER = [
|
|
2
|
+
"mcp_server",
|
|
3
|
+
"agent_skill",
|
|
4
|
+
"skills_sh_skill",
|
|
5
|
+
"custom_agents",
|
|
6
|
+
"custom_commands",
|
|
7
|
+
"custom_prompts",
|
|
8
|
+
"custom_tools",
|
|
9
|
+
"rules",
|
|
10
|
+
"plugins",
|
|
11
|
+
"memory_file"
|
|
12
|
+
];
|
|
13
|
+
export function groupSkillsByKind(skills) {
|
|
14
|
+
const byKind = new Map();
|
|
15
|
+
for (const skill of skills) {
|
|
16
|
+
const list = byKind.get(skill.kind) ?? [];
|
|
17
|
+
list.push(skill);
|
|
18
|
+
byKind.set(skill.kind, list);
|
|
19
|
+
}
|
|
20
|
+
for (const list of byKind.values()) {
|
|
21
|
+
list.sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: "base" }));
|
|
22
|
+
}
|
|
23
|
+
const ordered = new Map();
|
|
24
|
+
for (const kind of SKILL_KIND_ORDER) {
|
|
25
|
+
const list = byKind.get(kind);
|
|
26
|
+
if (list && list.length > 0)
|
|
27
|
+
ordered.set(kind, list);
|
|
28
|
+
}
|
|
29
|
+
return ordered;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=skill-grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-grouping.js","sourceRoot":"","sources":["../../../src/tui/util/skill-grouping.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,YAAY;IACZ,aAAa;IACb,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,cAAc;IACd,OAAO;IACP,SAAS;IACT,aAAa;CACd,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,MAA4B;IAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
export type ToolId = "claude" | "codex" | "cursor" | "gemini" | "opencode" | "skills-sh";
|
|
2
|
+
export type SkillKind = "mcp_server" | "custom_commands" | "custom_agents" | "custom_prompts" | "custom_tools" | "plugins" | "rules" | "memory_file" | "agent_skill" | "skills_sh_skill";
|
|
3
|
+
export type SkillSource = "config" | "directory";
|
|
4
|
+
export type Scope = "user" | "project";
|
|
5
|
+
export type FindingScope = Scope | "cross_tool";
|
|
6
|
+
export type AccessLevel = "limited" | "moderate" | "broad" | "unknown";
|
|
7
|
+
export type CapabilityCategory = "filesystem" | "network" | "browser" | "database" | "code_hosting" | "communication" | "shell" | "memory" | "automation" | "unknown";
|
|
8
|
+
export interface Skill {
|
|
9
|
+
id: string;
|
|
10
|
+
toolId: ToolId;
|
|
11
|
+
kind: SkillKind;
|
|
12
|
+
name: string;
|
|
13
|
+
summary: string;
|
|
14
|
+
scope: Scope;
|
|
15
|
+
sourcePath: string;
|
|
16
|
+
source: SkillSource;
|
|
17
|
+
capabilityCategories: CapabilityCategory[];
|
|
18
|
+
accessLevel: AccessLevel;
|
|
19
|
+
details?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface Finding {
|
|
22
|
+
id: string;
|
|
23
|
+
toolIds: ToolId[];
|
|
24
|
+
title: string;
|
|
25
|
+
message: string;
|
|
26
|
+
category: "broad_access_capability" | "unknown_capability" | "secret_reference" | "duplicate_mcp" | "dangerous_pattern" | "skipped_sensitive_file" | "parse_issue";
|
|
27
|
+
accessLevel: AccessLevel;
|
|
28
|
+
scope: FindingScope;
|
|
29
|
+
sourcePaths: string[];
|
|
30
|
+
relatedSkillIds: string[];
|
|
31
|
+
recommendation: string;
|
|
32
|
+
}
|
|
33
|
+
export interface Warning {
|
|
34
|
+
id: string;
|
|
35
|
+
message: string;
|
|
36
|
+
path?: string;
|
|
37
|
+
reason: "sensitive_file_skipped" | "file_too_large" | "parse_failed" | "adapter_timeout" | "permission_denied" | "not_found" | "remote_reference_skipped" | "non_disk_config_skipped" | "symlink_skipped" | "unknown";
|
|
38
|
+
}
|
|
39
|
+
export interface ToolStats {
|
|
40
|
+
mcpServers: number;
|
|
41
|
+
customCommands: number;
|
|
42
|
+
customAgents: number;
|
|
43
|
+
customPrompts: number;
|
|
44
|
+
customTools: number;
|
|
45
|
+
plugins: number;
|
|
46
|
+
rules: number;
|
|
47
|
+
memoryFiles: number;
|
|
48
|
+
agentSkills: number;
|
|
49
|
+
skillsShSkills: number;
|
|
50
|
+
findings: number;
|
|
51
|
+
}
|
|
52
|
+
export interface AITool {
|
|
53
|
+
id: ToolId;
|
|
54
|
+
name: string;
|
|
55
|
+
description: string;
|
|
56
|
+
detected: boolean;
|
|
57
|
+
detectedPaths: string[];
|
|
58
|
+
skills: Skill[];
|
|
59
|
+
findings: Finding[];
|
|
60
|
+
warnings: Warning[];
|
|
61
|
+
stats: ToolStats;
|
|
62
|
+
}
|
|
63
|
+
export interface ScanSummary {
|
|
64
|
+
detectedTools: number;
|
|
65
|
+
totalSkills: number;
|
|
66
|
+
totalMcpServers: number;
|
|
67
|
+
uniqueMcpServers: number;
|
|
68
|
+
customCommands: number;
|
|
69
|
+
customTools: number;
|
|
70
|
+
plugins: number;
|
|
71
|
+
memoryFiles: number;
|
|
72
|
+
agentSkills: number;
|
|
73
|
+
skillsShSkills: number;
|
|
74
|
+
totalFindings: number;
|
|
75
|
+
broadAccessFindings: number;
|
|
76
|
+
}
|
|
77
|
+
export interface ScanResult {
|
|
78
|
+
scannedAt: string;
|
|
79
|
+
cwd: string;
|
|
80
|
+
homeDir: string;
|
|
81
|
+
tools: AITool[];
|
|
82
|
+
findings: Finding[];
|
|
83
|
+
warnings: Warning[];
|
|
84
|
+
summary: ScanSummary;
|
|
85
|
+
}
|
|
86
|
+
export interface MultiProjectTotals {
|
|
87
|
+
projectCount: number;
|
|
88
|
+
skillsAcrossProjects: number;
|
|
89
|
+
userScopeSkills: number;
|
|
90
|
+
}
|
|
91
|
+
export interface ProjectScan {
|
|
92
|
+
projectPath: string;
|
|
93
|
+
displayPath: string;
|
|
94
|
+
scan: ScanResult;
|
|
95
|
+
}
|
|
96
|
+
export interface MultiProjectScanResult {
|
|
97
|
+
scannedAt: string;
|
|
98
|
+
cwd: string;
|
|
99
|
+
homeDir: string;
|
|
100
|
+
devRoots: string[];
|
|
101
|
+
userScope: ScanResult;
|
|
102
|
+
projects: ProjectScan[];
|
|
103
|
+
warnings: Warning[];
|
|
104
|
+
totals: MultiProjectTotals;
|
|
105
|
+
}
|
|
106
|
+
export declare function createMultiProjectTotals(input: {
|
|
107
|
+
userScopeSkillCount: number;
|
|
108
|
+
projectSkillCounts: readonly number[];
|
|
109
|
+
}): MultiProjectTotals;
|
|
110
|
+
export declare const TOOL_DEFINITIONS: readonly [{
|
|
111
|
+
readonly id: "claude";
|
|
112
|
+
readonly name: "Claude";
|
|
113
|
+
readonly description: "Claude Code local configuration and extensions.";
|
|
114
|
+
}, {
|
|
115
|
+
readonly id: "codex";
|
|
116
|
+
readonly name: "Codex";
|
|
117
|
+
readonly description: "Codex local configuration, prompts, and MCP servers.";
|
|
118
|
+
}, {
|
|
119
|
+
readonly id: "cursor";
|
|
120
|
+
readonly name: "Cursor";
|
|
121
|
+
readonly description: "Cursor local MCP configuration and project rules.";
|
|
122
|
+
}, {
|
|
123
|
+
readonly id: "gemini";
|
|
124
|
+
readonly name: "Gemini";
|
|
125
|
+
readonly description: "Gemini CLI local configuration and commands.";
|
|
126
|
+
}, {
|
|
127
|
+
readonly id: "opencode";
|
|
128
|
+
readonly name: "OpenCode";
|
|
129
|
+
readonly description: "OpenCode local agents, commands, tools, plugins, and skills.";
|
|
130
|
+
}, {
|
|
131
|
+
readonly id: "skills-sh";
|
|
132
|
+
readonly name: "skills.sh";
|
|
133
|
+
readonly description: "skills.sh-compatible local skill directories.";
|
|
134
|
+
}];
|
|
135
|
+
export declare function createToolStats(skills?: readonly Skill[], findings?: readonly Finding[]): ToolStats;
|
|
136
|
+
export declare function createEmptyStats(): ToolStats;
|
|
137
|
+
export declare function createEmptyTool(toolId: ToolId): AITool;
|
|
138
|
+
export declare function createAllEmptyTools(): AITool[];
|
|
139
|
+
export declare function createWarning(input: Omit<Warning, "id"> & {
|
|
140
|
+
id?: string;
|
|
141
|
+
}): Warning;
|
|
142
|
+
export declare function createFinding(input: Omit<Finding, "id"> & {
|
|
143
|
+
id?: string;
|
|
144
|
+
}): Finding;
|
|
145
|
+
export declare function createSkillId(input: {
|
|
146
|
+
toolId: ToolId;
|
|
147
|
+
kind: SkillKind;
|
|
148
|
+
name: string;
|
|
149
|
+
sourcePath: string;
|
|
150
|
+
}): string;
|
|
151
|
+
export declare function createScanSummary(tools: AITool[]): ScanSummary;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export function createMultiProjectTotals(input) {
|
|
2
|
+
const skillsAcrossProjects = input.projectSkillCounts.reduce((sum, n) => sum + n, 0);
|
|
3
|
+
return {
|
|
4
|
+
projectCount: input.projectSkillCounts.length,
|
|
5
|
+
skillsAcrossProjects,
|
|
6
|
+
userScopeSkills: input.userScopeSkillCount
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export const TOOL_DEFINITIONS = [
|
|
10
|
+
{
|
|
11
|
+
id: "claude",
|
|
12
|
+
name: "Claude",
|
|
13
|
+
description: "Claude Code local configuration and extensions."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "codex",
|
|
17
|
+
name: "Codex",
|
|
18
|
+
description: "Codex local configuration, prompts, and MCP servers."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "cursor",
|
|
22
|
+
name: "Cursor",
|
|
23
|
+
description: "Cursor local MCP configuration and project rules."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "gemini",
|
|
27
|
+
name: "Gemini",
|
|
28
|
+
description: "Gemini CLI local configuration and commands."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "opencode",
|
|
32
|
+
name: "OpenCode",
|
|
33
|
+
description: "OpenCode local agents, commands, tools, plugins, and skills."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "skills-sh",
|
|
37
|
+
name: "skills.sh",
|
|
38
|
+
description: "skills.sh-compatible local skill directories."
|
|
39
|
+
}
|
|
40
|
+
];
|
|
41
|
+
export function createToolStats(skills = [], findings = []) {
|
|
42
|
+
return {
|
|
43
|
+
mcpServers: countSkills(skills, "mcp_server"),
|
|
44
|
+
customCommands: countSkills(skills, "custom_commands"),
|
|
45
|
+
customAgents: countSkills(skills, "custom_agents"),
|
|
46
|
+
customPrompts: countSkills(skills, "custom_prompts"),
|
|
47
|
+
customTools: countSkills(skills, "custom_tools"),
|
|
48
|
+
plugins: countSkills(skills, "plugins"),
|
|
49
|
+
rules: countSkills(skills, "rules"),
|
|
50
|
+
memoryFiles: countSkills(skills, "memory_file"),
|
|
51
|
+
agentSkills: countSkills(skills, "agent_skill"),
|
|
52
|
+
skillsShSkills: countSkills(skills, "skills_sh_skill"),
|
|
53
|
+
findings: findings.length
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function createEmptyStats() {
|
|
57
|
+
return createToolStats();
|
|
58
|
+
}
|
|
59
|
+
export function createEmptyTool(toolId) {
|
|
60
|
+
const definition = TOOL_DEFINITIONS.find((tool) => tool.id === toolId);
|
|
61
|
+
if (!definition) {
|
|
62
|
+
throw new Error(`Unknown tool id: ${toolId}`);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
id: definition.id,
|
|
66
|
+
name: definition.name,
|
|
67
|
+
description: definition.description,
|
|
68
|
+
detected: false,
|
|
69
|
+
detectedPaths: [],
|
|
70
|
+
skills: [],
|
|
71
|
+
findings: [],
|
|
72
|
+
warnings: [],
|
|
73
|
+
stats: createEmptyStats()
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export function createAllEmptyTools() {
|
|
77
|
+
return TOOL_DEFINITIONS.map((tool) => createEmptyTool(tool.id));
|
|
78
|
+
}
|
|
79
|
+
export function createWarning(input) {
|
|
80
|
+
return {
|
|
81
|
+
id: input.id ?? normalizeId(["warning", input.reason, input.path ?? input.message]),
|
|
82
|
+
message: input.message,
|
|
83
|
+
path: input.path,
|
|
84
|
+
reason: input.reason
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function createFinding(input) {
|
|
88
|
+
return {
|
|
89
|
+
id: input.id ??
|
|
90
|
+
normalizeId([
|
|
91
|
+
"finding",
|
|
92
|
+
input.category,
|
|
93
|
+
input.title,
|
|
94
|
+
...input.toolIds
|
|
95
|
+
]),
|
|
96
|
+
toolIds: input.toolIds,
|
|
97
|
+
title: input.title,
|
|
98
|
+
message: input.message,
|
|
99
|
+
category: input.category,
|
|
100
|
+
accessLevel: input.accessLevel,
|
|
101
|
+
scope: input.scope,
|
|
102
|
+
sourcePaths: input.sourcePaths,
|
|
103
|
+
relatedSkillIds: input.relatedSkillIds,
|
|
104
|
+
recommendation: input.recommendation
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function createSkillId(input) {
|
|
108
|
+
return normalizeId([input.toolId, input.kind, input.name, input.sourcePath]);
|
|
109
|
+
}
|
|
110
|
+
export function createScanSummary(tools) {
|
|
111
|
+
const allSkills = tools.flatMap((tool) => tool.skills);
|
|
112
|
+
const allFindings = tools.flatMap((tool) => tool.findings);
|
|
113
|
+
const uniqueMcpServers = new Set(allSkills
|
|
114
|
+
.filter((skill) => skill.kind === "mcp_server")
|
|
115
|
+
.map((skill) => skill.name.toLowerCase()));
|
|
116
|
+
return {
|
|
117
|
+
detectedTools: tools.filter((tool) => tool.detected).length,
|
|
118
|
+
totalSkills: allSkills.length,
|
|
119
|
+
totalMcpServers: tools.reduce((count, tool) => count + tool.stats.mcpServers, 0),
|
|
120
|
+
uniqueMcpServers: uniqueMcpServers.size,
|
|
121
|
+
customCommands: tools.reduce((count, tool) => count + tool.stats.customCommands, 0),
|
|
122
|
+
customTools: tools.reduce((count, tool) => count + tool.stats.customTools, 0),
|
|
123
|
+
plugins: tools.reduce((count, tool) => count + tool.stats.plugins, 0),
|
|
124
|
+
memoryFiles: tools.reduce((count, tool) => count + tool.stats.memoryFiles, 0),
|
|
125
|
+
agentSkills: tools.reduce((count, tool) => count + tool.stats.agentSkills, 0),
|
|
126
|
+
skillsShSkills: tools.reduce((count, tool) => count + tool.stats.skillsShSkills, 0),
|
|
127
|
+
totalFindings: allFindings.length,
|
|
128
|
+
broadAccessFindings: allFindings.filter((finding) => finding.accessLevel === "broad").length
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function normalizeId(parts) {
|
|
132
|
+
return parts
|
|
133
|
+
.join(":")
|
|
134
|
+
.trim()
|
|
135
|
+
.toLowerCase()
|
|
136
|
+
.replace(/[^a-z0-9._/-]+/g, "-")
|
|
137
|
+
.replace(/-+/g, "-")
|
|
138
|
+
.replace(/^-|-$/g, "");
|
|
139
|
+
}
|
|
140
|
+
function countSkills(skills, kind) {
|
|
141
|
+
return skills.filter((skill) => skill.kind === kind).length;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function formatError(error: unknown): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|