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.
Files changed (270) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +369 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +192 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/access.d.ts +6 -0
  7. package/dist/commands/access.js +12 -0
  8. package/dist/commands/access.js.map +1 -0
  9. package/dist/commands/caps.d.ts +6 -0
  10. package/dist/commands/caps.js +12 -0
  11. package/dist/commands/caps.js.map +1 -0
  12. package/dist/commands/discover.d.ts +10 -0
  13. package/dist/commands/discover.js +120 -0
  14. package/dist/commands/discover.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +6 -0
  16. package/dist/commands/doctor.js +12 -0
  17. package/dist/commands/doctor.js.map +1 -0
  18. package/dist/commands/launch-tui.d.ts +15 -0
  19. package/dist/commands/launch-tui.js +53 -0
  20. package/dist/commands/launch-tui.js.map +1 -0
  21. package/dist/commands/list.d.ts +11 -0
  22. package/dist/commands/list.js +51 -0
  23. package/dist/commands/list.js.map +1 -0
  24. package/dist/commands/mcp.d.ts +6 -0
  25. package/dist/commands/mcp.js +12 -0
  26. package/dist/commands/mcp.js.map +1 -0
  27. package/dist/commands/scan-all.d.ts +15 -0
  28. package/dist/commands/scan-all.js +32 -0
  29. package/dist/commands/scan-all.js.map +1 -0
  30. package/dist/commands/show.d.ts +7 -0
  31. package/dist/commands/show.js +12 -0
  32. package/dist/commands/show.js.map +1 -0
  33. package/dist/commands/watch.d.ts +32 -0
  34. package/dist/commands/watch.js +205 -0
  35. package/dist/commands/watch.js.map +1 -0
  36. package/dist/config/ankui-config.d.ts +13 -0
  37. package/dist/config/ankui-config.js +123 -0
  38. package/dist/config/ankui-config.js.map +1 -0
  39. package/dist/scanner/access-review.d.ts +2 -0
  40. package/dist/scanner/access-review.js +183 -0
  41. package/dist/scanner/access-review.js.map +1 -0
  42. package/dist/scanner/adapters/claude.d.ts +2 -0
  43. package/dist/scanner/adapters/claude.js +298 -0
  44. package/dist/scanner/adapters/claude.js.map +1 -0
  45. package/dist/scanner/adapters/codex.d.ts +2 -0
  46. package/dist/scanner/adapters/codex.js +152 -0
  47. package/dist/scanner/adapters/codex.js.map +1 -0
  48. package/dist/scanner/adapters/cursor.d.ts +2 -0
  49. package/dist/scanner/adapters/cursor.js +114 -0
  50. package/dist/scanner/adapters/cursor.js.map +1 -0
  51. package/dist/scanner/adapters/gemini.d.ts +2 -0
  52. package/dist/scanner/adapters/gemini.js +191 -0
  53. package/dist/scanner/adapters/gemini.js.map +1 -0
  54. package/dist/scanner/adapters/index.d.ts +35 -0
  55. package/dist/scanner/adapters/index.js +85 -0
  56. package/dist/scanner/adapters/index.js.map +1 -0
  57. package/dist/scanner/adapters/opencode.d.ts +2 -0
  58. package/dist/scanner/adapters/opencode.js +231 -0
  59. package/dist/scanner/adapters/opencode.js.map +1 -0
  60. package/dist/scanner/adapters/shared.d.ts +57 -0
  61. package/dist/scanner/adapters/shared.js +239 -0
  62. package/dist/scanner/adapters/shared.js.map +1 -0
  63. package/dist/scanner/adapters/skills-sh.d.ts +2 -0
  64. package/dist/scanner/adapters/skills-sh.js +71 -0
  65. package/dist/scanner/adapters/skills-sh.js.map +1 -0
  66. package/dist/scanner/capability-map.d.ts +8 -0
  67. package/dist/scanner/capability-map.js +57 -0
  68. package/dist/scanner/capability-map.js.map +1 -0
  69. package/dist/scanner/discovery.d.ts +31 -0
  70. package/dist/scanner/discovery.js +320 -0
  71. package/dist/scanner/discovery.js.map +1 -0
  72. package/dist/scanner/filesystem-crawler.d.ts +32 -0
  73. package/dist/scanner/filesystem-crawler.js +210 -0
  74. package/dist/scanner/filesystem-crawler.js.map +1 -0
  75. package/dist/scanner/index.d.ts +8 -0
  76. package/dist/scanner/index.js +120 -0
  77. package/dist/scanner/index.js.map +1 -0
  78. package/dist/scanner/multi-project.d.ts +31 -0
  79. package/dist/scanner/multi-project.js +227 -0
  80. package/dist/scanner/multi-project.js.map +1 -0
  81. package/dist/scanner/parallel.d.ts +4 -0
  82. package/dist/scanner/parallel.js +41 -0
  83. package/dist/scanner/parallel.js.map +1 -0
  84. package/dist/scanner/parsing.d.ts +9 -0
  85. package/dist/scanner/parsing.js +135 -0
  86. package/dist/scanner/parsing.js.map +1 -0
  87. package/dist/scanner/paths.d.ts +8 -0
  88. package/dist/scanner/paths.js +39 -0
  89. package/dist/scanner/paths.js.map +1 -0
  90. package/dist/scanner/preview.d.ts +12 -0
  91. package/dist/scanner/preview.js +29 -0
  92. package/dist/scanner/preview.js.map +1 -0
  93. package/dist/scanner/project-discovery.d.ts +11 -0
  94. package/dist/scanner/project-discovery.js +35 -0
  95. package/dist/scanner/project-discovery.js.map +1 -0
  96. package/dist/scanner/ripgrep.d.ts +11 -0
  97. package/dist/scanner/ripgrep.js +61 -0
  98. package/dist/scanner/ripgrep.js.map +1 -0
  99. package/dist/scanner/safety.d.ts +37 -0
  100. package/dist/scanner/safety.js +330 -0
  101. package/dist/scanner/safety.js.map +1 -0
  102. package/dist/scanner/skill-naming.d.ts +5 -0
  103. package/dist/scanner/skill-naming.js +53 -0
  104. package/dist/scanner/skill-naming.js.map +1 -0
  105. package/dist/scanner/watcher.d.ts +15 -0
  106. package/dist/scanner/watcher.js +71 -0
  107. package/dist/scanner/watcher.js.map +1 -0
  108. package/dist/tui/App.d.ts +33 -0
  109. package/dist/tui/App.js +201 -0
  110. package/dist/tui/App.js.map +1 -0
  111. package/dist/tui/components/Breadcrumb.d.ts +10 -0
  112. package/dist/tui/components/Breadcrumb.js +11 -0
  113. package/dist/tui/components/Breadcrumb.js.map +1 -0
  114. package/dist/tui/components/DisclosureRow.d.ts +17 -0
  115. package/dist/tui/components/DisclosureRow.js +13 -0
  116. package/dist/tui/components/DisclosureRow.js.map +1 -0
  117. package/dist/tui/components/DotLeaderRow.d.ts +17 -0
  118. package/dist/tui/components/DotLeaderRow.js +34 -0
  119. package/dist/tui/components/DotLeaderRow.js.map +1 -0
  120. package/dist/tui/components/EmptyStateWhisper.d.ts +5 -0
  121. package/dist/tui/components/EmptyStateWhisper.js +6 -0
  122. package/dist/tui/components/EmptyStateWhisper.js.map +1 -0
  123. package/dist/tui/components/Frame.d.ts +15 -0
  124. package/dist/tui/components/Frame.js +21 -0
  125. package/dist/tui/components/Frame.js.map +1 -0
  126. package/dist/tui/components/IdleWhisper.d.ts +11 -0
  127. package/dist/tui/components/IdleWhisper.js +12 -0
  128. package/dist/tui/components/IdleWhisper.js.map +1 -0
  129. package/dist/tui/components/KeyHint.d.ts +13 -0
  130. package/dist/tui/components/KeyHint.js +12 -0
  131. package/dist/tui/components/KeyHint.js.map +1 -0
  132. package/dist/tui/components/LoadingSplash.d.ts +12 -0
  133. package/dist/tui/components/LoadingSplash.js +55 -0
  134. package/dist/tui/components/LoadingSplash.js.map +1 -0
  135. package/dist/tui/components/ProgressBar.d.ts +16 -0
  136. package/dist/tui/components/ProgressBar.js +24 -0
  137. package/dist/tui/components/ProgressBar.js.map +1 -0
  138. package/dist/tui/components/SearchBox.d.ts +5 -0
  139. package/dist/tui/components/SearchBox.js +6 -0
  140. package/dist/tui/components/SearchBox.js.map +1 -0
  141. package/dist/tui/components/SectionHeader.d.ts +12 -0
  142. package/dist/tui/components/SectionHeader.js +14 -0
  143. package/dist/tui/components/SectionHeader.js.map +1 -0
  144. package/dist/tui/components/SkillViewport.d.ts +8 -0
  145. package/dist/tui/components/SkillViewport.js +42 -0
  146. package/dist/tui/components/SkillViewport.js.map +1 -0
  147. package/dist/tui/components/Spinner.d.ts +11 -0
  148. package/dist/tui/components/Spinner.js +13 -0
  149. package/dist/tui/components/Spinner.js.map +1 -0
  150. package/dist/tui/components/StatusPill.d.ts +13 -0
  151. package/dist/tui/components/StatusPill.js +15 -0
  152. package/dist/tui/components/StatusPill.js.map +1 -0
  153. package/dist/tui/components/TabBar.d.ts +20 -0
  154. package/dist/tui/components/TabBar.js +26 -0
  155. package/dist/tui/components/TabBar.js.map +1 -0
  156. package/dist/tui/components/TextInput.d.ts +13 -0
  157. package/dist/tui/components/TextInput.js +34 -0
  158. package/dist/tui/components/TextInput.js.map +1 -0
  159. package/dist/tui/hooks/use-idle-whisper.d.ts +17 -0
  160. package/dist/tui/hooks/use-idle-whisper.js +66 -0
  161. package/dist/tui/hooks/use-idle-whisper.js.map +1 -0
  162. package/dist/tui/hooks/use-rotating-message.d.ts +20 -0
  163. package/dist/tui/hooks/use-rotating-message.js +34 -0
  164. package/dist/tui/hooks/use-rotating-message.js.map +1 -0
  165. package/dist/tui/input/use-keys.d.ts +16 -0
  166. package/dist/tui/input/use-keys.js +32 -0
  167. package/dist/tui/input/use-keys.js.map +1 -0
  168. package/dist/tui/messages.d.ts +18 -0
  169. package/dist/tui/messages.js +59 -0
  170. package/dist/tui/messages.js.map +1 -0
  171. package/dist/tui/render.d.ts +12 -0
  172. package/dist/tui/render.js +112 -0
  173. package/dist/tui/render.js.map +1 -0
  174. package/dist/tui/screens/AccessTab.d.ts +6 -0
  175. package/dist/tui/screens/AccessTab.js +26 -0
  176. package/dist/tui/screens/AccessTab.js.map +1 -0
  177. package/dist/tui/screens/DoctorTab.d.ts +6 -0
  178. package/dist/tui/screens/DoctorTab.js +24 -0
  179. package/dist/tui/screens/DoctorTab.js.map +1 -0
  180. package/dist/tui/screens/FirstRunScan.d.ts +11 -0
  181. package/dist/tui/screens/FirstRunScan.js +128 -0
  182. package/dist/tui/screens/FirstRunScan.js.map +1 -0
  183. package/dist/tui/screens/McpsTab.d.ts +6 -0
  184. package/dist/tui/screens/McpsTab.js +30 -0
  185. package/dist/tui/screens/McpsTab.js.map +1 -0
  186. package/dist/tui/screens/Overview.d.ts +6 -0
  187. package/dist/tui/screens/Overview.js +75 -0
  188. package/dist/tui/screens/Overview.js.map +1 -0
  189. package/dist/tui/screens/ProjectDrillIn.d.ts +10 -0
  190. package/dist/tui/screens/ProjectDrillIn.js +16 -0
  191. package/dist/tui/screens/ProjectDrillIn.js.map +1 -0
  192. package/dist/tui/screens/Settings.d.ts +8 -0
  193. package/dist/tui/screens/Settings.js +71 -0
  194. package/dist/tui/screens/Settings.js.map +1 -0
  195. package/dist/tui/screens/ToolTab.d.ts +9 -0
  196. package/dist/tui/screens/ToolTab.js +38 -0
  197. package/dist/tui/screens/ToolTab.js.map +1 -0
  198. package/dist/tui/screens/UserScopeDrillIn.d.ts +13 -0
  199. package/dist/tui/screens/UserScopeDrillIn.js +15 -0
  200. package/dist/tui/screens/UserScopeDrillIn.js.map +1 -0
  201. package/dist/tui/state/navigation.d.ts +1 -0
  202. package/dist/tui/state/navigation.js +11 -0
  203. package/dist/tui/state/navigation.js.map +1 -0
  204. package/dist/tui/state/settings-state.d.ts +22 -0
  205. package/dist/tui/state/settings-state.js +30 -0
  206. package/dist/tui/state/settings-state.js.map +1 -0
  207. package/dist/tui/state/tui-state.d.ts +57 -0
  208. package/dist/tui/state/tui-state.js +86 -0
  209. package/dist/tui/state/tui-state.js.map +1 -0
  210. package/dist/tui/theme/borders.d.ts +20 -0
  211. package/dist/tui/theme/borders.js +25 -0
  212. package/dist/tui/theme/borders.js.map +1 -0
  213. package/dist/tui/theme/colors.d.ts +14 -0
  214. package/dist/tui/theme/colors.js +18 -0
  215. package/dist/tui/theme/colors.js.map +1 -0
  216. package/dist/tui/theme/icons.d.ts +30 -0
  217. package/dist/tui/theme/icons.js +51 -0
  218. package/dist/tui/theme/icons.js.map +1 -0
  219. package/dist/tui/util/doctor-grouping.d.ts +27 -0
  220. package/dist/tui/util/doctor-grouping.js +67 -0
  221. package/dist/tui/util/doctor-grouping.js.map +1 -0
  222. package/dist/tui/util/finding-grouping.d.ts +24 -0
  223. package/dist/tui/util/finding-grouping.js +43 -0
  224. package/dist/tui/util/finding-grouping.js.map +1 -0
  225. package/dist/tui/util/mcp-grouping.d.ts +27 -0
  226. package/dist/tui/util/mcp-grouping.js +96 -0
  227. package/dist/tui/util/mcp-grouping.js.map +1 -0
  228. package/dist/tui/util/scan-history.d.ts +15 -0
  229. package/dist/tui/util/scan-history.js +43 -0
  230. package/dist/tui/util/scan-history.js.map +1 -0
  231. package/dist/tui/util/skill-filter.d.ts +2 -0
  232. package/dist/tui/util/skill-filter.js +7 -0
  233. package/dist/tui/util/skill-filter.js.map +1 -0
  234. package/dist/tui/util/skill-grouping.d.ts +3 -0
  235. package/dist/tui/util/skill-grouping.js +31 -0
  236. package/dist/tui/util/skill-grouping.js.map +1 -0
  237. package/dist/types.d.ts +151 -0
  238. package/dist/types.js +143 -0
  239. package/dist/types.js.map +1 -0
  240. package/dist/utils/errors.d.ts +1 -0
  241. package/dist/utils/errors.js +7 -0
  242. package/dist/utils/errors.js.map +1 -0
  243. package/dist/utils/format-access.d.ts +3 -0
  244. package/dist/utils/format-access.js +94 -0
  245. package/dist/utils/format-access.js.map +1 -0
  246. package/dist/utils/format-caps.d.ts +3 -0
  247. package/dist/utils/format-caps.js +139 -0
  248. package/dist/utils/format-caps.js.map +1 -0
  249. package/dist/utils/format-doctor.d.ts +3 -0
  250. package/dist/utils/format-doctor.js +105 -0
  251. package/dist/utils/format-doctor.js.map +1 -0
  252. package/dist/utils/format-list.d.ts +7 -0
  253. package/dist/utils/format-list.js +112 -0
  254. package/dist/utils/format-list.js.map +1 -0
  255. package/dist/utils/format-mcp.d.ts +3 -0
  256. package/dist/utils/format-mcp.js +130 -0
  257. package/dist/utils/format-mcp.js.map +1 -0
  258. package/dist/utils/format-multi-project.d.ts +3 -0
  259. package/dist/utils/format-multi-project.js +100 -0
  260. package/dist/utils/format-multi-project.js.map +1 -0
  261. package/dist/utils/format-show.d.ts +6 -0
  262. package/dist/utils/format-show.js +143 -0
  263. package/dist/utils/format-show.js.map +1 -0
  264. package/dist/utils/format.d.ts +3 -0
  265. package/dist/utils/format.js +53 -0
  266. package/dist/utils/format.js.map +1 -0
  267. package/dist/utils/paths.d.ts +1 -0
  268. package/dist/utils/paths.js +10 -0
  269. package/dist/utils/paths.js.map +1 -0
  270. package/package.json +61 -0
@@ -0,0 +1,57 @@
1
+ import { canonicalMcpName } from "./skill-naming.js";
2
+ const MCP_CAPABILITY_MAP = {
3
+ github: { capabilityCategories: ["code_hosting"], accessLevel: "moderate" },
4
+ gitlab: { capabilityCategories: ["code_hosting"], accessLevel: "moderate" },
5
+ postgres: { capabilityCategories: ["database"], accessLevel: "broad" },
6
+ mysql: { capabilityCategories: ["database"], accessLevel: "broad" },
7
+ sqlite: { capabilityCategories: ["database"], accessLevel: "broad" },
8
+ filesystem: { capabilityCategories: ["filesystem"], accessLevel: "broad" },
9
+ shell: { capabilityCategories: ["shell"], accessLevel: "broad" },
10
+ slack: { capabilityCategories: ["communication"], accessLevel: "moderate" },
11
+ discord: { capabilityCategories: ["communication"], accessLevel: "moderate" },
12
+ reddit: { capabilityCategories: ["communication"], accessLevel: "moderate" },
13
+ linear: { capabilityCategories: ["automation"], accessLevel: "moderate" },
14
+ jira: { capabilityCategories: ["automation"], accessLevel: "moderate" },
15
+ notion: { capabilityCategories: ["automation"], accessLevel: "moderate" },
16
+ puppeteer: { capabilityCategories: ["browser"], accessLevel: "broad" },
17
+ playwright: { capabilityCategories: ["browser"], accessLevel: "broad" },
18
+ browser: { capabilityCategories: ["browser"], accessLevel: "broad" },
19
+ sentry: { capabilityCategories: ["network"], accessLevel: "limited" },
20
+ context7: { capabilityCategories: ["network"], accessLevel: "limited" },
21
+ shadcn: { capabilityCategories: ["network"], accessLevel: "limited" },
22
+ vercel: { capabilityCategories: ["network", "automation"], accessLevel: "moderate" },
23
+ supabase: { capabilityCategories: ["database", "network"], accessLevel: "moderate" }
24
+ };
25
+ const UNKNOWN_CLASSIFICATION = {
26
+ capabilityCategories: ["unknown"],
27
+ accessLevel: "unknown"
28
+ };
29
+ export function mapMcpById(mcpId) {
30
+ if (!mcpId) {
31
+ return UNKNOWN_CLASSIFICATION;
32
+ }
33
+ return MCP_CAPABILITY_MAP[mcpId] ?? UNKNOWN_CLASSIFICATION;
34
+ }
35
+ const OPENCODE_TOOL_KEY_MAP = {
36
+ bash: { capabilityCategories: ["shell"], accessLevel: "broad" },
37
+ edit: { capabilityCategories: ["filesystem"], accessLevel: "broad" },
38
+ write: { capabilityCategories: ["filesystem"], accessLevel: "broad" },
39
+ read: { capabilityCategories: ["filesystem"], accessLevel: "moderate" },
40
+ webfetch: { capabilityCategories: ["network"], accessLevel: "moderate" },
41
+ websearch: { capabilityCategories: ["network"], accessLevel: "limited" },
42
+ skill: { capabilityCategories: ["automation"], accessLevel: "limited" }
43
+ };
44
+ export function mapOpenCodeToolKey(key) {
45
+ return OPENCODE_TOOL_KEY_MAP[key.toLowerCase()] ?? UNKNOWN_CLASSIFICATION;
46
+ }
47
+ export function enrichSkill(skill) {
48
+ if (skill.kind !== "mcp_server") {
49
+ return;
50
+ }
51
+ const naming = canonicalMcpName(skill.name);
52
+ const classification = mapMcpById(naming.mcpId);
53
+ skill.name = naming.canonical;
54
+ skill.capabilityCategories = classification.capabilityCategories;
55
+ skill.accessLevel = classification.accessLevel;
56
+ }
57
+ //# sourceMappingURL=capability-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-map.js","sourceRoot":"","sources":["../../src/scanner/capability-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type Scope, type ToolId, type Warning } from "../types.js";
2
+ type ExpectedEntryType = "file" | "directory";
3
+ type DiscoverySource = "known_user_path" | "known_project_path" | "opencode_env";
4
+ export interface DiscoveredPath {
5
+ toolId: ToolId;
6
+ scope: Scope;
7
+ path: string;
8
+ entryType: ExpectedEntryType;
9
+ source: DiscoverySource;
10
+ }
11
+ export interface SkippedPath {
12
+ toolId?: ToolId;
13
+ scope?: Scope;
14
+ path?: string;
15
+ reason: Warning["reason"];
16
+ warning: Warning;
17
+ }
18
+ export interface DiscoveryResult {
19
+ paths: DiscoveredPath[];
20
+ skippedPaths: SkippedPath[];
21
+ warnings: Warning[];
22
+ gitignorePatterns: string[];
23
+ }
24
+ export interface DiscoveryOptions {
25
+ cwd: string;
26
+ homeDir: string;
27
+ env?: Record<string, string | undefined>;
28
+ }
29
+ export declare function discover(options: DiscoveryOptions): Promise<DiscoveryResult>;
30
+ export declare function isIgnoredByRootGitignore(relativePath: string, patterns: string[]): boolean;
31
+ export {};
@@ -0,0 +1,320 @@
1
+ import path from "node:path";
2
+ import { createWarning } from "../types.js";
3
+ import { isPathInside, resolveLocalPath } from "./paths.js";
4
+ import { listRipgrepFiles } from "./ripgrep.js";
5
+ import { checkSafePath, safeReadTextFile } from "./safety.js";
6
+ const USER_PATHS = [
7
+ { toolIds: ["claude"], relativePath: ".claude", entryType: "directory" },
8
+ { toolIds: ["claude"], relativePath: ".claude.json", entryType: "file" },
9
+ { toolIds: ["codex"], relativePath: ".codex", entryType: "directory" },
10
+ { toolIds: ["cursor"], relativePath: ".cursor", entryType: "directory" },
11
+ { toolIds: ["gemini"], relativePath: ".gemini", entryType: "directory" },
12
+ { toolIds: ["opencode"], relativePath: ".config/opencode", entryType: "directory" },
13
+ { toolIds: ["skills-sh"], relativePath: ".skills", entryType: "directory" },
14
+ { toolIds: ["skills-sh"], relativePath: ".config/skills", entryType: "directory" }
15
+ ];
16
+ const PROJECT_FILE_PATHS = [
17
+ { toolIds: ["claude"], relativePath: "CLAUDE.md", entryType: "file" },
18
+ { toolIds: ["claude"], relativePath: "CLAUDE.local.md", entryType: "file" },
19
+ { toolIds: ["codex", "opencode"], relativePath: "AGENTS.md", entryType: "file" },
20
+ { toolIds: ["gemini"], relativePath: "GEMINI.md", entryType: "file" },
21
+ { toolIds: ["opencode"], relativePath: "opencode.json", entryType: "file" },
22
+ { toolIds: ["opencode"], relativePath: "opencode.jsonc", entryType: "file" },
23
+ { toolIds: ["cursor"], relativePath: ".cursorrules", entryType: "file" },
24
+ { toolIds: ["claude", "cursor"], relativePath: ".mcp.json", entryType: "file" }
25
+ ];
26
+ const PROJECT_DIRECTORY_PATHS = [
27
+ { toolIds: ["claude"], relativePath: ".claude", entryType: "directory" },
28
+ { toolIds: ["cursor"], relativePath: ".cursor", entryType: "directory" },
29
+ { toolIds: ["gemini"], relativePath: ".gemini", entryType: "directory" },
30
+ { toolIds: ["codex"], relativePath: ".codex", entryType: "directory" },
31
+ { toolIds: ["opencode"], relativePath: ".opencode", entryType: "directory" },
32
+ { toolIds: ["skills-sh"], relativePath: ".skills", entryType: "directory" }
33
+ ];
34
+ const PROJECT_FILE_NAMES = PROJECT_FILE_PATHS.map((candidate) => candidate.relativePath);
35
+ const PROJECT_KNOWN_FILE_PATHS = [
36
+ { toolIds: ["claude"], relativePath: ".claude/settings.json", entryType: "file" },
37
+ { toolIds: ["claude"], relativePath: ".claude/settings.local.json", entryType: "file" }
38
+ ];
39
+ const PROJECT_DISCOVERY_EXCLUDES = [
40
+ "**/.git/**",
41
+ "**/node_modules/**",
42
+ "**/dist/**",
43
+ "**/build/**",
44
+ "**/{session,sessions,history,histories,conversation,conversations}/**",
45
+ "**/.opencode/{auth,cache,log,logs,share,database,databases,db,runtime,session,sessions}/**",
46
+ "**/opencode/{auth,cache,log,logs,share,database,databases,db,runtime,session,sessions}/**"
47
+ ];
48
+ export async function discover(options) {
49
+ const cwd = path.resolve(options.cwd);
50
+ const homeDir = path.resolve(options.homeDir);
51
+ const state = createDiscoveryState();
52
+ const gitignore = await readRootGitignore(cwd);
53
+ for (const warning of gitignore.warnings) {
54
+ addWarning(state, warning);
55
+ }
56
+ await addKnownCandidates(state, USER_PATHS.map((candidate) => ({
57
+ ...candidate,
58
+ basePath: homeDir,
59
+ scope: "user",
60
+ source: "known_user_path"
61
+ })));
62
+ await discoverProjectFiles(state, cwd, gitignore.patterns);
63
+ await addKnownCandidates(state, PROJECT_DIRECTORY_PATHS.map((candidate) => ({
64
+ ...candidate,
65
+ basePath: cwd,
66
+ scope: "project",
67
+ source: "known_project_path"
68
+ })).filter((candidate) => !isIgnoredByRootGitignore(candidate.relativePath, gitignore.patterns)));
69
+ await addKnownCandidates(state, PROJECT_KNOWN_FILE_PATHS.map((candidate) => ({
70
+ ...candidate,
71
+ basePath: cwd,
72
+ scope: "project",
73
+ source: "known_project_path"
74
+ })).filter((candidate) => !isIgnoredByRootGitignore(candidate.relativePath, gitignore.patterns)));
75
+ await discoverOpenCodeEnvPaths(state, {
76
+ cwd,
77
+ homeDir,
78
+ env: options.env ?? process.env
79
+ });
80
+ return {
81
+ paths: state.paths,
82
+ skippedPaths: state.skippedPaths,
83
+ warnings: state.warnings,
84
+ gitignorePatterns: gitignore.patterns
85
+ };
86
+ }
87
+ function createDiscoveryState() {
88
+ return {
89
+ paths: [],
90
+ skippedPaths: [],
91
+ warnings: [],
92
+ pathKeys: new Set(),
93
+ warningKeys: new Set(),
94
+ skippedKeys: new Set()
95
+ };
96
+ }
97
+ async function addKnownCandidates(state, candidates) {
98
+ for (const candidate of candidates) {
99
+ await addAbsoluteCandidate(state, {
100
+ ...candidate,
101
+ path: path.resolve(candidate.basePath, candidate.relativePath),
102
+ sensitivePath: candidate.relativePath
103
+ });
104
+ }
105
+ }
106
+ async function discoverProjectFiles(state, cwd, gitignorePatterns) {
107
+ const rgResult = await listRipgrepFiles({
108
+ cwd,
109
+ excludeGlobs: PROJECT_DISCOVERY_EXCLUDES
110
+ });
111
+ for (const warning of rgResult.warnings) {
112
+ addWarning(state, warning);
113
+ }
114
+ const rootFiles = new Set(rgResult.paths
115
+ .map((entry) => normalizeRelativePath(entry))
116
+ .filter((entry) => path.posix.dirname(entry) === ".")
117
+ .filter((entry) => PROJECT_FILE_NAMES.includes(entry))
118
+ .filter((entry) => !isIgnoredByRootGitignore(entry, gitignorePatterns)));
119
+ const candidates = PROJECT_FILE_PATHS.filter((candidate) => rootFiles.has(candidate.relativePath)).map((candidate) => ({
120
+ ...candidate,
121
+ basePath: cwd,
122
+ scope: "project",
123
+ source: "known_project_path"
124
+ }));
125
+ await addKnownCandidates(state, candidates);
126
+ }
127
+ async function discoverOpenCodeEnvPaths(state, options) {
128
+ if (hasEnvValue(options.env.OPENCODE_CONFIG_CONTENT)) {
129
+ addSkippedWarning(state, {
130
+ toolId: "opencode",
131
+ path: "OPENCODE_CONFIG_CONTENT",
132
+ reason: "non_disk_config_skipped",
133
+ message: "Skipped OPENCODE_CONFIG_CONTENT because it is inline config, not a local disk path."
134
+ });
135
+ }
136
+ await addOpenCodeEnvPath(state, options, "OPENCODE_CONFIG", "file");
137
+ await addOpenCodeEnvPath(state, options, "OPENCODE_CONFIG_DIR", "directory");
138
+ }
139
+ async function addOpenCodeEnvPath(state, options, envName, entryType) {
140
+ const value = options.env[envName];
141
+ if (!hasEnvValue(value)) {
142
+ return;
143
+ }
144
+ if (isRemoteReference(value)) {
145
+ addSkippedWarning(state, {
146
+ toolId: "opencode",
147
+ path: envName,
148
+ reason: "remote_reference_skipped",
149
+ message: `Skipped ${envName} because it points to a remote reference, not a local disk path.`
150
+ });
151
+ return;
152
+ }
153
+ const resolvedPath = resolveLocalPath(value.trim(), {
154
+ cwd: options.cwd,
155
+ homeDir: options.homeDir
156
+ });
157
+ const scope = isPathInside(resolvedPath, options.cwd) ? "project" : "user";
158
+ await addAbsoluteCandidate(state, {
159
+ toolIds: ["opencode"],
160
+ scope,
161
+ path: resolvedPath,
162
+ sensitivePath: createEnvSensitivePath(resolvedPath, options),
163
+ entryType,
164
+ source: "opencode_env"
165
+ });
166
+ }
167
+ async function addAbsoluteCandidate(state, candidate) {
168
+ const normalizedPath = path.resolve(candidate.path);
169
+ const safety = await checkSafePath(normalizedPath, {
170
+ expectedType: candidate.entryType,
171
+ sensitivePath: candidate.sensitivePath,
172
+ warnOnMissing: false
173
+ });
174
+ if (!safety.ok) {
175
+ for (const toolId of candidate.toolIds) {
176
+ for (const warning of safety.warnings) {
177
+ addSkippedPath(state, {
178
+ toolId,
179
+ scope: candidate.scope,
180
+ path: normalizedPath,
181
+ reason: warning.reason,
182
+ warning
183
+ });
184
+ }
185
+ }
186
+ return;
187
+ }
188
+ for (const toolId of candidate.toolIds) {
189
+ const key = `${toolId}:${normalizedPath}`;
190
+ if (state.pathKeys.has(key)) {
191
+ continue;
192
+ }
193
+ state.pathKeys.add(key);
194
+ state.paths.push({
195
+ toolId,
196
+ scope: candidate.scope,
197
+ path: normalizedPath,
198
+ entryType: candidate.entryType,
199
+ source: candidate.source
200
+ });
201
+ }
202
+ }
203
+ function addSkippedWarning(state, input) {
204
+ const warning = createWarning({
205
+ reason: input.reason,
206
+ path: input.path,
207
+ message: input.message
208
+ });
209
+ addSkippedPath(state, {
210
+ toolId: input.toolId,
211
+ scope: input.scope,
212
+ path: input.path,
213
+ reason: input.reason,
214
+ warning
215
+ });
216
+ }
217
+ function addSkippedPath(state, skippedPath) {
218
+ addWarning(state, skippedPath.warning);
219
+ const key = `${skippedPath.toolId ?? ""}:${skippedPath.warning.id}`;
220
+ if (state.skippedKeys.has(key)) {
221
+ return;
222
+ }
223
+ state.skippedKeys.add(key);
224
+ state.skippedPaths.push(skippedPath);
225
+ }
226
+ function addWarning(state, warning) {
227
+ if (state.warningKeys.has(warning.id)) {
228
+ return;
229
+ }
230
+ state.warningKeys.add(warning.id);
231
+ state.warnings.push(warning);
232
+ }
233
+ function normalizeRelativePath(inputPath) {
234
+ return inputPath.split(/[\\/]+/).join("/");
235
+ }
236
+ async function readRootGitignore(cwd) {
237
+ const gitignorePath = path.join(cwd, ".gitignore");
238
+ const result = await safeReadTextFile(gitignorePath, {
239
+ sensitivePath: ".gitignore",
240
+ warnOnMissing: false
241
+ });
242
+ if (!result.ok) {
243
+ return {
244
+ patterns: [],
245
+ warnings: result.warnings
246
+ };
247
+ }
248
+ return {
249
+ patterns: result.value
250
+ .split(/\r?\n/)
251
+ .map((line) => line.trim())
252
+ .filter((line) => line.length > 0 && !line.startsWith("#")),
253
+ warnings: result.warnings
254
+ };
255
+ }
256
+ export function isIgnoredByRootGitignore(relativePath, patterns) {
257
+ let ignored = false;
258
+ for (const rawPattern of patterns) {
259
+ const negated = rawPattern.startsWith("!");
260
+ const pattern = normalizeGitignorePattern(negated ? rawPattern.slice(1) : rawPattern);
261
+ if (pattern.length === 0 || !matchesRootGitignorePattern(relativePath, pattern)) {
262
+ continue;
263
+ }
264
+ ignored = !negated;
265
+ }
266
+ return ignored;
267
+ }
268
+ function normalizeGitignorePattern(pattern) {
269
+ return pattern.replace(/\\/g, "/").replace(/^\/+/, "").replace(/\/+$/, "");
270
+ }
271
+ function matchesRootGitignorePattern(relativePath, pattern) {
272
+ const normalizedPath = normalizeRelativePath(relativePath);
273
+ const contentsGlobBase = getContentsGlobBase(pattern);
274
+ if (contentsGlobBase && matchesGlob(normalizedPath, contentsGlobBase)) {
275
+ return true;
276
+ }
277
+ if (pattern.includes("/")) {
278
+ return matchesGlob(normalizedPath, pattern);
279
+ }
280
+ return matchesGlob(path.posix.basename(normalizedPath), pattern);
281
+ }
282
+ function getContentsGlobBase(pattern) {
283
+ if (pattern.endsWith("/**")) {
284
+ return pattern.slice(0, -3);
285
+ }
286
+ if (pattern.endsWith("/*")) {
287
+ return pattern.slice(0, -2);
288
+ }
289
+ return undefined;
290
+ }
291
+ function matchesGlob(value, pattern) {
292
+ const regex = new RegExp(`^${pattern
293
+ .split("*")
294
+ .map((part) => escapeRegExp(part))
295
+ .join(".*")}$`);
296
+ return regex.test(value);
297
+ }
298
+ function escapeRegExp(value) {
299
+ return value.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
300
+ }
301
+ function hasEnvValue(value) {
302
+ return value !== undefined && value.trim().length > 0;
303
+ }
304
+ function createEnvSensitivePath(resolvedPath, context) {
305
+ if (isPathInside(resolvedPath, context.cwd)) {
306
+ return path.relative(context.cwd, resolvedPath);
307
+ }
308
+ if (isPathInside(resolvedPath, context.homeDir)) {
309
+ return path.relative(context.homeDir, resolvedPath);
310
+ }
311
+ return path.basename(resolvedPath);
312
+ }
313
+ function isRemoteReference(value) {
314
+ const normalizedValue = value.trim().toLowerCase();
315
+ return (/^[a-z][a-z0-9+.-]*:\/\//.test(normalizedValue) ||
316
+ normalizedValue.startsWith("git@") ||
317
+ normalizedValue.startsWith("github:") ||
318
+ normalizedValue.startsWith("gitlab:"));
319
+ }
320
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/scanner/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type Warning } from "../types.js";
2
+ export declare const DEFAULT_MAX_DEPTH = 6;
3
+ export declare const DEFAULT_CRAWL_CONCURRENCY = 16;
4
+ export declare const DEFAULT_SKIP_NAMES: ReadonlySet<string>;
5
+ export declare const DEFAULT_MARKER_DIRS: ReadonlySet<string>;
6
+ export declare const DEFAULT_MARKER_FILES: ReadonlySet<string>;
7
+ export interface FoundProject {
8
+ projectPath: string;
9
+ parentPath: string;
10
+ markers: string[];
11
+ depth: number;
12
+ }
13
+ export interface CrawlOptions {
14
+ rootDir: string;
15
+ maxDepth?: number;
16
+ skipNames?: ReadonlySet<string>;
17
+ markerDirs?: ReadonlySet<string>;
18
+ markerFiles?: ReadonlySet<string>;
19
+ concurrency?: number;
20
+ signal?: AbortSignal;
21
+ onProject?: (project: FoundProject) => void;
22
+ }
23
+ export interface CrawlStats {
24
+ pathsVisited: number;
25
+ durationMs: number;
26
+ }
27
+ export interface CrawlResult {
28
+ projects: FoundProject[];
29
+ warnings: Warning[];
30
+ stats: CrawlStats;
31
+ }
32
+ export declare function crawlForProjects(options: CrawlOptions): Promise<CrawlResult>;