tcl-ls 0.2.1__tar.gz

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.
Files changed (212) hide show
  1. tcl_ls-0.2.1/.github/workflows/ci.yml +42 -0
  2. tcl_ls-0.2.1/.github/workflows/pages.yml +57 -0
  3. tcl_ls-0.2.1/.github/workflows/release-assets.yml +201 -0
  4. tcl_ls-0.2.1/.github/workflows/releases.yml +114 -0
  5. tcl_ls-0.2.1/.gitignore +20 -0
  6. tcl_ls-0.2.1/.release-please-manifest.json +3 -0
  7. tcl_ls-0.2.1/AGENTS.md +17 -0
  8. tcl_ls-0.2.1/CHANGELOG.md +144 -0
  9. tcl_ls-0.2.1/LICENSE +21 -0
  10. tcl_ls-0.2.1/Makefile +108 -0
  11. tcl_ls-0.2.1/PKG-INFO +172 -0
  12. tcl_ls-0.2.1/README.md +144 -0
  13. tcl_ls-0.2.1/STATUS.md +192 -0
  14. tcl_ls-0.2.1/docs/_static/custom.css +9 -0
  15. tcl_ls-0.2.1/docs/conf.py +21 -0
  16. tcl_ls-0.2.1/docs/development.rst +91 -0
  17. tcl_ls-0.2.1/docs/getting-started.rst +108 -0
  18. tcl_ls-0.2.1/docs/index.rst +25 -0
  19. tcl_ls-0.2.1/docs/meta.rst +98 -0
  20. tcl_ls-0.2.1/docs/reference/cli.rst +64 -0
  21. tcl_ls-0.2.1/docs/reference/diagnostics.rst +138 -0
  22. tcl_ls-0.2.1/docs/reference/index.rst +13 -0
  23. tcl_ls-0.2.1/docs/reference/lsp-features.rst +62 -0
  24. tcl_ls-0.2.1/docs/reference/meta-syntax.rst +916 -0
  25. tcl_ls-0.2.1/docs/support.rst +55 -0
  26. tcl_ls-0.2.1/docs/user-guide/checker.rst +72 -0
  27. tcl_ls-0.2.1/docs/user-guide/configuration.rst +53 -0
  28. tcl_ls-0.2.1/docs/user-guide/index.rst +15 -0
  29. tcl_ls-0.2.1/docs/user-guide/language-server.rst +75 -0
  30. tcl_ls-0.2.1/docs/user-guide/neovim.md +5 -0
  31. tcl_ls-0.2.1/docs/user-guide/vscode.md +5 -0
  32. tcl_ls-0.2.1/editors/nvim/README.md +51 -0
  33. tcl_ls-0.2.1/editors/nvim/lsp/tcl-ls.lua +5 -0
  34. tcl_ls-0.2.1/editors/vscode/.npmrc +1 -0
  35. tcl_ls-0.2.1/editors/vscode/.vscodeignore +14 -0
  36. tcl_ls-0.2.1/editors/vscode/LICENSE +21 -0
  37. tcl_ls-0.2.1/editors/vscode/Makefile +59 -0
  38. tcl_ls-0.2.1/editors/vscode/README.md +101 -0
  39. tcl_ls-0.2.1/editors/vscode/language-configuration.json +55 -0
  40. tcl_ls-0.2.1/editors/vscode/package-lock.json +89 -0
  41. tcl_ls-0.2.1/editors/vscode/package.json +99 -0
  42. tcl_ls-0.2.1/editors/vscode/scripts/stage_vscode_server.py +30 -0
  43. tcl_ls-0.2.1/editors/vscode/src/command-line.js +84 -0
  44. tcl_ls-0.2.1/editors/vscode/src/extension.js +248 -0
  45. tcl_ls-0.2.1/editors/vscode/test/command-line.test.js +65 -0
  46. tcl_ls-0.2.1/meta/meta.meta.tcl +304 -0
  47. tcl_ls-0.2.1/meta/plugins/host.tcl +140 -0
  48. tcl_ls-0.2.1/meta/tcl8.6/msgcat.meta.tcl +24 -0
  49. tcl_ls-0.2.1/meta/tcl8.6/tcl.meta.tcl +1878 -0
  50. tcl_ls-0.2.1/meta/tcl8.6/tcloo.meta.tcl +74 -0
  51. tcl_ls-0.2.1/meta/tcl8.6/tcltest.meta.tcl +132 -0
  52. tcl_ls-0.2.1/meta/tcl8.6/tk.meta.tcl +114 -0
  53. tcl_ls-0.2.1/meta/tcllib/asn.meta.tcl +75 -0
  54. tcl_ls-0.2.1/meta/tcllib/clay.meta.tcl +55 -0
  55. tcl_ls-0.2.1/meta/tcllib/cmdline.meta.tcl +22 -0
  56. tcl_ls-0.2.1/meta/tcllib/doctools/text.meta.tcl +30 -0
  57. tcl_ls-0.2.1/meta/tcllib/fileutil.meta.tcl +30 -0
  58. tcl_ls-0.2.1/meta/tcllib/json/write.meta.tcl +27 -0
  59. tcl_ls-0.2.1/meta/tcllib/json.meta.tcl +9 -0
  60. tcl_ls-0.2.1/meta/tcllib/log.meta.tcl +12 -0
  61. tcl_ls-0.2.1/meta/tcllib/logger.meta.tcl +35 -0
  62. tcl_ls-0.2.1/meta/tcllib/oo/meta.meta.tcl +6 -0
  63. tcl_ls-0.2.1/meta/tcllib/struct/set.meta.tcl +56 -0
  64. tcl_ls-0.2.1/meta/tcllib/tepam.meta.tcl +7 -0
  65. tcl_ls-0.2.1/meta/tcllib/tepam.tcl +68 -0
  66. tcl_ls-0.2.1/meta/tcllib/testutilities.meta.tcl +34 -0
  67. tcl_ls-0.2.1/meta/tcllib/textutil/adjust.meta.tcl +27 -0
  68. tcl_ls-0.2.1/meta/tcllib/textutil/repeat.meta.tcl +9 -0
  69. tcl_ls-0.2.1/meta/tcllib/textutil/split.meta.tcl +9 -0
  70. tcl_ls-0.2.1/meta/tcllib/textutil/string.meta.tcl +24 -0
  71. tcl_ls-0.2.1/meta/tcllib/textutil/tabify.meta.tcl +15 -0
  72. tcl_ls-0.2.1/meta/tcllib/textutil/textutil.meta.tcl +78 -0
  73. tcl_ls-0.2.1/meta/tcllib/textutil/trim.meta.tcl +18 -0
  74. tcl_ls-0.2.1/meta/tcllib/textutil/wcswidth.meta.tcl +12 -0
  75. tcl_ls-0.2.1/pyproject.toml +96 -0
  76. tcl_ls-0.2.1/release-please-config.json +35 -0
  77. tcl_ls-0.2.1/scripts/generate_builtin_commands.py +705 -0
  78. tcl_ls-0.2.1/scripts/package_release_asset.py +62 -0
  79. tcl_ls-0.2.1/scripts/platform_target.py +57 -0
  80. tcl_ls-0.2.1/scripts/publish_release.py +85 -0
  81. tcl_ls-0.2.1/scripts/release_version.py +132 -0
  82. tcl_ls-0.2.1/scripts/smoke_pyinstaller_lsp.py +267 -0
  83. tcl_ls-0.2.1/skills/commit-messages/SKILL.md +34 -0
  84. tcl_ls-0.2.1/skills/commit-messages/scripts/check_commit_message.py +124 -0
  85. tcl_ls-0.2.1/src/tcl_lsp/__init__.py +7 -0
  86. tcl_ls-0.2.1/src/tcl_lsp/__main__.py +11 -0
  87. tcl_ls-0.2.1/src/tcl_lsp/analysis/__init__.py +49 -0
  88. tcl_ls-0.2.1/src/tcl_lsp/analysis/arity.py +158 -0
  89. tcl_ls-0.2.1/src/tcl_lsp/analysis/builtins.py +484 -0
  90. tcl_ls-0.2.1/src/tcl_lsp/analysis/control_flow.py +207 -0
  91. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/__init__.py +57 -0
  92. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/ambiguous_command.py +25 -0
  93. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/ambiguous_variable.py +27 -0
  94. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/base.py +74 -0
  95. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/duplicate_proc.py +24 -0
  96. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/helpers.py +267 -0
  97. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/invalid_arguments.py +51 -0
  98. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/invalid_regex.py +151 -0
  99. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/missing_option_value.py +29 -0
  100. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/unknown_option.py +29 -0
  101. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/unknown_subcommand.py +28 -0
  102. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/unreachable_code.py +350 -0
  103. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/unresolved_command.py +25 -0
  104. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/unresolved_package.py +27 -0
  105. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/unresolved_variable.py +27 -0
  106. tcl_ls-0.2.1/src/tcl_lsp/analysis/diagnostics/wrong_argument_count.py +90 -0
  107. tcl_ls-0.2.1/src/tcl_lsp/analysis/embedded_languages.py +528 -0
  108. tcl_ls-0.2.1/src/tcl_lsp/analysis/facts/__init__.py +3 -0
  109. tcl_ls-0.2.1/src/tcl_lsp/analysis/facts/collector.py +3143 -0
  110. tcl_ls-0.2.1/src/tcl_lsp/analysis/facts/lowering.py +1394 -0
  111. tcl_ls-0.2.1/src/tcl_lsp/analysis/facts/parsing.py +302 -0
  112. tcl_ls-0.2.1/src/tcl_lsp/analysis/facts/utils.py +300 -0
  113. tcl_ls-0.2.1/src/tcl_lsp/analysis/flow/__init__.py +25 -0
  114. tcl_ls-0.2.1/src/tcl_lsp/analysis/flow/exprs.py +388 -0
  115. tcl_ls-0.2.1/src/tcl_lsp/analysis/flow/variables.py +561 -0
  116. tcl_ls-0.2.1/src/tcl_lsp/analysis/index.py +361 -0
  117. tcl_ls-0.2.1/src/tcl_lsp/analysis/metadata_commands.py +1698 -0
  118. tcl_ls-0.2.1/src/tcl_lsp/analysis/metadata_effects.py +296 -0
  119. tcl_ls-0.2.1/src/tcl_lsp/analysis/model.py +264 -0
  120. tcl_ls-0.2.1/src/tcl_lsp/analysis/resolver.py +1196 -0
  121. tcl_ls-0.2.1/src/tcl_lsp/analysis/signature_matching.py +287 -0
  122. tcl_ls-0.2.1/src/tcl_lsp/cache.py +42 -0
  123. tcl_ls-0.2.1/src/tcl_lsp/checker/__init__.py +10 -0
  124. tcl_ls-0.2.1/src/tcl_lsp/checker/cli.py +116 -0
  125. tcl_ls-0.2.1/src/tcl_lsp/checker/model.py +31 -0
  126. tcl_ls-0.2.1/src/tcl_lsp/checker/reporting.py +425 -0
  127. tcl_ls-0.2.1/src/tcl_lsp/checker/service.py +555 -0
  128. tcl_ls-0.2.1/src/tcl_lsp/common.py +111 -0
  129. tcl_ls-0.2.1/src/tcl_lsp/lsp/__init__.py +3 -0
  130. tcl_ls-0.2.1/src/tcl_lsp/lsp/document_changes.py +138 -0
  131. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/__init__.py +1 -0
  132. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/completion.py +941 -0
  133. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/cursor_context.py +217 -0
  134. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/document_links.py +81 -0
  135. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/folding.py +107 -0
  136. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/highlights.py +76 -0
  137. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/hover.py +27 -0
  138. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/navigation.py +310 -0
  139. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/rename.py +348 -0
  140. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/signature_help.py +199 -0
  141. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/symbols.py +124 -0
  142. tcl_ls-0.2.1/src/tcl_lsp/lsp/features/workspace_symbols.py +125 -0
  143. tcl_ls-0.2.1/src/tcl_lsp/lsp/semantic_tokens.py +407 -0
  144. tcl_ls-0.2.1/src/tcl_lsp/lsp/server.py +1255 -0
  145. tcl_ls-0.2.1/src/tcl_lsp/lsp/state.py +57 -0
  146. tcl_ls-0.2.1/src/tcl_lsp/lsp/workspace_rebuild.py +576 -0
  147. tcl_ls-0.2.1/src/tcl_lsp/meta/__init__.py +63 -0
  148. tcl_ls-0.2.1/src/tcl_lsp/meta_tools.py +5 -0
  149. tcl_ls-0.2.1/src/tcl_lsp/metadata_paths.py +122 -0
  150. tcl_ls-0.2.1/src/tcl_lsp/parser/__init__.py +30 -0
  151. tcl_ls-0.2.1/src/tcl_lsp/parser/expr.py +452 -0
  152. tcl_ls-0.2.1/src/tcl_lsp/parser/helpers.py +103 -0
  153. tcl_ls-0.2.1/src/tcl_lsp/parser/model.py +87 -0
  154. tcl_ls-0.2.1/src/tcl_lsp/parser/parser.py +758 -0
  155. tcl_ls-0.2.1/src/tcl_lsp/plugins/__init__.py +1 -0
  156. tcl_ls-0.2.1/src/tcl_lsp/plugins/host.py +681 -0
  157. tcl_ls-0.2.1/src/tcl_lsp/project/__init__.py +1 -0
  158. tcl_ls-0.2.1/src/tcl_lsp/project/config.py +100 -0
  159. tcl_ls-0.2.1/src/tcl_lsp/project/indexing.py +275 -0
  160. tcl_ls-0.2.1/src/tcl_lsp/project/paths.py +66 -0
  161. tcl_ls-0.2.1/src/tcl_lsp/project_config.py +17 -0
  162. tcl_ls-0.2.1/src/tcl_lsp/tools/tcl_meta.tcl +353 -0
  163. tcl_ls-0.2.1/src/tcl_lsp/workspace.py +15 -0
  164. tcl_ls-0.2.1/tcl-ls.spec +66 -0
  165. tcl_ls-0.2.1/tests/__init__.py +1 -0
  166. tcl_ls-0.2.1/tests/analysis/__init__.py +1 -0
  167. tcl_ls-0.2.1/tests/analysis/diagnostics/__init__.py +1 -0
  168. tcl_ls-0.2.1/tests/analysis/diagnostics/test_ambiguous_command.py +32 -0
  169. tcl_ls-0.2.1/tests/analysis/diagnostics/test_ambiguous_variable.py +34 -0
  170. tcl_ls-0.2.1/tests/analysis/diagnostics/test_contextual_command_diagnostics.py +867 -0
  171. tcl_ls-0.2.1/tests/analysis/diagnostics/test_duplicate_proc.py +19 -0
  172. tcl_ls-0.2.1/tests/analysis/diagnostics/test_invalid_regex.py +39 -0
  173. tcl_ls-0.2.1/tests/analysis/diagnostics/test_malformed_if.py +44 -0
  174. tcl_ls-0.2.1/tests/analysis/diagnostics/test_malformed_switch.py +44 -0
  175. tcl_ls-0.2.1/tests/analysis/diagnostics/test_missing_option_value.py +20 -0
  176. tcl_ls-0.2.1/tests/analysis/diagnostics/test_unknown_option.py +46 -0
  177. tcl_ls-0.2.1/tests/analysis/diagnostics/test_unknown_subcommand.py +77 -0
  178. tcl_ls-0.2.1/tests/analysis/diagnostics/test_unreachable_code.py +115 -0
  179. tcl_ls-0.2.1/tests/analysis/diagnostics/test_unresolved_command.py +27 -0
  180. tcl_ls-0.2.1/tests/analysis/diagnostics/test_unresolved_package.py +27 -0
  181. tcl_ls-0.2.1/tests/analysis/diagnostics/test_unresolved_variable.py +43 -0
  182. tcl_ls-0.2.1/tests/analysis/diagnostics/test_wrong_argument_count.py +83 -0
  183. tcl_ls-0.2.1/tests/analysis/flow/test_variables.py +308 -0
  184. tcl_ls-0.2.1/tests/analysis/support.py +76 -0
  185. tcl_ls-0.2.1/tests/analysis/test_builtins_and_packages.py +819 -0
  186. tcl_ls-0.2.1/tests/analysis/test_control_flow.py +746 -0
  187. tcl_ls-0.2.1/tests/analysis/test_metadata_commands.py +887 -0
  188. tcl_ls-0.2.1/tests/analysis/test_metadata_overrides.py +309 -0
  189. tcl_ls-0.2.1/tests/analysis/test_resolution.py +762 -0
  190. tcl_ls-0.2.1/tests/analysis/test_tcl_plugins.py +304 -0
  191. tcl_ls-0.2.1/tests/conftest.py +40 -0
  192. tcl_ls-0.2.1/tests/lsp/__init__.py +1 -0
  193. tcl_ls-0.2.1/tests/lsp/helpers.py +352 -0
  194. tcl_ls-0.2.1/tests/lsp/test_conversion.py +175 -0
  195. tcl_ls-0.2.1/tests/lsp/test_document_changes.py +42 -0
  196. tcl_ls-0.2.1/tests/lsp/test_semantic_tokens.py +528 -0
  197. tcl_ls-0.2.1/tests/lsp/test_server_features.py +622 -0
  198. tcl_ls-0.2.1/tests/lsp/test_server_protocol.py +597 -0
  199. tcl_ls-0.2.1/tests/lsp/test_service_features.py +580 -0
  200. tcl_ls-0.2.1/tests/lsp/test_workspace_loading.py +861 -0
  201. tcl_ls-0.2.1/tests/lsp_service.py +75 -0
  202. tcl_ls-0.2.1/tests/lsp_support.py +63 -0
  203. tcl_ls-0.2.1/tests/parser/test_parser.py +173 -0
  204. tcl_ls-0.2.1/tests/parser/test_tcllib_corpus.py +70 -0
  205. tcl_ls-0.2.1/tests/project_support.py +176 -0
  206. tcl_ls-0.2.1/tests/test_check.py +695 -0
  207. tcl_ls-0.2.1/tests/test_generate_builtin_commands.py +75 -0
  208. tcl_ls-0.2.1/tests/test_main.py +25 -0
  209. tcl_ls-0.2.1/tests/test_meta_tools.py +149 -0
  210. tcl_ls-0.2.1/tests/test_publish_release.py +242 -0
  211. tcl_ls-0.2.1/tests/test_release_version.py +111 -0
  212. tcl_ls-0.2.1/uv.lock +696 -0
@@ -0,0 +1,42 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+ workflow_dispatch:
9
+
10
+ concurrency:
11
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ commit_lint:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ # Check commit messages
22
+ - uses: webiny/action-conventional-commits@v1.3.0
23
+
24
+ test:
25
+ runs-on: ubuntu-latest
26
+ timeout-minutes: 10
27
+
28
+ steps:
29
+ - uses: actions/checkout@v6
30
+
31
+ - uses: actions/setup-python@v6
32
+ with:
33
+ python-version: '3.14'
34
+
35
+ - name: Install uv
36
+ run: python -m pip install uv
37
+
38
+ - name: Download tcllib
39
+ run: make tcllib
40
+
41
+ - name: Run test suite
42
+ run: make test
@@ -0,0 +1,57 @@
1
+ name: Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: github-pages
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ build:
17
+ runs-on: ubuntu-latest
18
+
19
+ steps:
20
+ - uses: actions/checkout@v6
21
+
22
+ - uses: actions/setup-python@v6
23
+ with:
24
+ python-version: '3.14'
25
+
26
+ - name: Install uv
27
+ run: python -m pip install uv
28
+
29
+ - name: Configure GitHub Pages
30
+ uses: actions/configure-pages@v5
31
+
32
+ - name: Build docs
33
+ run: make docs
34
+
35
+ - name: Prevent Jekyll processing
36
+ run: touch docs/_build/html/.nojekyll
37
+
38
+ - name: Upload GitHub Pages artifact
39
+ uses: actions/upload-pages-artifact@v4
40
+ with:
41
+ path: docs/_build/html
42
+
43
+ deploy:
44
+ environment:
45
+ name: github-pages
46
+ url: ${{ steps.deployment.outputs.page_url }}
47
+ permissions:
48
+ contents: read
49
+ pages: write
50
+ id-token: write
51
+ runs-on: ubuntu-latest
52
+ needs: build
53
+
54
+ steps:
55
+ - name: Deploy to GitHub Pages
56
+ id: deployment
57
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,201 @@
1
+ name: Release Assets
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ release_version:
7
+ description: Version or label to use in built artifact names.
8
+ required: true
9
+ type: string
10
+ release_channel:
11
+ description: Release channel for packaging and GitHub release handling.
12
+ required: true
13
+ type: string
14
+ release_tag:
15
+ description: Git tag to publish assets against.
16
+ required: true
17
+ type: string
18
+ checkout_ref:
19
+ description: Git ref to build from.
20
+ required: true
21
+ type: string
22
+ create_release:
23
+ description: Create or update the GitHub release before uploading assets.
24
+ required: false
25
+ default: false
26
+ type: boolean
27
+ secrets:
28
+ VSCE_PAT:
29
+ required: false
30
+
31
+ jobs:
32
+ build_assets:
33
+ name: Build assets (${{ matrix.release_platform }})
34
+ runs-on: ${{ matrix.runner }}
35
+ defaults:
36
+ run:
37
+ shell: bash
38
+
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ include:
43
+ - runner: ubuntu-latest
44
+ release_platform: linux-x64
45
+ archive_extension: tar.gz
46
+ executable_name: tcl-ls
47
+ vscode_target: linux-x64
48
+ - runner: macos-14
49
+ release_platform: macos-arm64
50
+ archive_extension: tar.gz
51
+ executable_name: tcl-ls
52
+ vscode_target: darwin-arm64
53
+ - runner: windows-latest
54
+ release_platform: windows-x64
55
+ archive_extension: zip
56
+ executable_name: tcl-ls.exe
57
+ vscode_target: win32-x64
58
+
59
+ steps:
60
+ - uses: actions/checkout@v6
61
+ with:
62
+ ref: ${{ inputs.checkout_ref }}
63
+
64
+ - uses: actions/setup-python@v6
65
+ with:
66
+ python-version: '3.14'
67
+
68
+ - name: Install uv
69
+ run: python -m pip install uv
70
+
71
+ - uses: actions/setup-node@v4
72
+ with:
73
+ node-version: '22'
74
+ cache: npm
75
+ cache-dependency-path: editors/vscode/package-lock.json
76
+
77
+ - name: Install project dependencies
78
+ run: uv sync
79
+
80
+ - name: Install extension dependencies
81
+ working-directory: editors/vscode
82
+ run: npm ci
83
+
84
+ - name: Validate extension entrypoint
85
+ working-directory: editors/vscode
86
+ run: npm run check
87
+
88
+ - name: Build tcl-ls
89
+ env:
90
+ PYINSTALLER_CONFIG_DIR: ${{ runner.temp }}/pyinstaller
91
+ run: |
92
+ uv run pyinstaller \
93
+ --noconfirm \
94
+ --clean \
95
+ --distpath build/release \
96
+ --workpath build/pyinstaller \
97
+ tcl-ls.spec
98
+
99
+ - name: Smoke test frozen tcl-ls
100
+ run: |
101
+ uv run python scripts/smoke_pyinstaller_lsp.py \
102
+ "build/release/tcl-ls/${{ matrix.executable_name }}"
103
+
104
+ - name: Archive server build
105
+ run: |
106
+ archive_name="tcl-ls-${{ inputs.release_version }}-${{ matrix.release_platform }}"
107
+
108
+ python scripts/package_release_asset.py \
109
+ --source build/release/tcl-ls \
110
+ --output "dist/${archive_name}.${{ matrix.archive_extension }}" \
111
+ --root-name "$archive_name" \
112
+ --include LICENSE \
113
+ --include README.md
114
+
115
+ - name: Stage bundled server for VS Code
116
+ run: |
117
+ python editors/vscode/scripts/stage_vscode_server.py \
118
+ --source build/release/tcl-ls \
119
+ --destination editors/vscode/server
120
+
121
+ - name: Build VS Code extension
122
+ working-directory: editors/vscode
123
+ env:
124
+ RELEASE_CHANNEL: ${{ inputs.release_channel }}
125
+ run: |
126
+ vsix_path="$GITHUB_WORKSPACE/dist/tcl-ls-vscode-${{ inputs.release_version }}@${{ matrix.vscode_target }}.vsix"
127
+ package_args=(--target "${{ matrix.vscode_target }}" -o "$vsix_path")
128
+
129
+ if [ "$RELEASE_CHANNEL" != "stable" ]; then
130
+ package_args+=(--pre-release)
131
+ fi
132
+
133
+ npm exec --package @vscode/vsce -- vsce package "${package_args[@]}"
134
+
135
+ - name: Upload build artifacts
136
+ uses: actions/upload-artifact@v4
137
+ with:
138
+ name: release-assets-${{ matrix.release_platform }}
139
+ path: dist/*
140
+
141
+ publish:
142
+ name: Publish artifacts
143
+ needs: build_assets
144
+ runs-on: ubuntu-latest
145
+ defaults:
146
+ run:
147
+ shell: bash
148
+ permissions:
149
+ contents: write
150
+ env:
151
+ VSCE_PAT: ${{ secrets.VSCE_PAT }}
152
+
153
+ steps:
154
+ - uses: actions/checkout@v6
155
+ with:
156
+ ref: ${{ inputs.checkout_ref }}
157
+
158
+ - uses: actions/setup-python@v6
159
+ with:
160
+ python-version: '3.14'
161
+
162
+ - uses: actions/download-artifact@v4
163
+ with:
164
+ path: ${{ runner.temp }}/release-assets
165
+
166
+ - name: Create or update GitHub release
167
+ env:
168
+ GH_TOKEN: ${{ github.token }}
169
+ run: |
170
+ publish_args=(
171
+ --assets-dir "${{ runner.temp }}/release-assets"
172
+ --release-channel "${{ inputs.release_channel }}"
173
+ --release-tag "${{ inputs.release_tag }}"
174
+ --release-version "${{ inputs.release_version }}"
175
+ )
176
+
177
+ if [ "${{ inputs.create_release }}" = "true" ]; then
178
+ publish_args+=(--create-release)
179
+ fi
180
+
181
+ python scripts/publish_release.py "${publish_args[@]}"
182
+
183
+ # Temporarily disabled until the release workflow is validated end to end.
184
+ # - uses: actions/setup-node@v4
185
+ # if: env.VSCE_PAT != ''
186
+ # with:
187
+ # node-version: '22'
188
+ #
189
+ # - name: Publish VS Code extension to Visual Studio Marketplace
190
+ # if: env.VSCE_PAT != ''
191
+ # env:
192
+ # RELEASE_CHANNEL: ${{ inputs.release_channel }}
193
+ # run: |
194
+ # mapfile -t vsix_files < <(find "$RUNNER_TEMP/release-assets" -type f -name '*.vsix' | sort)
195
+ # publish_args=(--skip-duplicate -p "$VSCE_PAT" --packagePath "${vsix_files[@]}")
196
+ #
197
+ # if [ "$RELEASE_CHANNEL" != "stable" ]; then
198
+ # publish_args+=(--pre-release)
199
+ # fi
200
+ #
201
+ # npm exec --package @vscode/vsce -- vsce publish "${publish_args[@]}"
@@ -0,0 +1,114 @@
1
+ name: Releases
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ workflow_dispatch:
8
+ inputs:
9
+ target:
10
+ description: Release automation to run.
11
+ required: true
12
+ type: choice
13
+ default: nightly
14
+ options:
15
+ - nightly
16
+ - stable
17
+ - both
18
+
19
+ concurrency:
20
+ group: releases-${{ github.ref }}
21
+ cancel-in-progress: true
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ jobs:
27
+ release_please:
28
+ name: Release Please
29
+ if: >-
30
+ ${{
31
+ github.event_name != 'workflow_dispatch' ||
32
+ github.event.inputs.target == 'stable' ||
33
+ github.event.inputs.target == 'both'
34
+ }}
35
+ runs-on: ubuntu-latest
36
+ permissions:
37
+ contents: write
38
+ issues: write
39
+ pull-requests: write
40
+ outputs:
41
+ release_created: ${{ steps.release.outputs.release_created }}
42
+ tag_name: ${{ steps.release.outputs.tag_name }}
43
+ version: ${{ steps.release.outputs.version }}
44
+ steps:
45
+ - uses: googleapis/release-please-action@v4
46
+ id: release
47
+ with:
48
+ token: ${{ secrets.RELEASE_PLEASE_TOKEN || github.token }}
49
+ config-file: release-please-config.json
50
+ manifest-file: .release-please-manifest.json
51
+
52
+ publish_stable:
53
+ name: Publish stable assets
54
+ needs: release_please
55
+ if: ${{ needs.release_please.outputs.release_created == 'true' }}
56
+ permissions:
57
+ contents: write
58
+ uses: ./.github/workflows/release-assets.yml
59
+ with:
60
+ release_version: ${{ needs.release_please.outputs.version }}
61
+ release_channel: stable
62
+ release_tag: ${{ needs.release_please.outputs.tag_name }}
63
+ checkout_ref: ${{ needs.release_please.outputs.tag_name }}
64
+ secrets:
65
+ VSCE_PAT: ${{ secrets.VSCE_PAT }}
66
+
67
+ publish_pypi:
68
+ name: Publish to PyPI
69
+ needs:
70
+ - release_please
71
+ - publish_stable
72
+ if: ${{ needs.release_please.outputs.release_created == 'true' }}
73
+ runs-on: ubuntu-latest
74
+ environment: pypi
75
+ permissions:
76
+ contents: read
77
+ id-token: write
78
+ steps:
79
+ - uses: actions/checkout@v6
80
+ with:
81
+ ref: ${{ needs.release_please.outputs.tag_name }}
82
+
83
+ - uses: actions/setup-python@v6
84
+ with:
85
+ python-version: '3.14'
86
+
87
+ - name: Install uv
88
+ run: python -m pip install uv
89
+
90
+ - name: Build distribution artifacts
91
+ run: make build
92
+
93
+ - name: Publish package distributions to PyPI
94
+ uses: pypa/gh-action-pypi-publish@release/v1
95
+
96
+ publish_nightly:
97
+ name: Publish nightly assets
98
+ if: >-
99
+ ${{
100
+ github.event_name != 'workflow_dispatch' ||
101
+ github.event.inputs.target == 'nightly' ||
102
+ github.event.inputs.target == 'both'
103
+ }}
104
+ permissions:
105
+ contents: write
106
+ uses: ./.github/workflows/release-assets.yml
107
+ with:
108
+ release_version: nightly
109
+ release_channel: nightly
110
+ release_tag: nightly
111
+ checkout_ref: ${{ github.sha }}
112
+ create_release: true
113
+ secrets:
114
+ VSCE_PAT: ${{ secrets.VSCE_PAT }}
@@ -0,0 +1,20 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+
4
+ .venv/
5
+ .cache/
6
+
7
+ .pytest_cache/
8
+ .ruff_cache/
9
+ .coverage
10
+ .coverage.*
11
+ htmlcov/
12
+
13
+ build/
14
+ dist/
15
+ *.egg-info/
16
+ docs/_build/
17
+
18
+ editors/vscode/node_modules/
19
+ editors/vscode/server/
20
+ editors/vscode/*.vsix
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.2.1"
3
+ }
tcl_ls-0.2.1/AGENTS.md ADDED
@@ -0,0 +1,17 @@
1
+ # AGENTS.md
2
+
3
+ ## Tips
4
+
5
+ - Use `uv` for running python and tooling.
6
+ - Before committing, run `make check`.
7
+
8
+ ## Skills
9
+
10
+ Repo-local skills live under `skills/`.
11
+
12
+ Available skills:
13
+ - `commit-messages`: use for creating, amending, or rewording git
14
+ commit messages. File: `skills/commit-messages/SKILL.md`
15
+
16
+ If a task clearly matches a listed skill, read its `SKILL.md` and use
17
+ it for that turn.
@@ -0,0 +1,144 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## Unreleased
6
+
7
+ ## [0.2.1](https://github.com/lewis6991/tcl-ls/compare/v0.2.0...v0.2.1) (2026-06-05)
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * **release:** enable PyPI publishing ([f989881](https://github.com/lewis6991/tcl-ls/commit/f989881225fe256d0e7fd2499ff1dad9d1a97e3a))
13
+
14
+ ## [0.2.0](https://github.com/lewis6991/tcl-ls/compare/v0.1.0...v0.2.0) (2026-04-27)
15
+
16
+
17
+ ### Features
18
+
19
+ * add builtin command metadata ([b1c0e4f](https://github.com/lewis6991/tcl-ls/commit/b1c0e4f4923c09ade10834f84c3fbd1b1bff481b))
20
+ * add packaged releases and editor clients ([5b30540](https://github.com/lewis6991/tcl-ls/commit/5b3054051e670d433224950ee26966ddb32694d8))
21
+ * **analysis:** add ambiguous variable diagnostic ([f05b94d](https://github.com/lewis6991/tcl-ls/commit/f05b94d5bcf43c259efb2ca8fd05c85ffd2adf4a))
22
+ * **analysis:** add arity diagnostics ([8fdde56](https://github.com/lewis6991/tcl-ls/commit/8fdde568609b99ee260016ab74b552b06368086a))
23
+ * **analysis:** add option diagnostics ([40af39c](https://github.com/lewis6991/tcl-ls/commit/40af39c9c0795bbf274a5e6f16c8183fa8071cf2))
24
+ * **analysis:** add Tcl metadata plugins ([cbceb7c](https://github.com/lewis6991/tcl-ls/commit/cbceb7c93318b099de9500e85f212e815d44e4c5))
25
+ * **analysis:** add Tcllib builtin metadata ([746e6a5](https://github.com/lewis6991/tcl-ls/commit/746e6a508d5d0ebc8310422140db8e1e3e3ab887))
26
+ * **analysis:** apply package metadata bindings ([1db88cd](https://github.com/lewis6991/tcl-ls/commit/1db88cdc36afb06b20dd14d51696b5b5c1c92448))
27
+ * **analysis:** detect unreachable code ([017af66](https://github.com/lewis6991/tcl-ls/commit/017af66f5ec108b4f485b2dbd06bee63de5cce20))
28
+ * **analysis:** load Tk and tcltest metadata ([09a47b1](https://github.com/lewis6991/tcl-ls/commit/09a47b16e0094f5e479b6bff612b64d33db8350f))
29
+ * **analysis:** model builtin variable flows ([0552208](https://github.com/lewis6991/tcl-ls/commit/0552208650e7e84d415c26733a4051c027afb37d))
30
+ * **analysis:** resolve if condition refs ([d7ee00f](https://github.com/lewis6991/tcl-ls/commit/d7ee00fa2e6f3d487efe9d9e9dfb29cb49ea003b))
31
+ * **analysis:** support catch builtin ([85b9d58](https://github.com/lewis6991/tcl-ls/commit/85b9d580b64c80949de77fde31b63b796750c68d))
32
+ * **analysis:** track variable value flow ([37bdb07](https://github.com/lewis6991/tcl-ls/commit/37bdb07e810515fd1526712fa1997e1097e146b1))
33
+ * **analysis:** validate if and switch forms ([d2e30ae](https://github.com/lewis6991/tcl-ls/commit/d2e30aed1426d6c176773af63a5052e4f22de7d6))
34
+ * **check:** validate regex patterns ([ff95cad](https://github.com/lewis6991/tcl-ls/commit/ff95cad791473d67b7678b393eebd3dbe9fe2209))
35
+ * **cli:** add tcl-check diagnostics runner ([6cde5c9](https://github.com/lewis6991/tcl-ls/commit/6cde5c9b878996d3a501b62127e6cf4f45a677d6))
36
+ * **diagnostics:** check builtin subcommands ([c18a011](https://github.com/lewis6991/tcl-ls/commit/c18a011742b32177b427dfe68e64a2e049e13823))
37
+ * expand builtin subcommand support ([4e4fb17](https://github.com/lewis6991/tcl-ls/commit/4e4fb17bb2a7e8b032d5eb5f3462e03d273b9c5c))
38
+ * **hover:** enrich proc hovers ([466fe0b](https://github.com/lewis6991/tcl-ls/commit/466fe0b42ed72433423c235bd96115916727b8d4))
39
+ * **hover:** trace imported command origins ([dfce720](https://github.com/lewis6991/tcl-ls/commit/dfce720aedb2d6ec0ea3b93e12a5872e7a70d998))
40
+ * infer packages from pkgIndex ([e66b49c](https://github.com/lewis6991/tcl-ls/commit/e66b49c6331231c7e44cd15862cb0c4847d5d078))
41
+ * load static source dependencies ([d129baf](https://github.com/lewis6991/tcl-ls/commit/d129bafcb2c20e9f1ed2bdf211e93753a83ae0c0))
42
+ * **lsp:** add editor assistance features ([46865a1](https://github.com/lewis6991/tcl-ls/commit/46865a1de156b10abc52450849bf8aaf8f72b117))
43
+ * **lsp:** add more editor methods ([7a2f219](https://github.com/lewis6991/tcl-ls/commit/7a2f21935212e11e6edeb437212c354354152a17))
44
+ * **lsp:** add rename support ([e198943](https://github.com/lewis6991/tcl-ls/commit/e1989432025bb5bffbd153945b2ffe56f3138255))
45
+ * **lsp:** add semantic token deltas ([8ddfc56](https://github.com/lewis6991/tcl-ls/commit/8ddfc56b52e9392fa7b277e6336409bdceea0873))
46
+ * **lsp:** add semantic tokens ([84d2861](https://github.com/lewis6991/tcl-ls/commit/84d28619763b7b64fd7c274e9eea7bbc304cc500))
47
+ * **lsp:** define namespace imports ([e4c064c](https://github.com/lewis6991/tcl-ls/commit/e4c064c62f76e49fe0b812b30599972a3677a8c9))
48
+ * **lsp:** define package require names ([589427a](https://github.com/lewis6991/tcl-ls/commit/589427ae4bb2fef2ceec252139275f58c9106a51))
49
+ * **lsp:** expand completion coverage ([67158d0](https://github.com/lewis6991/tcl-ls/commit/67158d0630600314348a0a4eeab6da3f886f82d2))
50
+ * **lsp:** highlight return keyword ([82df2b6](https://github.com/lewis6991/tcl-ls/commit/82df2b610198ba607557b70ec88312a1175da53d))
51
+ * **lsp:** highlight semicolon separators ([03ea575](https://github.com/lewis6991/tcl-ls/commit/03ea575ab82276e61069b7c521cb2992c12f6a2a))
52
+ * **lsp:** log startup and indexing ([1cac708](https://github.com/lewis6991/tcl-ls/commit/1cac708f57d19783db3b79b2fa62b85d950e8463))
53
+ * **lsp:** report indexing progress ([6d3a0fd](https://github.com/lewis6991/tcl-ls/commit/6d3a0fd6705110170759374147943d7e7dfe6051))
54
+ * **meta:** analyze dict for bodies ([ce717cd](https://github.com/lewis6991/tcl-ls/commit/ce717cd19b8eacb05fa2424af916ffca9af6a93c))
55
+ * **metadata:** add clay definition context ([dd1084a](https://github.com/lewis6991/tcl-ls/commit/dd1084a35dcdd29e112097550b081491240eb7b8))
56
+ * **metadata:** add command value enums ([2e668c1](https://github.com/lewis6991/tcl-ls/commit/2e668c148437fd918e14b2cafc9f772d859b8ddb))
57
+ * **metadata:** redesign metadata DSL ([5acea60](https://github.com/lewis6991/tcl-ls/commit/5acea6014084777b79232507e4f75b9bee1cf082))
58
+ * **metadata:** reuse dynamic plugin clauses ([8c25d08](https://github.com/lewis6991/tcl-ls/commit/8c25d082c7954c3ec639b7ca3ffd6482d00e7f74))
59
+ * **metadata:** support project plugin bundles ([6b369ca](https://github.com/lewis6991/tcl-ls/commit/6b369ca8d8b2a9256d50713cfdea1e96e2870925))
60
+ * **meta:** describe exec options ([0ac82cd](https://github.com/lewis6991/tcl-ls/commit/0ac82cdf9e9d7260050093bff3844e4be1b99369))
61
+ * **parser:** add tcllib corpus coverage ([1759dec](https://github.com/lewis6991/tcl-ls/commit/1759decfa46e838a16266d757a4a62bceff940c8))
62
+ * **parser:** support argument expansion ([d4a65f6](https://github.com/lewis6991/tcl-ls/commit/d4a65f664afb487103cdf1cacdc982924ff4d3c1))
63
+ * **project:** support external Tcl libs ([e28dca2](https://github.com/lewis6991/tcl-ls/commit/e28dca2344ec20db72f7c69649d3c372a5bee4eb))
64
+ * **tcl-meta:** derive proc signatures ([8694cdf](https://github.com/lewis6991/tcl-ls/commit/8694cdfae689ff9f6f7c0223cc0af2c4a10b58a9))
65
+
66
+
67
+ ### Bug Fixes
68
+
69
+ * add more tcllib command metadata ([45a75c4](https://github.com/lewis6991/tcl-ls/commit/45a75c4e31e8d1b04f5ddddae613cac43a6f2fd0))
70
+ * **analysis:** analyze switch branch bodies ([ef9dd45](https://github.com/lewis6991/tcl-ls/commit/ef9dd4535bd7e0d5f9ec7bbe3c445f7fe923160f))
71
+ * **analysis:** drop return option diagnostics ([1fea62e](https://github.com/lewis6991/tcl-ls/commit/1fea62eb0efd363b5e54e393a145b28dca251d81))
72
+ * **analysis:** handle expanded command args ([ff6f804](https://github.com/lewis6991/tcl-ls/commit/ff6f80478b3924dd30ac62d982965cda3566d23a))
73
+ * **analysis:** infer switch value domains ([2863a39](https://github.com/lewis6991/tcl-ls/commit/2863a395422a3091e2db864e98be5d1f54d5d342))
74
+ * **analysis:** prefer proc implementations ([2889fcd](https://github.com/lewis6991/tcl-ls/commit/2889fcd3de8a100c76bfa88bfe08ff9654ebd00c))
75
+ * **analysis:** preserve braced script offsets ([b8cb935](https://github.com/lewis6991/tcl-ls/commit/b8cb935d22ace37ef1fe0164d21e2dd551d23386))
76
+ * **analysis:** preserve switch branch positions ([67cbf01](https://github.com/lewis6991/tcl-ls/commit/67cbf01a08c08e3dce602cd262797da786cc997e))
77
+ * **analysis:** resolve dynamic array bindings ([923f7f9](https://github.com/lewis6991/tcl-ls/commit/923f7f9598817743608e00f9a49603a17a4b713e))
78
+ * **analysis:** support try handlers ([420e024](https://github.com/lewis6991/tcl-ls/commit/420e024c5885871a1c4528ed08e1e194a8177abb))
79
+ * **analysis:** track Tcl imports and aliases ([5d7684e](https://github.com/lewis6991/tcl-ls/commit/5d7684e0e009657d1eb28087f4009be9ac76b345))
80
+ * **builtins:** override bundled metadata ([a6f0762](https://github.com/lewis6991/tcl-ls/commit/a6f076277cdb76a771f46230ffd84342f05862cd))
81
+ * **check:** use helper effect metadata ([8e45ac8](https://github.com/lewis6991/tcl-ls/commit/8e45ac8943a50da027aa9906ce172180cc4f9503))
82
+ * **ci:** preserve release artifacts on publish ([4124a7f](https://github.com/lewis6991/tcl-ls/commit/4124a7f3730203a5070dcde1c576da941fa262b4))
83
+ * **ci:** roll prerelease into nightly ([c31a76f](https://github.com/lewis6991/tcl-ls/commit/c31a76fc0b656e715ac08ad877e69265ccc0613d))
84
+ * **hover:** omit Tcl builtin import notes ([7238456](https://github.com/lewis6991/tcl-ls/commit/723845645401040145fe5593fab2b33c08af0866))
85
+ * **lsp:** coalesce stale document changes ([006957e](https://github.com/lewis6991/tcl-ls/commit/006957ecca65bb6374cb140e99fd19451c8442a7))
86
+ * **lsp:** complete absolute command prefixes ([2708c1f](https://github.com/lewis6991/tcl-ls/commit/2708c1ffac25a37d6b529bf982168036f1d408e0))
87
+ * **lsp:** scope analysis to document deps ([521d8ca](https://github.com/lewis6991/tcl-ls/commit/521d8ca40b31c79e08c6318eaceb72a229a0f111))
88
+ * **lsp:** show startup notifications ([2d70a89](https://github.com/lewis6991/tcl-ls/commit/2d70a896b30bfe246090b028d07cc64cc9eabfed))
89
+ * **lsp:** streamline workspace loading ([f9e564b](https://github.com/lewis6991/tcl-ls/commit/f9e564b3c59e76bbe0ddb4641545f142bd93855e))
90
+ * **lsp:** sync semantic tokens after edits ([af33789](https://github.com/lewis6991/tcl-ls/commit/af33789fde346edf4777eb59d51dbfa95f84c716))
91
+ * **metadata:** tighten generic meta diagnostics ([12c4f8a](https://github.com/lewis6991/tcl-ls/commit/12c4f8a1af3d6063fcc8f7d816e73d930bf11562))
92
+ * **metadata:** tighten meta syntax rules ([5f707c7](https://github.com/lewis6991/tcl-ls/commit/5f707c7ff0c24c08ed4247b064f4a6f925e3f4d6))
93
+ * **metadata:** tighten override precedence ([2d44ca5](https://github.com/lewis6991/tcl-ls/commit/2d44ca5616b69afd90885fffe2b0aa81b26ee567))
94
+ * **meta:** tighten set arity ([3b6817e](https://github.com/lewis6991/tcl-ls/commit/3b6817e31ef9be978e609e3d0620c359072434ca))
95
+ * reduce more tcllib command noise ([2a0e4a6](https://github.com/lewis6991/tcl-ls/commit/2a0e4a663f7b9b61ae1de70a376ca7d39e2c54ce))
96
+ * reduce tcllib diagnostic noise ([e66c918](https://github.com/lewis6991/tcl-ls/commit/e66c918abcc3e2b0e42db116b3ae5c032ce9bb44))
97
+ * restore frozen server startup ([fe5cae0](https://github.com/lewis6991/tcl-ls/commit/fe5cae044c718e738d137cc626049821e164fff6))
98
+
99
+
100
+ ### Performance Improvements
101
+
102
+ * **analysis:** trim cold metadata work ([701cda2](https://github.com/lewis6991/tcl-ls/commit/701cda2832dde7e6a1b33be533f01df6faf1bf3a))
103
+ * **check:** parallelize workspace checks ([8b4df98](https://github.com/lewis6991/tcl-ls/commit/8b4df987e9e3c6ea0aa7e87e5e5f47f51fdfa66b))
104
+ * **check:** skip lexical span collection ([2e00132](https://github.com/lewis6991/tcl-ls/commit/2e0013250e5eae605fd285071c93043ce7c9e400))
105
+ * **lsp:** match lazy package indexes ([2bf7565](https://github.com/lewis6991/tcl-ls/commit/2bf756533e6bb88a9062d930ca2f11079e3e342c))
106
+ * **lsp:** speed up completion requests ([2364d32](https://github.com/lewis6991/tcl-ls/commit/2364d32e56c938ab55398b7e0f6ce48c891c844c))
107
+ * **metadata:** speed up metadata discovery ([1accc5c](https://github.com/lewis6991/tcl-ls/commit/1accc5c7b610aeca2bd3d9e6aa001de6470f15f9))
108
+ * **parser:** batch plain-text scans ([121890f](https://github.com/lewis6991/tcl-ls/commit/121890f783304b85d09f32210ce73fc14b6795e5))
109
+ * **parser:** scan braced words in chunks ([f7ff12e](https://github.com/lewis6991/tcl-ls/commit/f7ff12ea17231b3aa72933cc978a858ca772aae2))
110
+ * **parser:** track cursor ints locally ([7473a00](https://github.com/lewis6991/tcl-ls/commit/7473a00ce3b03907d3bb47fedc9d2cd045565a07))
111
+ * reduce parser and lowering overhead ([8401de9](https://github.com/lewis6991/tcl-ls/commit/8401de9f473661a11f1b4a1f90f9d1060869aca5))
112
+ * trim embedded analysis parse overhead ([e5fb459](https://github.com/lewis6991/tcl-ls/commit/e5fb459bcde6caa50ebaf9c9ceef0f137c22434b))
113
+
114
+
115
+ ### Documentation
116
+
117
+ * add commit message skill ([e928a74](https://github.com/lewis6991/tcl-ls/commit/e928a74412e282564e9f2336bfc4138f419c7358))
118
+ * add Sphinx docs site ([7c7c48b](https://github.com/lewis6991/tcl-ls/commit/7c7c48b98eee0e0cb026048fd842d2135b13863f))
119
+ * link hosted docs in README ([20c7e6e](https://github.com/lewis6991/tcl-ls/commit/20c7e6e580fc6563971d87781eff0e8c4be58412))
120
+ * **metadata:** clarify meta syntax wording ([ba69656](https://github.com/lewis6991/tcl-ls/commit/ba6965616e3b144c2394a37050c090bd90056f4b))
121
+ * **metadata:** clarify meta syntax wording ([4f61415](https://github.com/lewis6991/tcl-ls/commit/4f614155ef74bc4cf0336786485d0370b3037a17))
122
+ * **metadata:** polish meta syntax presentation ([5bbc40d](https://github.com/lewis6991/tcl-ls/commit/5bbc40ddbf3d1576ac7f8b2d466af86d8cb29c57))
123
+ * **skill:** keep commit scopes clean ([677074e](https://github.com/lewis6991/tcl-ls/commit/677074e42051dc6c2e3edd93149143a8175dc31c))
124
+
125
+ ## 0.1.0 - 2026-03-31
126
+
127
+ Initial public alpha release.
128
+
129
+ ### Added
130
+
131
+ - A typed Tcl parser with source spans, syntax diagnostics, and embedded-script
132
+ parsing for core Tcl forms.
133
+ - A conservative static analysis pipeline with diagnostics, hover, definition,
134
+ declaration, implementation, references, rename, completion, signature help,
135
+ semantic tokens, document links, and workspace symbols.
136
+ - Command-line entry points for ``tcl-ls``, ``tcl-check``, and ``tcl-meta``.
137
+ - Bundled Tcl and Tcllib metadata, packaged frozen-server builds, and editor
138
+ integration assets for VS Code and Neovim.
139
+
140
+ ### Notes
141
+
142
+ - This release is intentionally alpha-quality. It is already useful for early
143
+ adopters, but Tcl analysis remains conservative and many dynamic language
144
+ features are still outside the current scope.
tcl_ls-0.2.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Lewis Russell
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.