@ankurhalder/codebase-snapshot 0.0.0-stage → 2.0.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 +289 -2
- package/dist/bin.js +3725 -0
- package/dist/chunk-RGDVLQTT.js +3217 -0
- package/dist/cli.cjs +3718 -0
- package/dist/cli.d.cts +40 -0
- package/dist/cli.d.ts +40 -0
- package/dist/cli.js +487 -0
- package/dist/index.cjs +3292 -0
- package/dist/index.d.cts +364 -0
- package/dist/index.d.ts +364 -0
- package/dist/index.js +3 -0
- package/dist/types-S-5eRuRc.d.cts +372 -0
- package/dist/types-S-5eRuRc.d.ts +372 -0
- package/docs/configuration.md +244 -0
- package/package.json +93 -4
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { J as JsonSummary, M as MarkdownSummary, S as SourceSummary, R as ResolvedSnapshotConfig, a as SnapshotConfig, B as ByteSize, C as CliOptions, F as FileEntry, P as PartMetadata, L as LayerRule, K as KindRule, b as SecretRule, c as SecretFinding, V as ValidationResult, d as Manifest, e as SkipRecord } from './types-S-5eRuRc.cjs';
|
|
2
|
+
export { A as ArtifactSelection, f as BudgetConfig, H as HooksConfig, I as InclusionMode, g as ManifestArtifact, h as ManifestConfigSnapshot, i as ManifestIndexes, j as ManifestTotals, k as Mode, O as OutputFormat, l as PartFileEntry, m as ResolvedArtifacts, n as ResolvedBudgets, o as SecretRuleInput, p as SkipReason, q as ValidationDrift } from './types-S-5eRuRc.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Strips `//` and block comments the way JSONC does, without touching anything
|
|
6
|
+
* inside a string literal. `JSON.parse` alone made every `.jsonc` file report
|
|
7
|
+
* `invalid-json`, losing its key shape entirely.
|
|
8
|
+
*/
|
|
9
|
+
declare function stripJsonComments(content: string): string;
|
|
10
|
+
declare function summarizeJson(content: string): JsonSummary;
|
|
11
|
+
declare function summarizeMarkdown(content: string): MarkdownSummary;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Extracts a structural summary from a JS/TS source file.
|
|
15
|
+
*
|
|
16
|
+
* The traversal is an explicit stack, not recursion: a generated file with a
|
|
17
|
+
* long `a && b && …` chain used to overflow the call stack inside our own
|
|
18
|
+
* visitor and abort the entire snapshot. Callers should still treat a throw as
|
|
19
|
+
* possible (TypeScript's own parser recurses), so wrap the call.
|
|
20
|
+
*/
|
|
21
|
+
declare function summarizeTypeScriptSource(relativePath: string, content: string): SourceSummary;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Brands a resolved config so consumers can distinguish it from a user
|
|
25
|
+
* `SnapshotConfig` structurally, instead of guessing from the presence of a
|
|
26
|
+
* single field (`"secretRules" in input`), which misfired for hand-built configs
|
|
27
|
+
* and for user configs that happened to carry an extra key.
|
|
28
|
+
*/
|
|
29
|
+
declare function markResolvedConfig<T extends ResolvedSnapshotConfig>(config: T): T;
|
|
30
|
+
/**
|
|
31
|
+
* Detects a resolved config.
|
|
32
|
+
*
|
|
33
|
+
* The brand is a non-enumerable symbol, so it survives `structuredClone` but NOT
|
|
34
|
+
* `{ ...resolvedConfig, override }`. Relying on the brand alone caused a real
|
|
35
|
+
* regression: a spread config was re-resolved as a user config, which silently
|
|
36
|
+
* dropped custom `secretRules` and let matching secrets through in clear text.
|
|
37
|
+
* The structural fallback therefore accepts any object carrying the complete
|
|
38
|
+
* resolved-only shape.
|
|
39
|
+
*/
|
|
40
|
+
declare function isResolvedConfig(value: unknown): value is ResolvedSnapshotConfig;
|
|
41
|
+
/**
|
|
42
|
+
* Re-validates a resolved config taken from an untrusted path (e.g. a spread
|
|
43
|
+
* copy), recompiling secret rules so string patterns and stray `g`/`y` flags are
|
|
44
|
+
* normalised even when the object did not come from `resolveConfig`.
|
|
45
|
+
*/
|
|
46
|
+
declare function normalizeResolvedConfig(config: ResolvedSnapshotConfig): ResolvedSnapshotConfig;
|
|
47
|
+
/**
|
|
48
|
+
* Guards against a silently lossy config round-trip.
|
|
49
|
+
*
|
|
50
|
+
* A `RegExp` cannot survive `JSON.stringify`/`JSON.parse`: the pattern comes
|
|
51
|
+
* back as `{}`. Such an object no longer satisfies `isResolvedConfig`, so it
|
|
52
|
+
* would be re-resolved as a user config and its custom `secretRules` would be
|
|
53
|
+
* dropped without a word — a silent security regression. Fail loudly instead.
|
|
54
|
+
*/
|
|
55
|
+
declare function assertUsableConfigInput(value: unknown): void;
|
|
56
|
+
interface ConfigLoadResult {
|
|
57
|
+
config: SnapshotConfig | null;
|
|
58
|
+
/** Absolute path of the file the config came from, if any. */
|
|
59
|
+
file: string | null;
|
|
60
|
+
/** Why a candidate config file was ignored. Never silently discarded. */
|
|
61
|
+
warnings: string[];
|
|
62
|
+
}
|
|
63
|
+
/** True when this Node can `import()` a `.ts` file natively (type stripping). */
|
|
64
|
+
declare function supportsTypeScriptImports(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Loads the first usable config file from `cwd`.
|
|
67
|
+
*
|
|
68
|
+
* Every failure is reported through `warnings` instead of being swallowed by an
|
|
69
|
+
* empty `catch`: a syntax error in a user's config used to be indistinguishable
|
|
70
|
+
* from having no config at all.
|
|
71
|
+
*/
|
|
72
|
+
declare function loadConfigFileDetailed(cwd: string): Promise<ConfigLoadResult>;
|
|
73
|
+
declare function loadConfigFile(cwd: string): Promise<SnapshotConfig | null>;
|
|
74
|
+
/** Smallest usable part budget: a part header plus one section must fit. */
|
|
75
|
+
declare const MIN_MAX_PART_BYTES = 4096;
|
|
76
|
+
/** Every artifact this package can write, in the order it is written. */
|
|
77
|
+
declare const ARTIFACT_NAMES: readonly ["readme", "manifest", "parts", "navigation", "projectTree", "audit", "monolith"];
|
|
78
|
+
/**
|
|
79
|
+
* Parses a byte budget.
|
|
80
|
+
*
|
|
81
|
+
* Accepts a plain number (`122880`), a numeric string (`"122880"`), or a
|
|
82
|
+
* human-readable size (`"120k"`, `"1.5mb"`, `"2 GB"`). Returns `undefined` for
|
|
83
|
+
* anything it cannot read, so callers can decide whether that is an error or a
|
|
84
|
+
* fallback — a typo'd budget must not silently become the default.
|
|
85
|
+
*/
|
|
86
|
+
declare function parseByteSize(value: ByteSize | null | undefined): number | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Merges user config, preset defaults and CLI overrides.
|
|
89
|
+
*
|
|
90
|
+
* `baseDir` is the directory the config was loaded from. Without it the natural
|
|
91
|
+
* library flow (`loadConfigFile(dir)` then `resolveConfig(config)`) silently
|
|
92
|
+
* fell back to `process.cwd()` and generated into the caller's directory.
|
|
93
|
+
*/
|
|
94
|
+
declare function resolveConfig(userConfig: SnapshotConfig | null, cliOptions?: Partial<CliOptions>, baseDir?: string): ResolvedSnapshotConfig;
|
|
95
|
+
/**
|
|
96
|
+
* Matches a path against a layer/kind rule.
|
|
97
|
+
*
|
|
98
|
+
* `"src/app/**"` now means "exactly `src/app` or below": the previous
|
|
99
|
+
* implementation stripped `**` **and** the trailing slash, so the pattern also
|
|
100
|
+
* matched `src/apple/` and `src/application/`.
|
|
101
|
+
*/
|
|
102
|
+
declare function matchRule(filePath: string, matcher: string | RegExp | ((filePath: string) => boolean)): boolean;
|
|
103
|
+
|
|
104
|
+
declare function defineConfig(config: SnapshotConfig): SnapshotConfig;
|
|
105
|
+
|
|
106
|
+
declare function generateProjectTree(filePaths: string[]): string;
|
|
107
|
+
|
|
108
|
+
interface PartitionedPart {
|
|
109
|
+
filename: string;
|
|
110
|
+
markdown: string;
|
|
111
|
+
metadata: PartMetadata;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Partitions rendered file sections into byte-bounded parts.
|
|
115
|
+
*
|
|
116
|
+
* The budget is a hard bound: a section that cannot fit into a part on its own
|
|
117
|
+
* is byte-truncated (and marked `isPreviewTruncated`) rather than emitted whole.
|
|
118
|
+
* The previous implementation skipped the flush check for an empty chunk, so one
|
|
119
|
+
* large file produced a part 13.5x over the configured budget.
|
|
120
|
+
*/
|
|
121
|
+
declare function partitionFiles(files: FileEntry[], maxPartBytes: number, contentFingerprint?: string): PartitionedPart[];
|
|
122
|
+
/**
|
|
123
|
+
* Re-numbers a set of parts as one sequence and rewrites their headers.
|
|
124
|
+
*
|
|
125
|
+
* Needed when parts are produced by more than one partition pass (per-layer
|
|
126
|
+
* budgets): each pass numbers from `part-001`, so the merged set would otherwise
|
|
127
|
+
* contain duplicate filenames and every `Previous:`/`Next:` link would lie.
|
|
128
|
+
*/
|
|
129
|
+
declare function renumberParts(parts: PartitionedPart[], contentFingerprint?: string): PartitionedPart[];
|
|
130
|
+
/**
|
|
131
|
+
* Chooses a fence longer than any backtick run in `content`, so a file that
|
|
132
|
+
* contains a fenced block cannot break out of its own code block.
|
|
133
|
+
*/
|
|
134
|
+
declare function fenceForContent(content: string): string;
|
|
135
|
+
/**
|
|
136
|
+
* Stable, injective anchor for a file path.
|
|
137
|
+
*
|
|
138
|
+
* The previous slug was not injective (`src/a-b.ts` and `src/a/b.ts` produced the
|
|
139
|
+
* same anchor) and, more importantly, no part file ever emitted the anchors that
|
|
140
|
+
* `reports/navigation.md` linked to — every file link was dead.
|
|
141
|
+
*/
|
|
142
|
+
declare function anchorForPath(filePath: string): string;
|
|
143
|
+
|
|
144
|
+
interface PreviewResult {
|
|
145
|
+
content: string;
|
|
146
|
+
isTruncated: boolean;
|
|
147
|
+
originalLines: number;
|
|
148
|
+
includedLines: number;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Line count with one consistent convention: a trailing newline does not start
|
|
152
|
+
* a new line, and an empty string has zero lines.
|
|
153
|
+
*
|
|
154
|
+
* Previously `index.ts` recorded 0 for an empty file while `preview.ts` recorded
|
|
155
|
+
* 1, and every newline-terminated file was over-counted by one.
|
|
156
|
+
*/
|
|
157
|
+
declare function countLines(content: string): number;
|
|
158
|
+
/**
|
|
159
|
+
* Truncates to a UTF-8 byte budget without splitting a multi-byte character.
|
|
160
|
+
*/
|
|
161
|
+
declare function truncateToBytes(content: string, maxBytes: number): {
|
|
162
|
+
content: string;
|
|
163
|
+
isTruncated: boolean;
|
|
164
|
+
};
|
|
165
|
+
declare function truncatePreview(content: string, headLines: number, tailLines: number): PreviewResult;
|
|
166
|
+
|
|
167
|
+
declare function detectPreset(cwd: string): {
|
|
168
|
+
presetName: string;
|
|
169
|
+
layers: LayerRule[];
|
|
170
|
+
kinds: KindRule[];
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
declare function isBinaryExtension(filePath: string): boolean;
|
|
174
|
+
declare function isBinaryBuffer(buffer: Buffer): boolean;
|
|
175
|
+
declare function isBinaryFile(absolutePath: string): boolean;
|
|
176
|
+
|
|
177
|
+
declare function detectLanguage(filePath: string): string;
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Redacts secrets from `content`.
|
|
181
|
+
*
|
|
182
|
+
* - Replaces only the matched span, so unrelated code sharing the line survives
|
|
183
|
+
* (the previous implementation discarded the whole line).
|
|
184
|
+
* - Masks PEM private-key blocks as a unit; per-line rules can only see the
|
|
185
|
+
* `BEGIN` header, which left every body line of a real key in the output.
|
|
186
|
+
* - Records `{ rule, line, path }` only. No excerpt of the source is retained,
|
|
187
|
+
* because that excerpt was being written verbatim into `reports/audit.md`.
|
|
188
|
+
*/
|
|
189
|
+
declare function scanAndRedactSecrets(content: string, rules: SecretRule[], filePath?: string): {
|
|
190
|
+
redacted: string;
|
|
191
|
+
findings: SecretFinding[];
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Validates a generated snapshot against the working tree and against the
|
|
196
|
+
* recorded configuration.
|
|
197
|
+
*
|
|
198
|
+
* Beyond source-file hashes this now also:
|
|
199
|
+
* - refuses a manifest that does not have the expected shape (previously threw
|
|
200
|
+
* an uncaught `TypeError`),
|
|
201
|
+
* - verifies every emitted `parts/*.md` against its recorded `byteSize`/`sha256`
|
|
202
|
+
* (previously a deleted or corrupted part still reported `valid: true`),
|
|
203
|
+
* - re-checks the effective configuration and the part/file bookkeeping,
|
|
204
|
+
* - verifies monolith artefact digests when present.
|
|
205
|
+
*/
|
|
206
|
+
declare function validateSnapshot(configInput: ResolvedSnapshotConfig | SnapshotConfig): ValidationResult;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Default secret rules.
|
|
210
|
+
*
|
|
211
|
+
* Design notes:
|
|
212
|
+
* - Every quantifier is bounded. An unbounded `[A-Za-z0-9_-]{10,}` followed by
|
|
213
|
+
* `\.` backtracks to the end of the line at every start position, which made
|
|
214
|
+
* `jwt-token` quadratic (measured: 1.22 s for a 200 KB line). JWT segments are
|
|
215
|
+
* never longer than a few KB, so bounding at 1024 keeps the match linear in
|
|
216
|
+
* practice while still matching every realistic token.
|
|
217
|
+
* - Rules are line-oriented; the whole-block private-key scan lives in
|
|
218
|
+
* `redact.ts` because it spans lines.
|
|
219
|
+
* - Names are matched case-insensitively only where a value is anchored by
|
|
220
|
+
* quotes or a length, to keep false positives at zero on ordinary source.
|
|
221
|
+
*/
|
|
222
|
+
declare const DEFAULT_SECRET_PATTERNS: SecretRule[];
|
|
223
|
+
|
|
224
|
+
interface ExplainResult {
|
|
225
|
+
/** Path relative to the configured cwd, POSIX separators. */
|
|
226
|
+
path: string;
|
|
227
|
+
/** Whether the path exists on disk. */
|
|
228
|
+
exists: boolean;
|
|
229
|
+
/** Whether the scanner would include it in the next snapshot. */
|
|
230
|
+
included: boolean;
|
|
231
|
+
/** Why it is excluded, when it is. Mirrors `SkipRecord.reason`. */
|
|
232
|
+
reason?: string;
|
|
233
|
+
detail?: string;
|
|
234
|
+
layer?: string;
|
|
235
|
+
layerMatch?: string;
|
|
236
|
+
kind?: string;
|
|
237
|
+
kindMatch?: string;
|
|
238
|
+
language?: string;
|
|
239
|
+
/** Part filename from the last written manifest, when one is available. */
|
|
240
|
+
part?: string | null;
|
|
241
|
+
inclusionMode?: string;
|
|
242
|
+
lines?: number;
|
|
243
|
+
bytes?: number;
|
|
244
|
+
secretCount?: number;
|
|
245
|
+
secrets?: Array<{
|
|
246
|
+
rule: string;
|
|
247
|
+
line: number;
|
|
248
|
+
}>;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Explains what the scanner would do with one path.
|
|
252
|
+
*
|
|
253
|
+
* The whole point is that every decision is visible: which layer and kind rule
|
|
254
|
+
* matched, why a file was skipped, which part it landed in, and whether any
|
|
255
|
+
* secret rule fires. Re-running the real scanner is what keeps it honest.
|
|
256
|
+
*/
|
|
257
|
+
declare function explainPath(config: ResolvedSnapshotConfig, target: string): ExplainResult;
|
|
258
|
+
/** Renders an explanation for a terminal. */
|
|
259
|
+
declare function renderExplainText(result: ExplainResult): string;
|
|
260
|
+
|
|
261
|
+
interface ManifestDiff {
|
|
262
|
+
before: DiffSide;
|
|
263
|
+
after: DiffSide;
|
|
264
|
+
added: string[];
|
|
265
|
+
removed: string[];
|
|
266
|
+
changed: string[];
|
|
267
|
+
unchanged: number;
|
|
268
|
+
}
|
|
269
|
+
interface DiffSide {
|
|
270
|
+
generatedAt: string;
|
|
271
|
+
fingerprint: string;
|
|
272
|
+
fileCount: number;
|
|
273
|
+
partsCount: number;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Compares two manifests file by file.
|
|
277
|
+
*
|
|
278
|
+
* The per-file hashes and the content fingerprint already make this exact, so
|
|
279
|
+
* nothing is inferred: a path is added, removed or changed, never "maybe".
|
|
280
|
+
*/
|
|
281
|
+
declare function compareManifests(before: Manifest, after: Manifest): ManifestDiff;
|
|
282
|
+
/** Loads a manifest from a snapshot directory or a `manifest.json` path. */
|
|
283
|
+
declare function loadManifest(target: string): Manifest;
|
|
284
|
+
/** Renders a diff for a terminal. */
|
|
285
|
+
declare function renderDiffText(diff: ManifestDiff): string;
|
|
286
|
+
|
|
287
|
+
interface CollectOptions {
|
|
288
|
+
/**
|
|
289
|
+
* When non-empty, only files matching at least one pattern are candidates.
|
|
290
|
+
* Applied before `excludePatterns`, which then narrows the result further.
|
|
291
|
+
*/
|
|
292
|
+
includePatterns?: string[];
|
|
293
|
+
excludePatterns?: string[];
|
|
294
|
+
/**
|
|
295
|
+
* Emit credential-bearing files (`.env`, `*.pem`, `.npmrc`, `id_rsa`, …).
|
|
296
|
+
* Default `false`: they are skipped with `reason: "sensitive-file"`.
|
|
297
|
+
*/
|
|
298
|
+
includeSensitiveFiles?: boolean;
|
|
299
|
+
}
|
|
300
|
+
interface CollectResult {
|
|
301
|
+
files: string[];
|
|
302
|
+
skipped: SkipRecord[];
|
|
303
|
+
}
|
|
304
|
+
declare function isSensitivePath(relativePath: string): boolean;
|
|
305
|
+
/**
|
|
306
|
+
* Translates a glob (`**`, `*`, `?`, `{a,b}`, `[abc]`) into a RegExp. A pattern
|
|
307
|
+
* without a leading `/` matches at any depth, mirroring `.gitignore` semantics.
|
|
308
|
+
*
|
|
309
|
+
* Brace groups and character classes are supported because they are what people
|
|
310
|
+
* actually write: `*.{ts,tsx}` previously matched nothing at all, since `{` and
|
|
311
|
+
* `}` were escaped as literals.
|
|
312
|
+
*/
|
|
313
|
+
declare function globToRegExp(glob: string): RegExp;
|
|
314
|
+
/**
|
|
315
|
+
* Path exclusion with proper segment semantics.
|
|
316
|
+
*
|
|
317
|
+
* A plain (non-glob) pattern matches a whole path segment sequence, so
|
|
318
|
+
* `"test"` matches `test/a.ts` and `src/test/b.ts` but **not** `contest/entry.ts`
|
|
319
|
+
* (the previous implementation was a raw `String.includes`).
|
|
320
|
+
*/
|
|
321
|
+
declare function matchesExclude(relativePath: string, pattern: string): boolean;
|
|
322
|
+
/**
|
|
323
|
+
* Collects candidate file paths.
|
|
324
|
+
*
|
|
325
|
+
* Uses `git ls-files -z` when git is available: `-z` is required because the
|
|
326
|
+
* default output C-quotes paths containing non-ASCII characters, which silently
|
|
327
|
+
* mangled `src/café.ts` into a path that never existed and dropped the file.
|
|
328
|
+
*/
|
|
329
|
+
declare function collectFiles(cwd: string, options?: CollectOptions): CollectResult;
|
|
330
|
+
|
|
331
|
+
declare const GENERATOR_NAME = "@ankurhalder/codebase-snapshot";
|
|
332
|
+
declare const GENERATOR_VERSION = "2.0.0";
|
|
333
|
+
declare const SCHEMA_VERSION = "3.0.0";
|
|
334
|
+
interface GenerateOptions {
|
|
335
|
+
/** Compute the full manifest but write nothing to disk. */
|
|
336
|
+
dryRun?: boolean;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Resolves and validates the output directories.
|
|
340
|
+
*
|
|
341
|
+
* `outDir` was previously deleted with `rmSync` before the replacement was
|
|
342
|
+
* renamed into place, so `outDir: "."` erased the whole repository and a
|
|
343
|
+
* nested `tmpDir` erased its own parent. These guards make that impossible.
|
|
344
|
+
*/
|
|
345
|
+
declare function resolveSafeOutputDirs(config: {
|
|
346
|
+
cwd: string;
|
|
347
|
+
outDir: string;
|
|
348
|
+
tmpDir: string;
|
|
349
|
+
}): {
|
|
350
|
+
outDir: string;
|
|
351
|
+
tmpDir: string;
|
|
352
|
+
};
|
|
353
|
+
/**
|
|
354
|
+
* Generates the snapshot.
|
|
355
|
+
*
|
|
356
|
+
* Synchronous by design: it previously carried an `async` signature while doing
|
|
357
|
+
* only blocking I/O, which promised concurrency that did not exist. Existing
|
|
358
|
+
* `await generateSnapshot(...)` call sites continue to work.
|
|
359
|
+
*/
|
|
360
|
+
declare function generateSnapshot(configInput?: SnapshotConfig | ResolvedSnapshotConfig | null, options?: GenerateOptions): Manifest;
|
|
361
|
+
/** Promise-returning wrapper for consumers that prefer an async call site. */
|
|
362
|
+
declare function generateSnapshotAsync(configInput?: SnapshotConfig | ResolvedSnapshotConfig | null, options?: GenerateOptions): Promise<Manifest>;
|
|
363
|
+
|
|
364
|
+
export { ARTIFACT_NAMES, ByteSize, CliOptions, DEFAULT_SECRET_PATTERNS, type ExplainResult, FileEntry, GENERATOR_NAME, GENERATOR_VERSION, type GenerateOptions, JsonSummary, KindRule, LayerRule, MIN_MAX_PART_BYTES, Manifest, type ManifestDiff, MarkdownSummary, PartMetadata, ResolvedSnapshotConfig, SCHEMA_VERSION, SecretFinding, SecretRule, SkipRecord, SnapshotConfig, SourceSummary, ValidationResult, anchorForPath, assertUsableConfigInput, collectFiles, compareManifests, countLines, defineConfig, detectLanguage, detectPreset, explainPath, fenceForContent, generateProjectTree, generateSnapshot, generateSnapshotAsync, globToRegExp, isBinaryBuffer, isBinaryExtension, isBinaryFile, isResolvedConfig, isSensitivePath, loadConfigFile, loadConfigFileDetailed, loadManifest, markResolvedConfig, matchRule, matchesExclude, normalizeResolvedConfig, parseByteSize, partitionFiles, renderDiffText, renderExplainText, renumberParts, resolveConfig, resolveSafeOutputDirs, scanAndRedactSecrets, stripJsonComments, summarizeJson, summarizeMarkdown, summarizeTypeScriptSource, supportsTypeScriptImports, truncatePreview, truncateToBytes, validateSnapshot };
|