/** * @module docs-loader * * Documentation Loading and Search Utilities * * This module provides functionality for loading, searching, and retrieving * Macroforge documentation sections. Documentation is stored as markdown files * with metadata in `docs/sections.json`. * * Key features: * - Loads documentation sections from disk with lazy content loading * - Supports multiple search strategies (exact, partial, fuzzy, category) * - Handles chunked documentation for large sections * - Provides type-safe interfaces for documentation structure * * @example * ```typescript * import { loadSections, getSection, searchSections } from './docs-loader.js'; * * const sections = loadSections(); * const debug = getSection(sections, 'debug'); * const matches = searchSections(sections, 'serialization'); * ``` */ /** * Represents a documentation section with metadata and optional content. * * Sections can be standalone or part of a chunked hierarchy for large documents. * Chunked sections have a parent entry with `is_chunked: true` and child entries * with `parent_id` pointing to the parent. * * @property id - Unique identifier for the section (e.g., "debug", "serde-validators") * @property title - Human-readable title displayed to users * @property category - Category slug for grouping (e.g., "macros", "guides") * @property category_title - Human-readable category name * @property path - Relative path to the markdown content file from docs directory * @property use_cases - Comma-separated keywords describing when this doc is useful * @property content - The actual markdown content (loaded lazily, undefined for chunked parents) * @property is_chunked - True if this section is split into multiple sub-chunks * @property parent_id - For sub-chunks, the ID of the parent section * @property chunk_ids - For chunked parents, ordered list of child chunk IDs */ export interface Section { id: string; title: string; category: string; category_title: string; path: string; use_cases: string; content?: string; is_chunked?: boolean; parent_id?: string; chunk_ids?: string[]; } /** * Loads all documentation sections from the docs directory. * * This function reads `docs/sections.json` for metadata and loads the markdown * content for each section from disk. Chunked parent sections do not have their * content loaded directly - their content is accessed through child chunks. * * @returns Array of Section objects with content loaded. Returns empty array if * sections.json is not found (with a warning logged to stderr). * * @example * ```typescript * const sections = loadSections(); * console.log(`Loaded ${sections.length} sections`); * ``` */ export declare function loadSections(): Section[]; /** * Finds a section by ID or title using progressive matching strategies. * * The function attempts to match in the following order (stopping at first match): * 1. Exact ID match (case-insensitive) * 2. Exact title match (case-insensitive) * 3. Partial ID match (query is substring of ID) * 4. Partial title match (query is substring of title) * * @param sections - Array of sections to search through * @param query - Search query (ID or title to find) * @returns The first matching Section, or undefined if no match found * * @example * ```typescript * const debug = getSection(sections, 'debug'); // Exact ID match * const serde = getSection(sections, 'Serialize'); // Exact title match * const partial = getSection(sections, 'valid'); // Partial match on "validators" * ``` */ export declare function getSection(sections: Section[], query: string): Section | undefined; /** * Retrieves multiple sections by their IDs or titles. * * Uses {@link getSection} for each query, deduplicating results if the same * section matches multiple queries. * * @param sections - Array of sections to search through * @param queries - Array of search queries (IDs or titles) * @returns Array of unique matching Sections in the order they were found * * @example * ```typescript * const docs = getSections(sections, ['debug', 'serialize', 'clone']); * // Returns all three sections if found * ``` */ export declare function getSections(sections: Section[], queries: string[]): Section[]; /** * Performs a fuzzy search across sections using a weighted scoring algorithm. * * The search splits the query into keywords and scores each section based on * where matches are found. Results are sorted by relevance score (highest first). * * ## Scoring Algorithm * * Each section is scored based on matches in different fields: * - **ID match** (+10): Full query found in section ID * - **Title match** (+10): Full query found in section title * - **Use cases match** (+5 per keyword): Each query keyword found in use_cases * - **Content match** (+1 per keyword): Each query keyword found in content * * The higher weights for ID/title ensure exact matches rank above content matches. * Use cases are weighted moderately as they indicate intended use. * * @param sections - Array of sections to search through * @param query - Search query (can contain multiple space-separated keywords) * @returns Array of matching Sections sorted by relevance score (highest first) * * @example * ```typescript * // Single keyword search * const results = searchSections(sections, 'validation'); * * // Multi-keyword search (scores sections matching more keywords higher) * const results = searchSections(sections, 'email url length'); * ``` */ export declare function searchSections(sections: Section[], query: string): Section[]; /** * Filters sections by category slug or category title. * * Matches against both `category` (slug) and `category_title` (display name) * to support flexible lookups. * * @param sections - Array of sections to filter * @param category - Category slug or title to filter by (case-insensitive) * @returns Array of Sections belonging to the specified category * * @example * ```typescript * // Filter by category slug * const macros = getSectionsByCategory(sections, 'macros'); * * // Filter by category title * const guides = getSectionsByCategory(sections, 'Getting Started'); * ``` */ export declare function getSectionsByCategory(sections: Section[], category: string): Section[]; //# sourceMappingURL=docs-loader.d.ts.map