@any-nav/core 0.1.0 → 0.2.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.
@@ -1,18 +1,36 @@
1
1
  /**
2
- * Search engine seam + fast-bm25 adapter (TODO bm25-engine-port, ruling
3
- * architecture §12 #4). Ported from sparse-retrieve's bm25 layer
4
- * (src/bm25/engine.ts + fast-bm25-engine.ts + the search-text assembly
5
- * discipline of src/tools/tool_search.ts); interface adapted to NavItem,
6
- * semantics unchanged.
2
+ * Search face: engine seam + fast-bm25 adapter + index assembly. The engine
3
+ * seam (TODO bm25-engine-port, ruling architecture §12 #4) was ported from
4
+ * sparse-retrieve's bm25 layer (src/bm25/engine.ts + fast-bm25-engine.ts +
5
+ * the search-text assembly discipline of src/tools/tool_search.ts);
6
+ * interface adapted to NavItem, semantics unchanged.
7
7
  *
8
- * The seam keeps the ranking engine swappable: search() returns document
9
- * indexes scored for ordering only — mapping back to NavItems is the
10
- * consumer's (buildSearchIndex) job. v1 recall matches English metadata
11
- * only (init ruling 2026-10-02): the package tokenizer splits on whitespace
12
- * and punctuation, so unsegmented CJK runs do not match shorter queries —
13
- * Chinese metadata missing English-query hits is stance, not a gap.
8
+ * Load isolation (2026-10-23): fast-bm25 is loaded synchronously on first
9
+ * engine construction, never at module load — importing @any-nav/core (or
10
+ * any of its list/read faces) costs zero engine load; only the first search
11
+ * pays it. The sync hop rides require() over the package's CJS build
12
+ * (dual-format ship), so the sync signatures stay sync.
13
+ *
14
+ * v1 recall matches English metadata only (init ruling 2026-10-02): the
15
+ * package tokenizer splits on whitespace and punctuation, so unsegmented
16
+ * CJK runs do not match shorter queries — Chinese metadata missing
17
+ * English-query hits is stance, not a gap.
14
18
  */
15
- import { BM25 } from 'fast-bm25';
19
+ import { createRequire } from 'node:module';
20
+ // Lazy sync loader: module-load-time cost of fast-bm25 is deferred to the
21
+ // first FastBm25Engine construction (the first search), keeping every
22
+ // non-search entry — CLI list / list --json / dsh nav — off the engine.
23
+ const requireCjs = createRequire(import.meta.url);
24
+ let bm25Ctor;
25
+ const loadBm25 = () => (bm25Ctor ??= requireCjs('fast-bm25').BM25);
26
+ // Seam-level decisions (TODO bm25-engine-port): fast-bm25 requires an
27
+ // explicit topK, so an unset limit defaults to 20; k1/b are passed
28
+ // explicitly — package defaults stay out of our ranking contract — keeping
29
+ // the in-service values the self-implemented engine used. Exported so
30
+ // adapter-facing descriptions of `limit` stay in sync with the behavior.
31
+ export const DEFAULT_SEARCH_LIMIT = 20;
32
+ const BM25_K1 = 1.5;
33
+ const BM25_B = 0.75;
16
34
  /**
17
35
  * fast-bm25 adapter over one pool of search texts; document id = array
18
36
  * index. An empty corpus degenerates to an always-empty engine — the
@@ -24,7 +42,7 @@ export class FastBm25Engine {
24
42
  this.bm25 =
25
43
  searchTexts.length === 0
26
44
  ? null
27
- : new BM25(searchTexts.map((content) => ({ content })), { stemming: true, ...options });
45
+ : new (loadBm25())(searchTexts.map((content) => ({ content })), { stemming: true, ...options });
28
46
  }
29
47
  search(query, limit) {
30
48
  return this.bm25 ? this.bm25.search(query, limit) : [];
@@ -51,4 +69,35 @@ export function navSearchText(item) {
51
69
  push(item.locator.path);
52
70
  return parts.join(' ');
53
71
  }
72
+ /**
73
+ * One search pool over the scanned sources' file items (buildSearchIndex:
74
+ * engine assembly + hit mapping, moved here from query.ts 2026-10-23 so the
75
+ * non-search faces never load fast-bm25). The index is a snapshot; freshness
76
+ * is the caller's rebuild policy.
77
+ */
78
+ export function buildSearchIndex(sources) {
79
+ const entries = [];
80
+ const visit = (nodes) => {
81
+ for (const node of nodes ?? []) {
82
+ if (node.kind === 'file' && node.item)
83
+ entries.push({ item: node.item });
84
+ else
85
+ visit(node.children);
86
+ }
87
+ };
88
+ for (const source of sources)
89
+ visit(source.tree.children);
90
+ // One pool over all sources (nav retirement: the config root is the
91
+ // single source; per-source scoping lost its selector).
92
+ const engine = new FastBm25Engine(entries.map((entry) => navSearchText(entry.item)), { k1: BM25_K1, b: BM25_B });
93
+ return {
94
+ search({ text, limit }) {
95
+ const top = Math.max(0, limit ?? DEFAULT_SEARCH_LIMIT);
96
+ return engine.search(text, top).map(({ index, score }) => {
97
+ const item = entries[index].item;
98
+ return { item, score, snippet: item.description.slice(0, 100) };
99
+ });
100
+ },
101
+ };
102
+ }
54
103
  //# sourceMappingURL=search-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../src/search-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAyBjC;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACR,IAAI,CAAc;IAEnC,YAAY,WAAqB,EAAE,OAAO,GAAoB,EAAE;QAC9D,IAAI,CAAC,IAAI;YACP,WAAW,CAAC,MAAM,KAAK,CAAC;gBACtB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,IAAI,CACN,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAC3C,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAC/B,CAAC;IACV,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,KAAa;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,IAAwB,EAAQ,EAAE;QAC9C,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../src/search-engine.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -15,9 +15,10 @@ export type { DiagnosticAudience, NavItem, NavLocator, NavLocatorKind, NavNode,
15
15
  * the SDK (routes ported + core additions): scan-root-not-found /
16
16
  * scan-root-is-file / scan-root-unsupported / unreadable-directory /
17
17
  * unreadable-file / file-limit-reached / count-truncated-at-limit (per-row
18
- * floor-count disclosure, ADR-0010 U12) / no-description (core placeholder) /
19
- * sidecar-unreadable (directory description sidecar) / route-rows-truncated
20
- * (view-level breadth guard, framework decision 9) / expand-path-missing
18
+ * floor-count disclosure) / no-description (core placeholder) /
19
+ * description-carrier-unreadable (folder description carrier — package.json /
20
+ * manifest.yml) / route-rows-truncated
21
+ * (view-level breadth guard) / expand-path-missing
21
22
  * (local list) / section-trimmed-to-budget (write-face guard: marker
22
23
  * branches collapsed first, then lines trimmed — budget-guard unit; carries
23
24
  * face: 'write', so it surfaces only where the write artifact is produced).
@@ -28,7 +29,7 @@ export type { DiagnosticAudience, NavItem, NavLocator, NavLocatorKind, NavNode,
28
29
  * count-truncated-at-limit / route-rows-truncated / fragment-over-budget /
29
30
  * scan-root-* / candidate-feed-*): travels in consumer payloads as the
30
31
  * single signal. 'maintainer' — corpus quality or config someone must fix
31
- * (no-description / unreadable-* / sidecar-unreadable /
32
+ * (no-description / unreadable-* / description-carrier-unreadable /
32
33
  * expand-path-missing): maintainer side-channel only (CLI stderr); agent
33
34
  * faces stay silent. New codes must pick an audience — the envelope
34
35
  * burden account (specs/surface.md adapter obligations).
@@ -49,7 +50,7 @@ export interface FragmentNode {
49
50
  description?: string;
50
51
  /** Folder only: recursive .md count under it (what expansion would list). */
51
52
  below?: number;
52
- /** Folder only: present when the maxFiles budget cut the descent — `below` is a floor (renders ≥N, U12). */
53
+ /** Folder only: present when the maxFiles budget cut the descent — `below` is a floor (renders ≥N). */
53
54
  countIncomplete?: true;
54
55
  /** Folder only: curated children — present iff the folder is a local member. */
55
56
  children?: FragmentNode[];
@@ -102,7 +103,7 @@ export interface SearchHit {
102
103
  snippet?: string;
103
104
  }
104
105
  /**
105
- * Candidate-feed row (ADR-0012): one nav node as a word-picker candidate,
106
+ * Candidate-feed row: one nav node as a word-picker candidate,
106
107
  * paths re-rooted onto the query's baseDir. Pure data by contract — the
107
108
  * feed crosses plugin seams as a structural mirror, never shared type
108
109
  * instances (no classes, functions, Date, Map).
@@ -114,7 +115,7 @@ export interface NavCandidate {
114
115
  /** Present when a real description exists; placeholders are omitted. */
115
116
  description?: string;
116
117
  }
117
- /** Candidate feed (ADR-0012): the whole curated tree, flattened for matchers. */
118
+ /** Candidate feed: the whole curated tree, flattened for matchers. */
118
119
  export interface NavCandidateFeed {
119
120
  /** Provenance header: source config path + resolved absolute root, config order. */
120
121
  sources: {
@@ -145,18 +146,18 @@ export interface NavSource {
145
146
  root: string;
146
147
  tree: NavNode;
147
148
  itemCount: number;
148
- /** Non-fatal scan warnings (structured; vocabulary per ADR-0010). */
149
+ /** Non-fatal scan warnings (structured). */
149
150
  diagnostics: ScanDiagnostic[];
150
151
  /**
151
- * Dir paths whose descent the maxFiles budget cut short (scan-walk fact,
152
- * ADR-0010 U12): folder rows under these paths render floor (≥) counts —
152
+ * Dir paths whose descent the maxFiles budget cut short (scan-walk
153
+ * fact): folder rows under these paths render floor (≥) counts —
153
154
  * a lens fact on the source envelope, never on the scan-domain NavNode
154
155
  * (decision 2). Absent when no cut happened.
155
156
  */
156
157
  countIncompletePaths?: readonly string[];
157
158
  }
158
159
  /**
159
- * Routing-view node (ADR-0010: the view projection superset — truncated
160
+ * Routing-view node (the view projection superset — truncated
160
161
  * markers live here, never on the scan-domain NavNode). A node is
161
162
  * structural-only when it carries children but no markdown/kind/description:
162
163
  * the path leading to real entries; flat output skips it (the index face's
@@ -176,15 +177,15 @@ export interface RouteViewNode {
176
177
  * consumers may rely on it as negative evidence: expansion lists exactly
177
178
  * N entries, and content the policy excludes never counts.
178
179
  *
179
- * The commitment holds for completed walks only: present (U12,
180
- * count-truncated-at-limit) when the scan.maxFiles budget cut this
180
+ * The commitment holds for completed walks only: present
181
+ * (count-truncated-at-limit) when the scan.maxFiles budget cut this
181
182
  * folder's descent — the count is then a floor (rows render ≥N, at least
182
183
  * N, possibly more).
183
184
  */
184
185
  omittedMarkdownCount?: number;
185
186
  /**
186
187
  * Present iff this truncated folder sits on the maxFiles cut chain: its
187
- * omittedMarkdownCount is a floor, not the total (U12 fact-safe cut).
188
+ * omittedMarkdownCount is a floor, not the total (fact-safe cut).
188
189
  * Rides the JSON face verbatim (additive, presence-only).
189
190
  */
190
191
  countIncomplete?: true;
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "@any-nav/core",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Any-Nav SDK: read-only core that scans Markdown folders into navigation, decides exposure within a context budget, renders injection fragments, and answers list/search/read. Adapters own all writes, processes, and protocols.",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/CatheadOwl/any-nav.git"
9
+ },
6
10
  "type": "module",
7
11
  "main": "./dist/index.js",
8
12
  "types": "./dist/index.d.ts",
@@ -11,7 +15,8 @@
11
15
  "CHANGELOG.md"
12
16
  ],
13
17
  "publishConfig": {
14
- "access": "public"
18
+ "access": "public",
19
+ "provenance": false
15
20
  },
16
21
  "keywords": [
17
22
  "agent",
@@ -20,7 +25,7 @@
20
25
  "context"
21
26
  ],
22
27
  "dependencies": {
23
- "@any-nav/scan": "0.1.0",
28
+ "@any-nav/scan": "0.2.0",
24
29
  "fast-bm25": "^0.0.6",
25
30
  "smol-toml": "^1.9.0"
26
31
  },
@@ -1,10 +0,0 @@
1
- /**
2
- * Bindings: passive-push declarations (mode ④).
3
- *
4
- * Interface only — the harness extracts paths from prompts and tool
5
- * calls and calls resolve(); core never triggers. Glob support is a
6
- * small in-house matcher (** across separators, * and ? within one).
7
- */
8
- import type { NavSource, PushResolution } from './types.ts';
9
- export declare function globToRegExp(pattern: string): RegExp;
10
- export declare function resolvePush(sources: NavSource[], path: string): PushResolution;
package/dist/bindings.js DELETED
@@ -1,51 +0,0 @@
1
- export function globToRegExp(pattern) {
2
- const segments = pattern.replace(/\\/g, '/').split('/');
3
- let source = '';
4
- for (let i = 0; i < segments.length; i++) {
5
- const segment = segments[i];
6
- const isLast = i === segments.length - 1;
7
- if (segment === '**') {
8
- // Trailing ** matches any tail; mid-pattern ** matches whole directories.
9
- source += isLast ? '.*' : '(?:.*/)?';
10
- continue;
11
- }
12
- source += segment
13
- .split('')
14
- .map((ch) => (ch === '*' ? '[^/]*' : ch === '?' ? '[^/]' : escapeRegExp(ch)))
15
- .join('');
16
- if (!isLast)
17
- source += '/';
18
- }
19
- return new RegExp(`^${source}$`);
20
- }
21
- export function resolvePush(sources, path) {
22
- const normalized = path.replace(/\\/g, '/').replace(/^\.\//, '').replace(/^\/+/, '');
23
- const items = [];
24
- for (const source of sources) {
25
- for (const binding of source.config.bind ?? []) {
26
- if (!globToRegExp(binding.match).test(normalized))
27
- continue;
28
- for (const itemPath of binding.items) {
29
- const item = findItem(source.tree, itemPath.replace(/\\/g, '/').replace(/^\.\//, ''));
30
- if (item !== null)
31
- items.push(item);
32
- }
33
- }
34
- }
35
- return { matched: items.length > 0, items };
36
- }
37
- function findItem(tree, relPath) {
38
- const segments = relPath.split('/').filter((s) => s !== '');
39
- let node = tree;
40
- for (const segment of segments) {
41
- const next = node.children?.find((c) => c.name === segment || (c.kind === 'file' && `${c.name}.md` === segment.toLowerCase()));
42
- if (!next)
43
- return null;
44
- node = next;
45
- }
46
- return node.kind === 'file' ? node.item ?? null : null;
47
- }
48
- function escapeRegExp(ch) {
49
- return /[.*+?^${}()|[\]\\]/.test(ch) ? `\\${ch}` : ch;
50
- }
51
- //# sourceMappingURL=bindings.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- /**
2
- * One-line description extraction, ported verbatim from the routes module
3
- * (dsh-plugin-dev/extras/modules/routes/src/description.ts, ADR-0010:
4
- * absorption is porting — every boundary handling here is tuition already
5
- * paid on production corpora; do not "simplify" it).
6
- *
7
- * Priority: ① frontmatter `description:`, ② an explicit `description:` line
8
- * in the document head, ③ the first substantive body line as a fallback.
9
- * Returns null when none match.
10
- */
11
- /**
12
- * Extracts a one-line route description from Markdown, in priority order:
13
- * ① frontmatter `description:`, ② an explicit `description:` line in the document
14
- * head, ③ the first substantive body line as a fallback. Returns `null` when none match.
15
- */
16
- export declare function extractDescription(content: string): string | null;
17
- /**
18
- * Directory sidecar read (2026-10-07): `_category_.yml/.yaml/.json` carry a
19
- * folder's description so release-face READMEs stay untouched. YAML reuses
20
- * the frontmatter ① key reader — the sidecar is frontmatter without the
21
- * document (an indented `link.description:` therefore reads too, covering
22
- * Docusaurus-shaped files for free); JSON parses properly and accepts the
23
- * top-level `description` or the Docusaurus `link.description` shape.
24
- * `{ description: null }` means the file carries no description key.
25
- */
26
- export type SidecarRead = {
27
- description: string | null;
28
- } | {
29
- error: string;
30
- };
31
- export declare function extractSidecarDescription(fileName: string, content: string): SidecarRead;
@@ -1,273 +0,0 @@
1
- /**
2
- * One-line description extraction, ported verbatim from the routes module
3
- * (dsh-plugin-dev/extras/modules/routes/src/description.ts, ADR-0010:
4
- * absorption is porting — every boundary handling here is tuition already
5
- * paid on production corpora; do not "simplify" it).
6
- *
7
- * Priority: ① frontmatter `description:`, ② an explicit `description:` line
8
- * in the document head, ③ the first substantive body line as a fallback.
9
- * Returns null when none match.
10
- */
11
- /** Body-line description lookup only trusts the document head, so a `description:` inside a code block or deep in the prose cannot hijack the route. */
12
- const BODY_HEAD_LINE_LIMIT = 15;
13
- /** Minimum code-point length for a body line to count as a substantive first sentence (fallback ③). Word count is avoided because CJK text has no space tokenization. */
14
- const MIN_SUBSTANTIVE_LENGTH = 20;
15
- /** Approximate cap (code points) for a fallback description; longer lines are cut at the last sentence boundary inside the cap. */
16
- const MAX_DESCRIPTION_CHARS = 120;
17
- const SENTENCE_ENDERS = ['.', '。', '!', '!', '?', '?', ';', ';'];
18
- /** Link or image, tolerating one level of nesting so a badge (`[![alt](img)](href)`) counts as a single token. */
19
- const LINK_OR_IMAGE = /!?\[(?:[^[\]]|\[[^\]]*\])*\]\([^)]*\)/gu;
20
- /**
21
- * Extracts a one-line route description from Markdown, in priority order:
22
- * ① frontmatter `description:`, ② an explicit `description:` line in the document
23
- * head, ③ the first substantive body line as a fallback. Returns `null` when none match.
24
- */
25
- export function extractDescription(content) {
26
- const frontmatter = parseYamlLikeFrontmatter(content);
27
- const frontmatterDescription = frontmatter
28
- ? readDescriptionKey(frontmatter.split(/\r?\n/u))
29
- : null;
30
- if (frontmatterDescription)
31
- return frontmatterDescription;
32
- const body = frontmatter ? contentAfterFrontmatter(content) : content;
33
- const openBodyLines = stripHtmlComments(stripCodeFences(body.split(/\r?\n/u))).slice(0, BODY_HEAD_LINE_LIMIT);
34
- const bodyDescription = readDescriptionKey(openBodyLines);
35
- if (bodyDescription)
36
- return bodyDescription;
37
- return firstSubstantiveLine(openBodyLines);
38
- }
39
- /** Fallback ③: the first body line that is prose (not Markdown structure) and long enough, cleaned of inline Markdown and capped. */
40
- function firstSubstantiveLine(lines) {
41
- for (let index = 0; index < lines.length; index++) {
42
- const line = lines[index];
43
- if (isStructuralLine(line) || isSetextTitle(lines, index))
44
- continue;
45
- const cleaned = cleanInlineMarkdown(line);
46
- if (codePointLength(cleaned) < MIN_SUBSTANTIVE_LENGTH)
47
- continue;
48
- return truncateDescription(cleaned);
49
- }
50
- return null;
51
- }
52
- /** A setext heading's title line sits directly above its `===`/`---` underline; skip the title, not just the underline. */
53
- function isSetextTitle(lines, index) {
54
- if (index + 1 >= lines.length)
55
- return false;
56
- const trimmed = lines[index + 1].trim();
57
- return trimmed.length > 0 && /^(={3,}|-{3,})\s*$/u.test(trimmed);
58
- }
59
- /** Structural Markdown lines never carry a description; they are skipped before the length test. */
60
- function isStructuralLine(line) {
61
- const text = line.trim();
62
- if (text.length === 0)
63
- return true;
64
- if (/^#{1,6}(\s|$)/u.test(text))
65
- return true; // ATX heading
66
- if (/^(={3,}|-{3,}|\*{3,}|_{3,})$/u.test(text))
67
- return true; // setext underline / horizontal rule
68
- if (/^>/u.test(text))
69
- return true;
70
- if (/^[-+*](\s|$)/u.test(text))
71
- return true; // unordered list
72
- if (/^\d{1,3}\.\s/u.test(text))
73
- return true; // ordered list
74
- // table row / language-switch ("English | [中文]"); inline code spans are
75
- // masked first — marked-up code is never table structure (ADR-0010 U8)
76
- const outsideCodeSpans = text.replace(/`[^`]*`/gu, '');
77
- if (outsideCodeSpans.startsWith('|') || /\s\|\s/u.test(outsideCodeSpans))
78
- return true;
79
- if (/^</u.test(text))
80
- return true;
81
- if (isLinkOnlyLine(text))
82
- return true; // badge row / nav chrome
83
- return false;
84
- }
85
- /** A line whose visible text is only links/images (badges, nav) carries no prose description. */
86
- function isLinkOnlyLine(text) {
87
- return text.length > 0 && text.replace(LINK_OR_IMAGE, '').trim().length === 0;
88
- }
89
- /** Light inline-Markdown cleanup so a fallback line reads as plain prose. */
90
- function cleanInlineMarkdown(line) {
91
- return line
92
- .trim()
93
- .replace(/!\[([^\]]*)\]\([^)]*\)/gu, '$1')
94
- .replace(/\[([^\]]*)\]\([^)]*\)/gu, '$1')
95
- .replace(/`([^`]*)`/gu, '$1')
96
- .replace(/\*\*([^*]+)\*\*/gu, '$1')
97
- .replace(/__([^_]+)__/gu, '$1')
98
- .replace(/\s+/g, ' ')
99
- .replace(/[::]\s*$/u, '')
100
- .trim();
101
- }
102
- /** Cut long fallback text at the last sentence boundary inside the cap; hard-cut (with a trailing `...`) when no boundary is deep enough. */
103
- function truncateDescription(text) {
104
- if (codePointLength(text) <= MAX_DESCRIPTION_CHARS)
105
- return text;
106
- const head = [...text].slice(0, MAX_DESCRIPTION_CHARS).join('');
107
- const boundary = lastSentenceBoundary(head);
108
- if (boundary >= 0) {
109
- const cut = head.slice(0, boundary + 1).trimEnd();
110
- if (codePointLength(cut) >= MIN_SUBSTANTIVE_LENGTH)
111
- return cut;
112
- }
113
- return head.trimEnd() + '...';
114
- }
115
- /** Last sentence ender inside `text`, skipping abbreviation dots (`ctx.`, `e.g.`). */
116
- function lastSentenceBoundary(text) {
117
- for (let index = text.length - 1; index >= 0; index--) {
118
- const char = text[index];
119
- if (char === '.') {
120
- if (isAbbreviationDot(text, index))
121
- continue;
122
- return index;
123
- }
124
- if (SENTENCE_ENDERS.includes(char))
125
- return index;
126
- }
127
- return -1;
128
- }
129
- function isAbbreviationDot(text, index) {
130
- let letters = 0;
131
- for (let prev = index - 1; prev >= 0 && prev >= index - 3; prev--) {
132
- if (/[a-z]/u.test(text[prev]))
133
- letters++;
134
- else
135
- break;
136
- }
137
- if (letters === 0)
138
- return false;
139
- const next = index + 1 < text.length ? text[index + 1] : '';
140
- return /[a-z,;):]/u.test(next);
141
- }
142
- function codePointLength(text) {
143
- return [...text].length;
144
- }
145
- /** Drops fenced code blocks (```…``` and ~~~…~~~) so tool/program examples cannot leak `description:` matches. */
146
- function stripCodeFences(lines) {
147
- const openLines = [];
148
- let insideFence = false;
149
- for (const line of lines) {
150
- if (isFenceLine(line)) {
151
- insideFence = !insideFence;
152
- continue;
153
- }
154
- if (!insideFence)
155
- openLines.push(line);
156
- }
157
- return openLines;
158
- }
159
- function isFenceLine(line) {
160
- return /^\s*(`{3,}|~{3,})/u.test(line);
161
- }
162
- /** Drops HTML comments (`<!--`…`-->`, possibly multi-line) so generated/boilerplate comment text cannot become the description. */
163
- function stripHtmlComments(lines) {
164
- const openLines = [];
165
- let insideComment = false;
166
- for (const line of lines) {
167
- let rest = line;
168
- let openPart = '';
169
- while (rest.length > 0) {
170
- if (!insideComment) {
171
- const start = rest.indexOf('<!--');
172
- if (start === -1) {
173
- openPart += rest;
174
- break;
175
- }
176
- openPart += rest.slice(0, start);
177
- rest = rest.slice(start + 4);
178
- insideComment = true;
179
- }
180
- else {
181
- const end = rest.indexOf('-->');
182
- if (end === -1) {
183
- rest = '';
184
- break;
185
- }
186
- rest = rest.slice(end + 3);
187
- insideComment = false;
188
- }
189
- }
190
- openLines.push(openPart);
191
- }
192
- return openLines;
193
- }
194
- export function extractSidecarDescription(fileName, content) {
195
- if (fileName.toLowerCase().endsWith('.json')) {
196
- let parsed;
197
- try {
198
- parsed = JSON.parse(content);
199
- }
200
- catch (err) {
201
- return { error: `invalid JSON: ${err.message}` };
202
- }
203
- if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
204
- return { error: 'sidecar JSON must be an object' };
205
- }
206
- const obj = parsed;
207
- const fromKey = (value) => typeof value === 'string' && value.trim() !== '' ? value.trim() : null;
208
- const top = fromKey(obj.description);
209
- if (top !== null)
210
- return { description: top };
211
- const link = typeof obj.link === 'object' && obj.link !== null && !Array.isArray(obj.link)
212
- ? obj.link
213
- : undefined;
214
- const nested = link === undefined ? null : fromKey(link.description);
215
- return { description: nested };
216
- }
217
- return { description: readDescriptionKey(content.split(/\r?\n/u)) };
218
- }
219
- function parseYamlLikeFrontmatter(content) {
220
- const lines = content.split(/\r?\n/u);
221
- if (lines[0]?.trim() !== '---')
222
- return null;
223
- const endIndex = lines.findIndex((line, index) => index > 0 && line.trim() === '---');
224
- if (endIndex === -1)
225
- return null;
226
- return lines.slice(1, endIndex).join('\n');
227
- }
228
- function contentAfterFrontmatter(content) {
229
- const lines = content.split(/\r?\n/u);
230
- const endIndex = lines.findIndex((line, index) => index > 0 && line.trim() === '---');
231
- return endIndex === -1 ? content : lines.slice(endIndex + 1).join('\n');
232
- }
233
- function readDescriptionKey(lines) {
234
- for (let index = 0; index < lines.length; index++) {
235
- const line = lines[index];
236
- const match = line.match(/^\s*(description|decription)\s*:\s*(.*)$/iu);
237
- if (!match)
238
- continue;
239
- const inline = stripYamlString(match[2].trim());
240
- if (inline)
241
- return inline;
242
- const block = readIndentedBlock(lines, index + 1);
243
- if (block)
244
- return block;
245
- }
246
- return null;
247
- }
248
- function readIndentedBlock(lines, start) {
249
- const collected = [];
250
- for (let index = start; index < lines.length; index++) {
251
- const line = lines[index];
252
- if (line.trim().length === 0) {
253
- if (collected.length > 0)
254
- break;
255
- continue;
256
- }
257
- if (!/^\s+/.test(line))
258
- break;
259
- collected.push(line.trim());
260
- }
261
- return collected.length > 0 ? collected.join(' ') : null;
262
- }
263
- function stripYamlString(value) {
264
- const stripped = value
265
- .replace(/^\|[+-]?$/u, '')
266
- .replace(/^>[+-]?$/u, '')
267
- .trim();
268
- if (!stripped)
269
- return null;
270
- const quoted = stripped.match(/^(['"])(.*)\1$/u);
271
- return (quoted ? quoted[2] : stripped).trim() || null;
272
- }
273
- //# sourceMappingURL=description.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"description.js","sourceRoot":"","sources":["../src/description.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wJAAwJ;AACxJ,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,yKAAyK;AACzK,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,mIAAmI;AACnI,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,MAAM,eAAe,GAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpF,kHAAkH;AAClH,MAAM,aAAa,GAAG,yCAAyC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,WAAW,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,sBAAsB,GAAG,WAAW;QACxC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,sBAAsB;QAAE,OAAO,sBAAsB,CAAC;IAE1D,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,MAAM,aAAa,GAAG,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAE9G,MAAM,eAAe,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC1D,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,OAAO,oBAAoB,CAAC,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,qIAAqI;AACrI,SAAS,oBAAoB,CAAC,KAAwB;IACpD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;YAAE,SAAS;QACpE,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,sBAAsB;YAAE,SAAS;QAChE,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2HAA2H;AAC3H,SAAS,aAAa,CAAC,KAAwB,EAAE,KAAa;IAC5D,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,oGAAoG;AACpG,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,cAAc;IAC5D,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,qCAAqC;IAClG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,iBAAiB;IAC9D,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,eAAe;IAC5D,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvD,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IACtF,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,yBAAyB;IAChE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iGAAiG;AACjG,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,6EAA6E;AAC7E,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI;SACR,IAAI,EAAE;SACN,OAAO,CAAC,0BAA0B,EAAE,IAAI,CAAC;SACzC,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC;SACxC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;SAC5B,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC;SAClC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;SAC9B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,6IAA6I;AAC7I,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,qBAAqB;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAClD,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,sBAAsB;YAAE,OAAO,GAAG,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC;AAChC,CAAC;AAED,sFAAsF;AACtF,SAAS,oBAAoB,CAAC,IAAY;IACxC,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;gBAAE,SAAS;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,KAAa;IACpD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAClE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;;YACpC,MAAM;IACb,CAAC;IACD,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;AAC1B,CAAC;AAED,kHAAkH;AAClH,SAAS,eAAe,CAAC,KAAwB;IAC/C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,WAAW;YAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,mIAAmI;AACnI,SAAS,iBAAiB,CAAC,KAAwB;IACjD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;oBACjB,QAAQ,IAAI,IAAI,CAAC;oBACjB,MAAM;gBACR,CAAC;gBACD,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACjC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC7B,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;oBACf,IAAI,GAAG,EAAE,CAAC;oBACV,MAAM;gBACR,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC3B,aAAa,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAaD,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,OAAe;IACzE,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,KAAK,EAAE,iBAAkB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9D,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;QACrD,CAAC;QACD,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,MAAM,OAAO,GAAG,CAAC,KAAc,EAAiB,EAAE,CAChD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACzE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;QAC9C,MAAM,IAAI,GACR,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3E,CAAC,CAAE,GAAG,CAAC,IAAgC;YACvC,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;IACtF,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;IACtF,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAwB;IAClD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAwB,EAAE,KAAa;IAChE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM;YAChC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM;QAC9B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,QAAQ,GAAG,KAAK;SACnB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,IAAI,EAAE,CAAC;IACV,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACxD,CAAC"}
@@ -1,9 +0,0 @@
1
- export interface GitignoreRule {
2
- baseDir: string;
3
- pattern: string;
4
- negated: boolean;
5
- directoryOnly: boolean;
6
- }
7
- export declare function readInheritedGitignoreRules(root: string, scanRoot: string): Promise<GitignoreRule[]>;
8
- export declare function readGitignoreRules(dir: string): Promise<GitignoreRule[]>;
9
- export declare function isGitignored(filePath: string, isDirectory: boolean, rules: readonly GitignoreRule[]): boolean;