Skip to content

Getting Started

Terminal window
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/standardbeagle/lci-cpp/main/install.sh | sh
Terminal window
# Windows (PowerShell)
irm https://raw.githubusercontent.com/standardbeagle/lci-cpp/main/install.ps1 | iex

Both detect your OS/arch, download the matching release binary, and install it (/usr/local/bin or ~/.local/bin on Unix; %LOCALAPPDATA%\Programs\lci on Windows). Override with LCI_PREFIX; pin a version with LCI_VERSION=<version>.

Terminal window
lci update # self-update to the latest release
lci update --check # report current vs latest without installing
lci update --version <version> # install a specific release

lci update works regardless of how lci was installed.

Toolchain: GCC 13+ or Clang 17+, CMake 3.25+, vcpkg, Ninja.

Terminal window
cmake --preset release \
-DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
cmake --build build/release --parallel
./build/release/src/lci --version

Install and package the build:

Terminal window
cd build/release
sudo cmake --install .
cpack -G TGZ # produces lci-<version>-Linux.tar.gz
cpack -G DEB # produces lci-<version>-Linux.deb

The CPack output contains only bin/lci. Tree-sitter grammars are statically linked. A vcpkg build, which is how releases are made, links its other libraries statically too and leaves libc, libm, libstdc++ and libgcc_s dynamic. Release binaries need glibc 2.38 or newer (Ubuntu 24.04 or equivalent). The .deb and .rpm declare their dependencies from what the built binary links.

Terminal window
cmake --build build/release --parallel
ctest --preset release --parallel $(nproc)

The preset excludes the separately gated benchmark target. Run ./build/release/tests/lci_benchmarks explicitly for performance checks.

Terminal window
lci search "myFunction"

Full CLI reference: lci --help or lci <command> --help, or see CLI Usage.

.lci.kdl accepts a top-level synonyms block that widens semantic search expansion. Children are group <words…> (treat the listed words as synonyms of each other), clear <word> (drop a word from any group), and a leading clear-all (discard the built-in table before applying the rest of the block):

synonyms {
clear-all
group "get" "fetch" "retrieve"
group "delete" "remove" "del"
clear "add"
}

An unrecognized child name is a config error. Synonym expansion only applies when search’s semantic option is on (the default) and no explicit patterns were given.

The naming analyzer allows PascalCase function components in JavaScript, TSX, Vue, and Svelte files by default. This covers the component naming used by React, Preact, Solid, Qwik, Vue, and Svelte without disabling checks for misspellings or obscure terms elsewhere in the name. Plain .ts, .mts, and .cts server files retain the normal verb-led function checks.

Replace the default extension list in .lci.kdl when a project uses PascalCase noun-named functions in other file types:

naming {
component_function_extensions ".jsx" ".tsx" ".custom"
}

Extensions are case-insensitive and must begin with a dot. Declaring the key replaces the built-in list instead of extending it.