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 @@
1
+ {"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../src/scanner/parallel.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAmB,EACnB,MAA8C,EAC9C,OAA2B;IAE3B,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,UAAU,CAClB,kEAAkE,WAAW,GAAG,CACjF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAY,SAAS,CAAC;IAEpC,KAAK,UAAU,MAAM;QACnB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO;YACrC,MAAM,CAAC,GAAG,SAAS,CAAC;YACpB,SAAS,IAAI,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC9B,IAAI,CAAC;gBACH,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,UAAU,KAAK,SAAS;oBAAE,UAAU,GAAG,KAAK,CAAC;gBACjD,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type SafeResult, type SafetyCheckOptions } from "./safety.js";
2
+ export declare function readJsonFile(filePath: string, options?: SafetyCheckOptions): Promise<SafeResult<unknown>>;
3
+ export declare function readJsoncFile(filePath: string, options?: SafetyCheckOptions): Promise<SafeResult<unknown>>;
4
+ export declare function readTomlFile(filePath: string, options?: SafetyCheckOptions): Promise<SafeResult<unknown>>;
5
+ export declare function readMarkdownFile(filePath: string, options?: SafetyCheckOptions): Promise<SafeResult<string>>;
6
+ export declare function parseJsonText(text: string, sourcePath: string): SafeResult<unknown>;
7
+ export declare function parseJsoncText(text: string, sourcePath: string): SafeResult<unknown>;
8
+ export declare function parseTomlText(text: string, sourcePath: string): SafeResult<unknown>;
9
+ export declare function parseYamlText(text: string, sourcePath: string): SafeResult<unknown>;
@@ -0,0 +1,135 @@
1
+ import { parse as parseJsonc, printParseErrorCode } from "jsonc-parser";
2
+ import { parse as parseToml } from "smol-toml";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { createWarning } from "../types.js";
5
+ import { maskSecretText, maskSecrets, safeReadTextFile } from "./safety.js";
6
+ export async function readJsonFile(filePath, options = {}) {
7
+ const text = await safeReadTextFile(filePath, options);
8
+ if (!text.ok) {
9
+ return text;
10
+ }
11
+ const parsed = parseJsonText(text.value, filePath);
12
+ if (!parsed.ok) {
13
+ return {
14
+ ok: false,
15
+ warnings: [...text.warnings, ...parsed.warnings]
16
+ };
17
+ }
18
+ return {
19
+ ok: true,
20
+ value: parsed.value,
21
+ warnings: [...text.warnings, ...parsed.warnings]
22
+ };
23
+ }
24
+ export async function readJsoncFile(filePath, options = {}) {
25
+ const text = await safeReadTextFile(filePath, options);
26
+ if (!text.ok) {
27
+ return text;
28
+ }
29
+ const parsed = parseJsoncText(text.value, filePath);
30
+ if (!parsed.ok) {
31
+ return {
32
+ ok: false,
33
+ warnings: [...text.warnings, ...parsed.warnings]
34
+ };
35
+ }
36
+ return {
37
+ ok: true,
38
+ value: parsed.value,
39
+ warnings: [...text.warnings, ...parsed.warnings]
40
+ };
41
+ }
42
+ export async function readTomlFile(filePath, options = {}) {
43
+ const text = await safeReadTextFile(filePath, options);
44
+ if (!text.ok) {
45
+ return text;
46
+ }
47
+ const parsed = parseTomlText(text.value, filePath);
48
+ if (!parsed.ok) {
49
+ return {
50
+ ok: false,
51
+ warnings: [...text.warnings, ...parsed.warnings]
52
+ };
53
+ }
54
+ return {
55
+ ok: true,
56
+ value: parsed.value,
57
+ warnings: [...text.warnings, ...parsed.warnings]
58
+ };
59
+ }
60
+ export async function readMarkdownFile(filePath, options = {}) {
61
+ const text = await safeReadTextFile(filePath, options);
62
+ if (!text.ok) {
63
+ return text;
64
+ }
65
+ return {
66
+ ok: true,
67
+ value: maskSecretText(text.value),
68
+ warnings: text.warnings
69
+ };
70
+ }
71
+ export function parseJsonText(text, sourcePath) {
72
+ try {
73
+ return {
74
+ ok: true,
75
+ value: maskSecrets(JSON.parse(text)),
76
+ warnings: []
77
+ };
78
+ }
79
+ catch (error) {
80
+ return createParseFailure(sourcePath, error);
81
+ }
82
+ }
83
+ export function parseJsoncText(text, sourcePath) {
84
+ const errors = [];
85
+ const parsed = parseJsonc(text, errors, {
86
+ allowTrailingComma: true,
87
+ disallowComments: false
88
+ });
89
+ if (errors.length > 0) {
90
+ return createParseFailure(sourcePath, `JSONC parse error: ${errors.map((error) => printParseErrorCode(error.error)).join(", ")}`);
91
+ }
92
+ return {
93
+ ok: true,
94
+ value: maskSecrets(parsed),
95
+ warnings: []
96
+ };
97
+ }
98
+ export function parseTomlText(text, sourcePath) {
99
+ try {
100
+ return {
101
+ ok: true,
102
+ value: maskSecrets(parseToml(text)),
103
+ warnings: []
104
+ };
105
+ }
106
+ catch (error) {
107
+ return createParseFailure(sourcePath, error);
108
+ }
109
+ }
110
+ export function parseYamlText(text, sourcePath) {
111
+ try {
112
+ return {
113
+ ok: true,
114
+ value: maskSecrets(parseYaml(text)),
115
+ warnings: []
116
+ };
117
+ }
118
+ catch (error) {
119
+ return createParseFailure(sourcePath, error);
120
+ }
121
+ }
122
+ function createParseFailure(sourcePath, error) {
123
+ const message = error instanceof Error ? error.message : String(error);
124
+ return {
125
+ ok: false,
126
+ warnings: [
127
+ createWarning({
128
+ reason: "parse_failed",
129
+ path: sourcePath,
130
+ message: `Could not parse ${sourcePath}: ${message}`
131
+ })
132
+ ]
133
+ };
134
+ }
135
+ //# sourceMappingURL=parsing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.js","sourceRoot":"","sources":["../../src/scanner/parsing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,mBAAmB,EAAmB,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,WAAW,EACX,gBAAgB,EAGjB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAAkB;IAC5D,IAAI,CAAC;QACH,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;YAC/C,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,UAAkB;IAC7D,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;QACtC,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,KAAK;KACxB,CAAY,CAAC;IAEd,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,kBAAkB,CACvB,UAAU,EACV,sBAAsB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC;QAC1B,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAAkB;IAC5D,IAAI,CAAC;QACH,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAY,CAAC;YAC9C,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAAkB;IAC5D,IAAI,CAAC;QACH,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAY,CAAC;YAC9C,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB,EAAE,KAAc;IAC5D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,OAAO;QACL,EAAE,EAAE,KAAK;QACT,QAAQ,EAAE;YACR,aAAa,CAAC;gBACZ,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,mBAAmB,UAAU,KAAK,OAAO,EAAE;aACrD,CAAC;SACH;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface PathContext {
2
+ cwd?: string;
3
+ homeDir?: string;
4
+ }
5
+ export declare function resolveLocalPath(inputPath: string, context?: PathContext): string;
6
+ export declare function toDisplayPath(inputPath: string, context?: PathContext): string;
7
+ export declare function isPathInside(childPath: string, parentPath: string): boolean;
8
+ export declare function splitPathSegments(inputPath: string): string[];
@@ -0,0 +1,39 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function resolveLocalPath(inputPath, context = {}) {
4
+ const cwd = context.cwd ?? process.cwd();
5
+ const homeDir = context.homeDir ?? os.homedir();
6
+ if (inputPath === "~") {
7
+ return path.resolve(homeDir);
8
+ }
9
+ if (inputPath.startsWith("~/")) {
10
+ return path.resolve(homeDir, inputPath.slice(2));
11
+ }
12
+ if (path.isAbsolute(inputPath)) {
13
+ return path.normalize(inputPath);
14
+ }
15
+ return path.resolve(cwd, inputPath);
16
+ }
17
+ export function toDisplayPath(inputPath, context = {}) {
18
+ const homeDir = path.resolve(context.homeDir ?? os.homedir());
19
+ const normalizedPath = path.resolve(inputPath);
20
+ if (normalizedPath === homeDir) {
21
+ return "~";
22
+ }
23
+ if (isPathInside(normalizedPath, homeDir)) {
24
+ return `~/${path.relative(homeDir, normalizedPath)}`;
25
+ }
26
+ return normalizedPath;
27
+ }
28
+ export function isPathInside(childPath, parentPath) {
29
+ const relativePath = path.relative(path.resolve(parentPath), path.resolve(childPath));
30
+ return (relativePath === "" ||
31
+ (!relativePath.startsWith("..") && !path.isAbsolute(relativePath)));
32
+ }
33
+ export function splitPathSegments(inputPath) {
34
+ return path
35
+ .normalize(inputPath)
36
+ .split(/[\\/]+/)
37
+ .filter((segment) => segment.length > 0);
38
+ }
39
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/scanner/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,UAAuB,EAAE;IAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAEhD,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,UAAuB,EAAE;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,UAAkB;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtF,OAAO,CACL,YAAY,KAAK,EAAE;QACnB,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO,IAAI;SACR,SAAS,CAAC,SAAS,CAAC;SACpB,KAAK,CAAC,QAAQ,CAAC;SACf,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type SafeResult, type SafetyCheckOptions } from "./safety.js";
2
+ export declare const DEFAULT_PREVIEW_LINES = 10;
3
+ export interface Preview {
4
+ sourcePath: string;
5
+ lines: string[];
6
+ truncated: boolean;
7
+ }
8
+ export declare function readSanitizedPreview(filePath: string, options?: SafetyCheckOptions & {
9
+ maxLines?: number;
10
+ }): Promise<SafeResult<Preview>>;
11
+ export declare function createSanitizedPreview(text: string, sourcePath: string, maxLines?: number): Preview;
12
+ export declare function countTextLines(text: string): number;
@@ -0,0 +1,29 @@
1
+ import { maskSecretText, safeReadTextFile } from "./safety.js";
2
+ export const DEFAULT_PREVIEW_LINES = 10;
3
+ export async function readSanitizedPreview(filePath, options = {}) {
4
+ const text = await safeReadTextFile(filePath, options);
5
+ if (!text.ok) {
6
+ return text;
7
+ }
8
+ return {
9
+ ok: true,
10
+ value: createSanitizedPreview(text.value, filePath, options.maxLines),
11
+ warnings: text.warnings
12
+ };
13
+ }
14
+ export function createSanitizedPreview(text, sourcePath, maxLines = DEFAULT_PREVIEW_LINES) {
15
+ const normalizedLines = splitNormalizedLines(text);
16
+ const previewLines = normalizedLines.slice(0, maxLines).map((line) => maskSecretText(line));
17
+ return {
18
+ sourcePath,
19
+ lines: previewLines,
20
+ truncated: normalizedLines.length > maxLines
21
+ };
22
+ }
23
+ export function countTextLines(text) {
24
+ return splitNormalizedLines(text).length;
25
+ }
26
+ function splitNormalizedLines(text) {
27
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
28
+ }
29
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/scanner/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAGjB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAQxC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,UAAsD,EAAE;IAExD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;QACrE,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,UAAkB,EAClB,QAAQ,GAAG,qBAAqB;IAEhC,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5F,OAAO;QACL,UAAU;QACV,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,eAAe,CAAC,MAAM,GAAG,QAAQ;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { FoundProject } from "./filesystem-crawler.js";
2
+ export declare const MIN_PROJECTS_FOR_DEFAULT_ON = 3;
3
+ export interface DevRootCandidate {
4
+ parentPath: string;
5
+ projectCount: number;
6
+ projectPaths: string[];
7
+ defaultOn: boolean;
8
+ }
9
+ export declare function groupProjectsByParent(projects: readonly FoundProject[]): DevRootCandidate[];
10
+ export declare function applyDefaultOnHeuristic(candidates: readonly DevRootCandidate[]): DevRootCandidate[];
11
+ export declare function selectDefaultOnRoots(candidates: readonly DevRootCandidate[]): string[];
@@ -0,0 +1,35 @@
1
+ export const MIN_PROJECTS_FOR_DEFAULT_ON = 3;
2
+ export function groupProjectsByParent(projects) {
3
+ const byParent = new Map();
4
+ for (const project of projects) {
5
+ const list = byParent.get(project.parentPath) ?? [];
6
+ list.push(project.projectPath);
7
+ byParent.set(project.parentPath, list);
8
+ }
9
+ const candidates = [];
10
+ for (const [parentPath, projectPaths] of byParent) {
11
+ candidates.push({
12
+ parentPath,
13
+ projectCount: projectPaths.length,
14
+ projectPaths,
15
+ defaultOn: false
16
+ });
17
+ }
18
+ candidates.sort((a, b) => {
19
+ if (b.projectCount !== a.projectCount) {
20
+ return b.projectCount - a.projectCount;
21
+ }
22
+ return a.parentPath.localeCompare(b.parentPath);
23
+ });
24
+ return applyDefaultOnHeuristic(candidates);
25
+ }
26
+ export function applyDefaultOnHeuristic(candidates) {
27
+ return candidates.map((candidate) => ({
28
+ ...candidate,
29
+ defaultOn: candidate.projectCount >= MIN_PROJECTS_FOR_DEFAULT_ON
30
+ }));
31
+ }
32
+ export function selectDefaultOnRoots(candidates) {
33
+ return candidates.filter((c) => c.defaultOn).map((c) => c.parentPath);
34
+ }
35
+ //# sourceMappingURL=project-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-discovery.js","sourceRoot":"","sources":["../../src/scanner/project-discovery.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAS7C,MAAM,UAAU,qBAAqB,CACnC,QAAiC;IAEjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,QAAQ,EAAE,CAAC;QAClD,UAAU,CAAC,IAAI,CAAC;YACd,UAAU;YACV,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,YAAY;YACZ,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,OAAO,uBAAuB,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,UAAuC;IAEvC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACpC,GAAG,SAAS;QACZ,SAAS,EAAE,SAAS,CAAC,YAAY,IAAI,2BAA2B;KACjE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAuC;IAEvC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type Warning } from "../types.js";
2
+ export interface RipgrepFilesOptions {
3
+ cwd: string;
4
+ globs?: string[];
5
+ excludeGlobs?: string[];
6
+ }
7
+ export interface RipgrepFilesResult {
8
+ paths: string[];
9
+ warnings: Warning[];
10
+ }
11
+ export declare function listRipgrepFiles(options: RipgrepFilesOptions): Promise<RipgrepFilesResult>;
@@ -0,0 +1,61 @@
1
+ import { spawn } from "node:child_process";
2
+ import { rgPath } from "@vscode/ripgrep";
3
+ import { createWarning } from "../types.js";
4
+ export async function listRipgrepFiles(options) {
5
+ const args = ["--files", "--hidden", "--null"];
6
+ for (const glob of options.globs ?? []) {
7
+ args.push("--glob", glob);
8
+ }
9
+ for (const glob of options.excludeGlobs ?? []) {
10
+ args.push("--glob", `!${glob}`);
11
+ }
12
+ return new Promise((resolve) => {
13
+ const child = spawn(rgPath, args, {
14
+ cwd: options.cwd,
15
+ stdio: ["ignore", "pipe", "pipe"]
16
+ });
17
+ const stdoutChunks = [];
18
+ const stderrChunks = [];
19
+ child.stdout.on("data", (chunk) => {
20
+ stdoutChunks.push(chunk);
21
+ });
22
+ child.stderr.on("data", (chunk) => {
23
+ stderrChunks.push(chunk);
24
+ });
25
+ child.on("error", (error) => {
26
+ resolve({
27
+ paths: [],
28
+ warnings: [
29
+ createWarning({
30
+ reason: "unknown",
31
+ path: options.cwd,
32
+ message: `Could not run ripgrep discovery in ${options.cwd}: ${error.message}`
33
+ })
34
+ ]
35
+ });
36
+ });
37
+ child.on("close", (code) => {
38
+ if (code !== 0 && code !== 1) {
39
+ const stderr = Buffer.concat(stderrChunks).toString("utf8").trim();
40
+ resolve({
41
+ paths: [],
42
+ warnings: [
43
+ createWarning({
44
+ reason: "unknown",
45
+ path: options.cwd,
46
+ message: `Ripgrep discovery failed in ${options.cwd}: ${stderr || `exit code ${code}`}`
47
+ })
48
+ ]
49
+ });
50
+ return;
51
+ }
52
+ const output = Buffer.concat(stdoutChunks).toString("utf8");
53
+ const paths = output.split("\0").filter((entry) => entry.length > 0);
54
+ resolve({
55
+ paths,
56
+ warnings: []
57
+ });
58
+ });
59
+ });
60
+ }
61
+ //# sourceMappingURL=ripgrep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ripgrep.js","sourceRoot":"","sources":["../../src/scanner/ripgrep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Dirent, Stats } from "node:fs";
2
+ import { type Warning } from "../types.js";
3
+ export declare const MAX_SAFE_FILE_BYTES: number;
4
+ export declare const MASKED_SECRET = "......";
5
+ export type SafeResult<T> = {
6
+ ok: true;
7
+ value: T;
8
+ warnings: Warning[];
9
+ } | {
10
+ ok: false;
11
+ warnings: Warning[];
12
+ };
13
+ export interface SafetyCheckOptions {
14
+ expectedType?: "file" | "directory" | "any";
15
+ maxBytes?: number;
16
+ sensitivePath?: string;
17
+ warnOnMissing?: boolean;
18
+ allowedRoots?: string[];
19
+ }
20
+ export interface SafePathInfo {
21
+ path: string;
22
+ stat: Stats;
23
+ linked: boolean;
24
+ linkTarget?: string;
25
+ }
26
+ export declare function checkSafePath(filePath: string, options?: SafetyCheckOptions): Promise<SafeResult<SafePathInfo>>;
27
+ export declare function getLinkInfo(filePath: string): Promise<{
28
+ linked: boolean;
29
+ linkTarget?: string;
30
+ }>;
31
+ export declare function safeReadTextFile(filePath: string, options?: SafetyCheckOptions): Promise<SafeResult<string>>;
32
+ export declare function safeReadDirectory(directoryPath: string, options?: SafetyCheckOptions): Promise<SafeResult<Dirent[]>>;
33
+ export declare function isSensitivePath(filePath: string): boolean;
34
+ export declare function isSecretLikeKey(key: string): boolean;
35
+ export declare function maskSecrets<T>(value: T): T;
36
+ export declare function maskUrl(value: string): string;
37
+ export declare function maskSecretText(text: string): string;