Tcl language server, checker, and metadata toolkit.
Project description
tcl-ls
A Tcl language server, checker, and metadata toolkit implemented in typed Python.
Install
tcl-ls currently targets Python 3.14 or newer.
Install from PyPI with:
python3 -m pip install tcl-ls
You can also download packaged server archives and editor assets from the GitHub Releases page.
This installs three command-line entry points:
tcl-lsfor the stdio language servertcl-checkfor batch diagnosticstcl-metafor Tcl metadata-helper workflows
For local development from a checkout, sync the environment once and prefer
uv run ... for commands you do not want to install globally:
uv sync
Current Scope
This is an alpha release aimed at early adopters. The server is already useful for diagnostics, navigation, completion, rename, signature help, semantic tokens, and metadata-assisted checking, but it still analyzes Tcl conservatively and does not try to model the full dynamic runtime.
Documentation
Published docs are available at https://lewis6991.github.io/tcl-ls/.
Build the Sphinx docs locally with:
make docs
The rendered site is written to docs/_build/html/index.html and covers
getting started, editor and checker workflows, metadata authoring, support,
and development notes.
Editor-specific helpers shipped in this repository:
editors/vscodefor the VS Code extensioneditors/nvimfor the Neovim 0.11+ built-in LSP config
Maintenance
Refresh builtin subcommand metadata with:
python3 scripts/generate_builtin_commands.py
The generator updates meta/tcl8.6/tcl.meta.tcl in place and
supports --input, --output, --doc-root, --tcl-doc-series, and
--version-label for versioned metadata workflows.
Metadata
Metadata files use the *.meta.tcl suffix and meta command entries:
meta command regexp {args} {
option -start value
option -- stop
bind after-options 3..
}
The optional body is declarative analysis metadata. Current annotations are:
option, keyword, subcommand, bind, ref, script-body,
source, and package.
Diagnostics
Install the package first so the CLI entry points are available:
python3 -m pip install tcl-ls
Analyze a Tcl file or project tree with:
tcl-check path/to/project
In an interactive terminal, the checker prepares package-scoped workspaces
(directories rooted by pkgIndex.tcl), then prints final grouped diagnostics
with source context and a finished summary as each workspace is analyzed. Use
--color=always|never|auto and --context-lines=N to tune the terminal
output.
To inspect the current diagnostics emitted for tcllib, use:
make check-tcllib
Pass extra checker flags through make with:
make check-tcllib TCL_CHECK_ARGS="--context-lines=1 --fail-on-diagnostics"
Project-local config can live in tcllsrc.tcl. Supported commands are:
plugin-path .tcl-ls/sample.tcl
lib-path ../tcllib
Configured paths are resolved relative to the config file. lib-path roots are
scanned for pkgIndex.tcl files so external library trees can satisfy
package require without moving them into the project.
To build metadata inside a tool-specific Tcl shell, source the bundled helper reported by:
tcl-meta helper-path
Then, inside that tool Tcl shell, write metadata directly with:
tcl-meta build-file output.meta.tcl
For local development in this repository, use uv run ... when you want to
run the CLI without installing it first.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tcl_ls-0.2.1.tar.gz.
File metadata
- Download URL: tcl_ls-0.2.1.tar.gz
- Upload date:
- Size: 282.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66132c554254a23d2898cbe5a56d4c5c49d0252cb0b0ee2395d9735334e0d002
|
|
| MD5 |
dae2a5f059c4303e6a98d9a3ec541702
|
|
| BLAKE2b-256 |
a0140efee8b122e7d4de408b4adbc5867646987d4c7808c6ed19a613ba98f628
|
Provenance
The following attestation bundles were made for tcl_ls-0.2.1.tar.gz:
Publisher:
releases.yml on lewis6991/tcl-ls
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tcl_ls-0.2.1.tar.gz -
Subject digest:
66132c554254a23d2898cbe5a56d4c5c49d0252cb0b0ee2395d9735334e0d002 - Sigstore transparency entry: 1731536029
- Sigstore integration time:
-
Permalink:
lewis6991/tcl-ls@823169e76a0cf49cf1f43d60e49170fb964150e5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lewis6991
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
releases.yml@823169e76a0cf49cf1f43d60e49170fb964150e5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tcl_ls-0.2.1-py3-none-any.whl.
File metadata
- Download URL: tcl_ls-0.2.1-py3-none-any.whl
- Upload date:
- Size: 200.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
117f561c545dfdb0f9cd91a2ec9ece505eb0df15733dccc01c42d1d9186e819f
|
|
| MD5 |
3918287a3ded3212fbf2aaaf9de1f727
|
|
| BLAKE2b-256 |
339dea8f0c3b7cc3572e1d6f351f96dfd1a73f1987260d30020a1e73e8c14c86
|
Provenance
The following attestation bundles were made for tcl_ls-0.2.1-py3-none-any.whl:
Publisher:
releases.yml on lewis6991/tcl-ls
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tcl_ls-0.2.1-py3-none-any.whl -
Subject digest:
117f561c545dfdb0f9cd91a2ec9ece505eb0df15733dccc01c42d1d9186e819f - Sigstore transparency entry: 1731536491
- Sigstore integration time:
-
Permalink:
lewis6991/tcl-ls@823169e76a0cf49cf1f43d60e49170fb964150e5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lewis6991
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
releases.yml@823169e76a0cf49cf1f43d60e49170fb964150e5 -
Trigger Event:
push
-
Statement type: