SYMBOL INDEX (168 symbols across 34 files) FILE: cli/src/commands/annotate.js function registerAnnotateCommand (line 5) | function registerAnnotateCommand(program) { FILE: cli/src/commands/build.js function toPosix (line 13) | function toPosix(p) { function findEntryFiles (line 20) | function findEntryFiles(dir, base = dir) { function listDirFiles (line 36) | function listDirFiles(dir) { function dirSize (line 52) | function dirSize(dir) { function discoverAuthor (line 68) | function discoverAuthor(authorDir, authorName, contentDir) { function registerBuildCommand (line 191) | function registerBuildCommand(program) { FILE: cli/src/commands/cache.js function registerCacheCommand (line 5) | function registerCacheCommand(program) { FILE: cli/src/commands/feedback.js constant VALID_LABELS (line 13) | const VALID_LABELS = [ function collect (line 19) | function collect(val, acc) { function registerFeedbackCommand (line 24) | function registerFeedbackCommand(program) { FILE: cli/src/commands/get.js function fetchEntries (line 13) | async function fetchEntries(ids, opts, globalOpts) { function registerGetCommand (line 201) | function registerGetCommand(program) { FILE: cli/src/commands/search.js function formatEntryList (line 7) | function formatEntryList(entries) { function formatEntryDetail (line 25) | function formatEntryDetail(entry) { function registerSearchCommand (line 50) | function registerSearchCommand(program) { FILE: cli/src/commands/update.js function registerUpdateCommand (line 6) | function registerUpdateCommand(program) { FILE: cli/src/index.js function printUsage (line 22) | function printUsage() { constant SKIP_REGISTRY (line 106) | const SKIP_REGISTRY = ['update', 'cache', 'build', 'feedback', 'annotate... FILE: cli/src/lib/analytics.js constant POSTHOG_KEY (line 14) | const POSTHOG_KEY = 'phc_tO9mXIgcCuBccfN2Ut0quf6UFsd06u3Y6g1kqMaYdQX'; constant POSTHOG_HOST (line 15) | const POSTHOG_HOST = 'https://us.i.posthog.com'; function getClient (line 24) | async function getClient() { function trackEvent (line 54) | async function trackEvent(event, properties = {}) { function setCliVersion (line 85) | function setCliVersion(version) { function shutdownAnalytics (line 93) | async function shutdownAnalytics() { FILE: cli/src/lib/annotations.js function getAnnotationsDir (line 5) | function getAnnotationsDir() { function annotationPath (line 9) | function annotationPath(entryId) { function readAnnotation (line 14) | function readAnnotation(entryId) { function writeAnnotation (line 22) | function writeAnnotation(entryId, note) { function clearAnnotation (line 34) | function clearAnnotation(entryId) { function listAnnotations (line 43) | function listAnnotations() { FILE: cli/src/lib/bm25.js constant STOP_WORDS (line 7) | const STOP_WORDS = new Set([ constant DEFAULT_K1 (line 18) | const DEFAULT_K1 = 1.5; constant DEFAULT_B (line 19) | const DEFAULT_B = 0.75; constant FIELD_WEIGHTS (line 22) | const FIELD_WEIGHTS = { function getDefaultParams (line 29) | function getDefaultParams() { function isSearchableToken (line 33) | function isSearchableToken(token) { function compactIdentifier (line 37) | function compactIdentifier(text) { function splitAlphaNumeric (line 43) | function splitAlphaNumeric(text) { function tokenize (line 53) | function tokenize(text) { function tokenizeIdentifier (line 66) | function tokenizeIdentifier(text) { function buildInvertedIndex (line 98) | function buildInvertedIndex(documents) { function buildIndexFromDocuments (line 118) | function buildIndexFromDocuments(documents, params = getDefaultParams()) { function buildIndex (line 170) | function buildIndex(entries) { function scoreField (line 195) | function scoreField(queryTerms, fieldTokens, idf, avgFieldLen, k1, b) { function getCandidateDocIndexes (line 220) | function getCandidateDocIndexes(queryTerms, index) { function runSearch (line 237) | function runSearch(query, index, opts = {}) { function search (line 297) | function search(query, index, opts = {}) { function searchWithStats (line 301) | function searchWithStats(query, index, opts = {}) { FILE: cli/src/lib/cache.js function getBundledDir (line 14) | function getBundledDir() { function getSourceDir (line 18) | function getSourceDir(sourceName) { function getSourceDataDir (line 22) | function getSourceDataDir(sourceName) { function getSourceMetaPath (line 26) | function getSourceMetaPath(sourceName) { function getSourceRegistryPath (line 30) | function getSourceRegistryPath(sourceName) { function getSourceSearchIndexPath (line 34) | function getSourceSearchIndexPath(sourceName) { function readMeta (line 38) | function readMeta(sourceName) { function writeMeta (line 46) | function writeMeta(sourceName, meta) { function isSourceCacheFresh (line 52) | function isSourceCacheFresh(sourceName) { function isTimestampFresh (line 60) | function isTimestampFresh(timestamp) { function hasFreshSearchIndexState (line 67) | function hasFreshSearchIndexState(sourceName) { function shouldFetchRemoteRegistry (line 76) | function shouldFetchRemoteRegistry(sourceName, force = false) { function fetchRemoteText (line 85) | async function fetchRemoteText(url) { function fetchRemoteRegistry (line 102) | async function fetchRemoteRegistry(source, force = false) { function fetchAllRegistries (line 152) | async function fetchAllRegistries(force = false) { function fetchFullBundle (line 171) | async function fetchFullBundle(sourceName) { function fetchDoc (line 224) | async function fetchDoc(source, docPath) { function fetchDocFull (line 274) | async function fetchDocFull(source, basePath, files) { function loadSourceRegistry (line 287) | function loadSourceRegistry(source) { function loadSearchIndex (line 304) | function loadSearchIndex(source) { function getCacheStats (line 318) | function getCacheStats() { function clearCache (line 366) | function clearCache() { function ensureRegistry (line 385) | async function ensureRegistry() { FILE: cli/src/lib/config.js constant DEFAULT_CDN_URL (line 6) | const DEFAULT_CDN_URL = 'https://cdn.aichub.org/v1'; constant DEFAULT_TELEMETRY_URL (line 7) | const DEFAULT_TELEMETRY_URL = 'https://api.aichub.org/v1'; constant DEFAULTS (line 9) | const DEFAULTS = { function getChubDir (line 21) | function getChubDir() { function loadConfig (line 25) | function loadConfig() { FILE: cli/src/lib/frontmatter.js function parseFrontmatter (line 7) | function parseFrontmatter(content) { FILE: cli/src/lib/identity.js function getMachineUUID (line 13) | function getMachineUUID() { function getOrCreateClientId (line 49) | async function getOrCreateClientId() { function isFirstRun (line 87) | function isFirstRun() { function detectAgent (line 94) | function detectAgent() { function detectAgentVersion (line 108) | function detectAgentVersion() { FILE: cli/src/lib/normalize.js constant ALIASES (line 1) | const ALIASES = { constant DISPLAY (line 9) | const DISPLAY = { function normalizeLanguage (line 17) | function normalizeLanguage(lang) { function displayLanguage (line 23) | function displayLanguage(lang) { FILE: cli/src/lib/output.js function output (line 8) | function output(data, humanFormatter, opts) { function info (line 19) | function info(msg) { function error (line 26) | function error(msg, opts) { FILE: cli/src/lib/registry.js function getSearchLookupId (line 9) | function getSearchLookupId(sourceName, entryId) { function normalizeQuery (line 13) | function normalizeQuery(query) { function splitCompactSegments (line 19) | function splitCompactSegments(text) { function levenshteinDistance (line 26) | function levenshteinDistance(a, b, maxDistance = Infinity) { function scoreCompactCandidate (line 56) | function scoreCompactCandidate(queryCompact, candidateCompact, weights) { function scoreEntryLexicalVariant (line 82) | function scoreEntryLexicalVariant(entry, queryCompact) { function scoreEntryLexicalBoost (line 142) | function scoreEntryLexicalBoost(entry, normalizedQuery, rescueTerms = []) { function getMissingQueryTerms (line 155) | function getMissingQueryTerms(normalizedQuery) { function shouldRunGlobalLexicalScan (line 163) | function shouldRunGlobalLexicalScan(normalizedQuery, resultByKey) { function namespaceSearchIndex (line 180) | function namespaceSearchIndex(index, sourceName) { function getMerged (line 194) | function getMerged() { function getAllEntries (line 257) | function getAllEntries() { function applySourceFilter (line 269) | function applySourceFilter(entries) { function applyFilters (line 278) | function applyFilters(entries, filters) { function getEntriesById (line 300) | function getEntriesById(id, entries) { function isMultiSource (line 307) | function isMultiSource() { function getDisplayId (line 315) | function getDisplayId(entry) { function searchEntries (line 327) | function searchEntries(query, filters = {}) { function getEntry (line 425) | function getEntry(idOrNamespacedId, type = null) { function listEntries (line 458) | function listEntries(filters = {}) { function resolveDocPath (line 478) | function resolveDocPath(entry, language, version) { function resolveEntryFile (line 530) | function resolveEntryFile(resolved, type) { FILE: cli/src/lib/telemetry.js constant DEFAULT_TELEMETRY_URL (line 3) | const DEFAULT_TELEMETRY_URL = 'https://api.aichub.org/v1'; function isTelemetryEnabled (line 5) | function isTelemetryEnabled() { function isFeedbackEnabled (line 11) | function isFeedbackEnabled() { function getTelemetryUrl (line 17) | function getTelemetryUrl() { function sendFeedback (line 41) | async function sendFeedback(entryId, entryType, rating, opts = {}) { FILE: cli/src/lib/welcome.js constant WELCOME_MARKER (line 6) | const WELCOME_MARKER = '.welcome_shown'; function showWelcomeIfNeeded (line 12) | function showWelcomeIfNeeded(opts = {}) { FILE: cli/src/mcp/stdio-lifecycle.js function attachStdioShutdownHandlers (line 5) | function attachStdioShutdownHandlers({ FILE: cli/src/mcp/tools.js function getCliVersion (line 17) | function getCliVersion() { function textResult (line 31) | function textResult(data) { function errorResult (line 37) | function errorResult(message, details = {}) { function simplifyEntry (line 47) | function simplifyEntry(entry) { function handleSearch (line 63) | async function handleSearch({ query, tags, lang, limit = 20 }) { function handleGet (line 97) | async function handleGet({ id, lang, version, full = false, file }) { function handleList (line 195) | async function handleList({ tags, lang, limit = 50 }) { function handleAnnotate (line 209) | async function handleAnnotate({ id, note, clear = false, list = false }) { function handleFeedback (line 252) | async function handleFeedback({ id, rating, comment, type, lang, version... FILE: cli/test/e2e.test.js constant CLI (line 9) | const CLI = join(__dirname, '..', 'bin', 'chub'); constant FIXTURES (line 10) | const FIXTURES = join(__dirname, 'fixtures'); constant BUILD_OUTPUT (line 11) | const BUILD_OUTPUT = join(FIXTURES, 'dist'); constant CLI_TEST_TIMEOUT (line 12) | const CLI_TEST_TIMEOUT = 15000; constant TEST_ENV (line 13) | const TEST_ENV = { ...process.env, NO_COLOR: '1', CHUB_TELEMETRY: '0', C... function chub (line 19) | function chub(args, { expectError = false } = {}) { function chubJSON (line 33) | function chubJSON(args) { FILE: cli/tests/commands/build.test.js constant CLI_BIN (line 7) | const CLI_BIN = join(import.meta.dirname, '..', '..', 'bin', 'chub'); constant FIXTURES (line 8) | const FIXTURES = join(import.meta.dirname, '..', '..', 'test', 'fixtures'); constant BUILD_TEST_TIMEOUT (line 9) | const BUILD_TEST_TIMEOUT = 15000; constant TEST_ENV (line 11) | const TEST_ENV = { ...process.env, CHUB_TELEMETRY: '0', CHUB_FEEDBACK: '... FILE: cli/tests/commands/get.test.js function parseResult (line 25) | function parseResult(result) { FILE: cli/tests/commands/go-lang.test.js constant REPO_ROOT (line 20) | const REPO_ROOT = join(import.meta.dirname, '..', '..', '..'); constant CLI_BIN (line 21) | const CLI_BIN = join(import.meta.dirname, '..', '..', 'bin', 'chub'); constant FIXTURES (line 22) | const FIXTURES = join(import.meta.dirname, '..', '..', 'test', 'fixtures'); constant GO_DOC_PATH (line 23) | const GO_DOC_PATH = join(REPO_ROOT, 'content', 'openai', 'docs', 'chat',... constant GO_FIXTURE_PATH (line 24) | const GO_FIXTURE_PATH = join(FIXTURES, 'multilang', 'docs', 'client', 'g... constant BUILD_TEST_TIMEOUT (line 25) | const BUILD_TEST_TIMEOUT = 15000; constant TEST_ENV (line 27) | const TEST_ENV = { ...process.env, CHUB_TELEMETRY: '0', CHUB_FEEDBACK: '... FILE: cli/tests/commands/search.test.js function runSearch (line 34) | async function runSearch(args = [], globalArgs = []) { FILE: cli/tests/lib/analytics.test.js method constructor (line 44) | constructor() {} method capture (line 45) | capture(event) { capturedEvents.push(event); } method flush (line 46) | async flush() {} method shutdown (line 47) | async shutdown() {} method constructor (line 67) | constructor() {} method capture (line 68) | capture(event) { capturedEvents.push(event); } method flush (line 69) | async flush() {} method shutdown (line 70) | async shutdown() {} FILE: cli/tests/lib/cache.test.js constant BUNDLED_DIR (line 6) | const BUNDLED_DIR = join(import.meta.dirname, '..', '..', 'dist'); function restoreBundledDir (line 11) | function restoreBundledDir() { FILE: cli/tests/lib/registry.multisource.test.js constant ORIGINAL_CHUB_DIR (line 7) | const ORIGINAL_CHUB_DIR = process.env.CHUB_DIR; function writeSource (line 10) | function writeSource(root, quality, description, tags = []) { function loadRegistryWithSources (line 57) | async function loadRegistryWithSources(sourceRoots) { FILE: cli/tests/lib/registry.search-behavior.test.js constant ORIGINAL_CHUB_DIR (line 7) | const ORIGINAL_CHUB_DIR = process.env.CHUB_DIR; function writeSource (line 10) | function writeSource(root, docs) { function loadRegistry (line 31) | async function loadRegistry(docs) { FILE: cli/tests/lib/welcome.test.js constant TEST_DIR (line 6) | const TEST_DIR = join('/tmp', 'test-chub'); FILE: cli/tests/mcp/stdio-lifecycle.test.js function makeStream (line 5) | function makeStream() { FILE: cli/tests/mcp/tools.test.js function parseResult (line 31) | function parseResult(result) {