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 @@
|
|
|
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":"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"}
|
|
@@ -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;
|