blockwatch-cli 0.16.3__tar.gz → 0.16.5__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 (317) hide show
  1. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/AGENTS.md +4 -8
  2. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/CHANGELOG.md +32 -0
  3. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/CLAUDE.md +4 -8
  4. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/Cargo.lock +1 -1
  5. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/Cargo.toml +1 -1
  6. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/PKG-INFO +1 -1
  7. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/README.md +5 -5
  8. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/ci.md +2 -2
  9. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/cli.md +3 -3
  10. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/symbols.md +279 -18
  11. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/setup.py +1 -1
  12. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/blocks.rs +4 -0
  13. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/c.rs +29 -41
  14. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/c_sharp.rs +49 -120
  15. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/go.rs +16 -18
  16. blockwatch_cli-0.16.5/src/language_parsers/hcl.rs +908 -0
  17. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/java.rs +66 -61
  18. blockwatch_cli-0.16.5/src/language_parsers/json.rs +453 -0
  19. blockwatch_cli-0.16.5/src/language_parsers/kotlin.rs +780 -0
  20. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/mod.rs +18 -0
  21. blockwatch_cli-0.16.5/src/language_parsers/proto.rs +397 -0
  22. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/rust.rs +16 -7
  23. blockwatch_cli-0.16.5/src/language_parsers/swift.rs +1165 -0
  24. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/toml.rs +4 -20
  25. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/typescript.rs +7 -12
  26. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/yaml.rs +9 -22
  27. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/skill.md +63 -3
  28. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/symbols/code.rs +204 -18
  29. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/symbols/mod.rs +85 -548
  30. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/symbol_references.rs +63 -0
  31. blockwatch_cli-0.16.5/tests/testdata/symbol_references/hcl_source.rs +3 -0
  32. blockwatch_cli-0.16.5/tests/testdata/symbol_references/hcl_target.hcl +8 -0
  33. blockwatch_cli-0.16.5/tests/testdata/symbol_references/kt_source.rs +3 -0
  34. blockwatch_cli-0.16.5/tests/testdata/symbol_references/kt_target.kt +5 -0
  35. blockwatch_cli-0.16.5/tests/testdata/symbol_references/kts_source.rs +3 -0
  36. blockwatch_cli-0.16.5/tests/testdata/symbol_references/kts_target.kts +5 -0
  37. blockwatch_cli-0.16.5/tests/testdata/symbol_references/nomad_source.rs +3 -0
  38. blockwatch_cli-0.16.5/tests/testdata/symbol_references/nomad_target.nomad +5 -0
  39. blockwatch_cli-0.16.5/tests/testdata/symbol_references/proto_source.rs +3 -0
  40. blockwatch_cli-0.16.5/tests/testdata/symbol_references/proto_target.proto +8 -0
  41. blockwatch_cli-0.16.5/tests/testdata/symbol_references/swift_source.rs +3 -0
  42. blockwatch_cli-0.16.5/tests/testdata/symbol_references/swift_target.swift +5 -0
  43. blockwatch_cli-0.16.5/tests/testdata/symbol_references/tf_source.rs +3 -0
  44. blockwatch_cli-0.16.5/tests/testdata/symbol_references/tf_target.tf +8 -0
  45. blockwatch_cli-0.16.5/tests/testdata/symbol_references/tfvars_source.rs +3 -0
  46. blockwatch_cli-0.16.5/tests/testdata/symbol_references/tfvars_target.tfvars +1 -0
  47. blockwatch_cli-0.16.5/tests/testdata/symbol_references/tofu_source.rs +3 -0
  48. blockwatch_cli-0.16.5/tests/testdata/symbol_references/tofu_target.tofu +4 -0
  49. blockwatch_cli-0.16.3/src/language_parsers/hcl.rs +0 -69
  50. blockwatch_cli-0.16.3/src/language_parsers/json.rs +0 -239
  51. blockwatch_cli-0.16.3/src/language_parsers/json.scm +0 -4
  52. blockwatch_cli-0.16.3/src/language_parsers/kotlin.rs +0 -86
  53. blockwatch_cli-0.16.3/src/language_parsers/proto.rs +0 -71
  54. blockwatch_cli-0.16.3/src/language_parsers/swift.rs +0 -91
  55. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.agents/.claude-plugin/plugin.json +0 -0
  56. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.agents/skills/blockwatch/SKILL.md +0 -0
  57. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.claude-plugin/marketplace.json +0 -0
  58. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/dependabot.yml +0 -0
  59. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/blockwatch.yml +0 -0
  60. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/codeql.yml +0 -0
  61. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/markdownlint.yml +0 -0
  62. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/pypi.yml +0 -0
  63. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/release.yml +0 -0
  64. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/rust.yml +0 -0
  65. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.github/workflows/trusted-checks.yml +0 -0
  66. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.gitignore +0 -0
  67. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.markdownlint-cli2.yaml +0 -0
  68. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.pre-commit-config.yaml +0 -0
  69. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/.pre-commit-hooks.yaml +0 -0
  70. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/LICENSE +0 -0
  71. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/SECURITY.md +0 -0
  72. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/blockwatch.toml +0 -0
  73. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/clippy.toml +0 -0
  74. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/codecov.yml +0 -0
  75. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/demo.gif +0 -0
  76. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/dist-workspace.toml +0 -0
  77. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/agents.md +0 -0
  78. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/README.md +0 -0
  79. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/affects.md +0 -0
  80. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/check-ai.md +0 -0
  81. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/check-lua.md +0 -0
  82. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/keep-sorted.md +0 -0
  83. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/keep-unique.md +0 -0
  84. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/line-count.md +0 -0
  85. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/line-pattern.md +0 -0
  86. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/docs/validators/same-as.md +0 -0
  87. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/pypi/pyproject.toml +0 -0
  88. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/pyproject.toml +0 -0
  89. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/release.toml +0 -0
  90. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/scripts/check_language_count.lua +0 -0
  91. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/scripts/check_latest_gpt_nano_model.lua +0 -0
  92. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/block_parser.rs +0 -0
  93. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/cli.rs +0 -0
  94. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/config.rs +0 -0
  95. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/diff_parser.rs +0 -0
  96. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/explain.rs +0 -0
  97. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/flags.rs +0 -0
  98. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/fs.rs +0 -0
  99. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/bash.rs +0 -0
  100. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/cmake.rs +0 -0
  101. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/cpp.rs +0 -0
  102. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/css.rs +0 -0
  103. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/dart.rs +0 -0
  104. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/dockerfile.rs +0 -0
  105. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/elixir.rs +0 -0
  106. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/graphql.rs +0 -0
  107. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/groovy.rs +0 -0
  108. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/html.rs +0 -0
  109. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/javascript.rs +0 -0
  110. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/lean.rs +0 -0
  111. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/lua.rs +0 -0
  112. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/makefile.rs +0 -0
  113. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/markdown.rs +0 -0
  114. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/mdx.rs +0 -0
  115. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/nix.rs +0 -0
  116. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/ocaml.rs +0 -0
  117. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/php.rs +0 -0
  118. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/python.rs +0 -0
  119. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/ruby.rs +0 -0
  120. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/scala.rs +0 -0
  121. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/sql.rs +0 -0
  122. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/starlark.rs +0 -0
  123. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/tsx.rs +0 -0
  124. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/language_parsers/xml.rs +0 -0
  125. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/lib.rs +0 -0
  126. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/main.rs +0 -0
  127. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/path_arguments.rs +0 -0
  128. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/paths_glob.rs +0 -0
  129. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/repo_path.rs +0 -0
  130. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/report.rs +0 -0
  131. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/sarif.rs +0 -0
  132. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/scan.rs +0 -0
  133. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/settings.rs +0 -0
  134. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/symbol_path.rs +0 -0
  135. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/tag_parser.rs +0 -0
  136. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/target_reference.rs +0 -0
  137. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/affects.rs +0 -0
  138. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/check_ai.rs +0 -0
  139. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/check_lua.rs +0 -0
  140. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/keep_sorted.rs +0 -0
  141. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/keep_unique.rs +0 -0
  142. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/line_count.rs +0 -0
  143. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/line_pattern.rs +0 -0
  144. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/mod.rs +0 -0
  145. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/validators/same_as.rs +0 -0
  146. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/violation_address.rs +0 -0
  147. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/src/virtual_blocks.rs +0 -0
  148. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/affects.rs +0 -0
  149. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/check_ai.rs +0 -0
  150. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/check_lua.rs +0 -0
  151. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/common/empty.toml +0 -0
  152. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/common/mod.rs +0 -0
  153. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/config.rs +0 -0
  154. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/encoding.rs +0 -0
  155. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/explain.rs +0 -0
  156. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/general.rs +0 -0
  157. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/keep_sorted.rs +0 -0
  158. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/keep_unique.rs +0 -0
  159. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/line_count.rs +0 -0
  160. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/line_pattern.rs +0 -0
  161. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/list.rs +0 -0
  162. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/path_arguments.rs +0 -0
  163. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/repository_root.rs +0 -0
  164. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/same_as.rs +0 -0
  165. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/sarif.rs +0 -0
  166. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/skill.rs +0 -0
  167. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/suppressions.rs +0 -0
  168. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/cross_file_source.rs +0 -0
  169. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/cross_file_target.md +0 -0
  170. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/custom_ext_source.javascript +0 -0
  171. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/custom_ext_target.javascript +0 -0
  172. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/dangling.md +0 -0
  173. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/missing_symbol.rs +0 -0
  174. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/more_added_than_deleted.py +0 -0
  175. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/multiline_tag_source.rs +0 -0
  176. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/multiline_tag_target.rs +0 -0
  177. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/nested_mapping_source.rs +0 -0
  178. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/nested_mapping_target.yaml +0 -0
  179. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/sibling.md +0 -0
  180. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/symbol_source.rs +0 -0
  181. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/symbol_target.json +0 -0
  182. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/table_source.rs +0 -0
  183. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/table_target.toml +0 -0
  184. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/tag_and_content_source.ts +0 -0
  185. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/tag_and_content_target.ts +0 -0
  186. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/whole_file_source.rs +0 -0
  187. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/affects/whole_file_target.json +0 -0
  188. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_ai/two_blocks.py +0 -0
  189. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/affects.lua +0 -0
  190. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/affects.py +0 -0
  191. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/affects_drift.py +0 -0
  192. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/blocking_io.lua +0 -0
  193. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/blocking_io.py +0 -0
  194. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/echo.lua +0 -0
  195. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/fail.lua +0 -0
  196. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/mode.py +0 -0
  197. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/os.lua +0 -0
  198. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pathfmt/report_path.lua +0 -0
  199. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pathfmt/source.py +0 -0
  200. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pattern.py +0 -0
  201. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pattern_many_matches.py +0 -0
  202. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/pattern_no_match.py +0 -0
  203. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/success.lua +0 -0
  204. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/check_lua/success_and_failure.py +0 -0
  205. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/config.toml +0 -0
  206. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/package.json +0 -0
  207. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/plugins/blue/package.json +0 -0
  208. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/plugins/green/package.json +0 -0
  209. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/config/glob_target/plugins/red/package.json +0 -0
  210. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/explain/a.py +0 -0
  211. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/explain/check.lua +0 -0
  212. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/block_selection.py +0 -0
  213. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/custom_file_extension.javascript +0 -0
  214. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/custom_file_extension.python +0 -0
  215. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/disable_enable.py +0 -0
  216. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/paths/invalid.py +0 -0
  217. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/paths/subdir/nested_invalid.py +0 -0
  218. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/paths/valid.py +0 -0
  219. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/general/severity.py +0 -0
  220. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/hidden/.github/workflows/ci.yml +0 -0
  221. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/keep_sorted/orderings.py +0 -0
  222. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/keep_unique/basic_and_pattern.py +0 -0
  223. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/line_count/equality_and_greater_than.py +0 -0
  224. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/line_pattern/forbidden_text.py +0 -0
  225. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/line_pattern/hex_and_word_patterns.py +0 -0
  226. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/list/.hg/.gitkeep +0 -0
  227. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/list/a.py +0 -0
  228. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/list/b.py +0 -0
  229. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/positions/unicode_columns.py +0 -0
  230. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/custom_ext_source.javascript +0 -0
  231. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/custom_ext_target.javascript +0 -0
  232. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/package.json +0 -0
  233. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths/alpha/item.txt +0 -0
  234. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths/beta/item.txt +0 -0
  235. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths_and_block_source.md +0 -0
  236. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/paths_source.md +0 -0
  237. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/sibling.rs +0 -0
  238. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/source.rs +0 -0
  239. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/split_table_source.rs +0 -0
  240. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/split_table_target.toml +0 -0
  241. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/symbol_mismatch_source.rs +0 -0
  242. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/symbol_source.rs +0 -0
  243. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/target.md +0 -0
  244. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/whole_file_mismatch_source.rs +0 -0
  245. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/whole_file_source.rs +0 -0
  246. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/same_as/whole_file_target.json +0 -0
  247. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/advisory.py +0 -0
  248. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/clean.py +0 -0
  249. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/sorted.py +0 -0
  250. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/sarif/unnamed.py +0 -0
  251. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg.txt +0 -0
  252. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_gone_a.txt +0 -0
  253. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_gone_b.txt +0 -0
  254. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_lowercase_trailer.txt +0 -0
  255. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_malformed.txt +0 -0
  256. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/commit_msg_with_noise.txt +0 -0
  257. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/dangling.py +0 -0
  258. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/sorted.py +0 -0
  259. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/symbol.py +0 -0
  260. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/symbol_target.json +0 -0
  261. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/two_rules.py +0 -0
  262. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/suppressions/unnamed.py +0 -0
  263. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/bzl_source.rs +0 -0
  264. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/bzl_target.bzl +0 -0
  265. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/c_source.rs +0 -0
  266. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/c_target.c +0 -0
  267. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cpp_source.rs +0 -0
  268. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cpp_target.cpp +0 -0
  269. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cs_source.rs +0 -0
  270. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/cs_target.cs +0 -0
  271. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/escapes_source.rs +0 -0
  272. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/escapes_target.json +0 -0
  273. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/filter_source.rs +0 -0
  274. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/filter_target.yaml +0 -0
  275. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/go_source.rs +0 -0
  276. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/go_target.go +0 -0
  277. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/h_source.rs +0 -0
  278. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/h_target.h +0 -0
  279. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/java_source.rs +0 -0
  280. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/java_target.java +0 -0
  281. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/js_source.rs +0 -0
  282. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/js_target.js +0 -0
  283. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/json_source.rs +0 -0
  284. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/json_target.json +0 -0
  285. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/jsonc_source.rs +0 -0
  286. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/jsonc_target.jsonc +0 -0
  287. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/markdown_source.rs +0 -0
  288. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/markdown_target.markdown +0 -0
  289. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/md_source.rs +0 -0
  290. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/md_target.md +0 -0
  291. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mdx_source.rs +0 -0
  292. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mdx_target.mdx +0 -0
  293. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mixed_list_source.rs +0 -0
  294. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/mixed_list_target.json +0 -0
  295. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/py_source.rs +0 -0
  296. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/py_target.py +0 -0
  297. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/rs_source.rs +0 -0
  298. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/rs_target.rs +0 -0
  299. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/toml_source.rs +0 -0
  300. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/toml_target.toml +0 -0
  301. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/ts_source.rs +0 -0
  302. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/ts_target.ts +0 -0
  303. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/tsx_source.rs +0 -0
  304. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/tsx_target.tsx +0 -0
  305. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yaml_source.rs +0 -0
  306. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yaml_target.yaml +0 -0
  307. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yml_source.rs +0 -0
  308. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/symbol_references/yml_target.yml +0 -0
  309. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/affects/pair.py +0 -0
  310. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/counted.py +0 -0
  311. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/noop.py +0 -0
  312. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/notes.txt +0 -0
  313. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/clean/sorted.py +0 -0
  314. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/diff/two_blocks.py +0 -0
  315. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/failing/unsorted.py +0 -0
  316. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/testdata/verbosity/mixed/both_kinds.py +0 -0
  317. {blockwatch_cli-0.16.3 → blockwatch_cli-0.16.5}/tests/verbosity.rs +0 -0
@@ -235,22 +235,18 @@ The main modules:
235
235
  Some languages also have symbols. Such a language has a `SymbolsParser`, which its `parser()` passes to
236
236
  `.with_symbols(...)`:
237
237
 
238
- - JSON uses a `QuerySymbolsParser`, built from a tree-sitter query (`.scm`) and a `NodeDecoder`.
238
+ - JSON and YAML walk their syntax trees themselves, and refuse a file with a syntax error.
239
239
  - TOML finds its symbols with `toml_edit`. What a TOML key means depends on the order of the headers, not on how the
240
240
  syntax tree is nested.
241
- - YAML walks its syntax tree itself. An alias has a position in a sequence but can't be addressed, and a query can't
242
- express that.
243
241
  - Markdown finds its sections with the `markdown` crate, the same parser that finds its comments.
244
242
 
245
243
  Each language's tests list every symbol it finds. When you give a language symbols, also document its paths in
246
244
  `docs/symbols.md` and in the "Symbols" section of the skill, `src/skill.md`. A test in `language_parsers/mod.rs` and the
247
245
  repository's own blocks keep the list of file types with symbols, and each language's section, in sync with the
248
246
  code.
249
- - `src/symbols.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
250
- `QuerySymbolsParser` runs a language's query and finds every addressable `Symbol` in one walk of the tree, with its
251
- path, its definition range and its decoded value. It suits a language whose structure is its syntax tree. It rejects
252
- a file with a syntax error, instead of resolving a path through tree-sitter's error recovery. It doesn't check the
253
- query itself.
247
+ - `src/symbols/mod.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
248
+ `ensure_no_syntax_error` refuses a file with a syntax error, instead of resolving a path through tree-sitter's error
249
+ recovery.
254
250
  - `src/validators/` — one file for each validator (`affects`, `check_ai`, `check_lua`, `keep_sorted`, `keep_unique`,
255
251
  `line_count`, `line_pattern`, `same_as`). Each file exports a `detect` function. `Validator::detect` in
256
252
  `validators/mod.rs` calls them from one `match`.
@@ -12,6 +12,38 @@ Releases up to and including v0.3.11 predate this file. Their notes live on the
12
12
 
13
13
  ## [Unreleased] - ReleaseDate
14
14
 
15
+ ## [0.16.5] - 2026-11-03
16
+
17
+ ### Added
18
+
19
+ - Symbols in Protocol Buffers files (`.proto`). `item.proto#/Item/Color/RED` points at the number of an enum value,
20
+ and `#/Item/name` at the number of a field. Each message, enum and service is a symbol, and so is each field, oneof,
21
+ enum value and rpc in it. The package is not part of a path, and options are not symbols. See
22
+ [Protocol Buffers](docs/symbols.md#protocol-buffers).
23
+ - Symbols in HCL files: Terraform and OpenTofu (`.tf`, `.tofu`, `.tfvars`), Nomad (`.nomad`), and `.hcl` files such
24
+ as Terragrunt's. See [HCL](docs/symbols.md#hcl).
25
+ - blockwatch now checks the tags in Nomad job files (`.nomad`). Before, it skipped them.
26
+
27
+ ## [0.16.4] - 2026-11-03
28
+
29
+ ### Added
30
+
31
+ - Symbols in Kotlin files (`.kt` and `.kts`). `Config.kt#/Config/MAX_RETRIES` points at a property of the class
32
+ `Config`, and `#/MAX_RETRIES` at one at the top of the file. Each type is a symbol, and so is each property,
33
+ constructor property, function, enum entry and nested type in it. A companion object's members sit under the class.
34
+ See [Kotlin](docs/symbols.md#kotlin).
35
+ - Symbols in Swift files. `Config.swift#/Config/maxRetries` points at a property of the type `Config`, and
36
+ `#/maxRetries` at one at the top of the file. Each type is a symbol, and so is each property, function, enum case and
37
+ nested type in it. An extension's members sit under the type it extends, and an enum case's value is its raw value.
38
+ See [Swift](docs/symbols.md#swift).
39
+
40
+ ### Fixed
41
+
42
+ - A Java text block with `\u` and a sign, such as `\u+041`, counted as the character, here `A`. Java rejects this
43
+ escape, so a path to the text block now stops the run.
44
+ - A Java string in `"` quotes with a line break in it counted as text. Java rejects it, so a path to it now stops the
45
+ run. Before, a string missing its closing quote took in the next line as its value.
46
+
15
47
  ## [0.16.3] - 2026-11-02
16
48
 
17
49
  ## [0.16.2] - 2026-10-30
@@ -235,22 +235,18 @@ The main modules:
235
235
  Some languages also have symbols. Such a language has a `SymbolsParser`, which its `parser()` passes to
236
236
  `.with_symbols(...)`:
237
237
 
238
- - JSON uses a `QuerySymbolsParser`, built from a tree-sitter query (`.scm`) and a `NodeDecoder`.
238
+ - JSON and YAML walk their syntax trees themselves, and refuse a file with a syntax error.
239
239
  - TOML finds its symbols with `toml_edit`. What a TOML key means depends on the order of the headers, not on how the
240
240
  syntax tree is nested.
241
- - YAML walks its syntax tree itself. An alias has a position in a sequence but can't be addressed, and a query can't
242
- express that.
243
241
  - Markdown finds its sections with the `markdown` crate, the same parser that finds its comments.
244
242
 
245
243
  Each language's tests list every symbol it finds. When you give a language symbols, also document its paths in
246
244
  `docs/symbols.md` and in the "Symbols" section of the skill, `src/skill.md`. A test in `language_parsers/mod.rs` and the
247
245
  repository's own blocks keep the list of file types with symbols, and each language's section, in sync with the
248
246
  code.
249
- - `src/symbols.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
250
- `QuerySymbolsParser` runs a language's query and finds every addressable `Symbol` in one walk of the tree, with its
251
- path, its definition range and its decoded value. It suits a language whose structure is its syntax tree. It rejects
252
- a file with a syntax error, instead of resolving a path through tree-sitter's error recovery. It doesn't check the
253
- query itself.
247
+ - `src/symbols/mod.rs` — `Symbol`, the `SymbolsParser` trait, and `resolve`, which finds the symbol a path refers to.
248
+ `ensure_no_syntax_error` refuses a file with a syntax error, instead of resolving a path through tree-sitter's error
249
+ recovery.
254
250
  - `src/validators/` — one file for each validator (`affects`, `check_ai`, `check_lua`, `keep_sorted`, `keep_unique`,
255
251
  `line_count`, `line_pattern`, `same_as`). Each file exports a `detect` function. `Validator::detect` in
256
252
  `validators/mod.rs` calls them from one `match`.
@@ -274,7 +274,7 @@ checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
274
274
 
275
275
  [[package]]
276
276
  name = "blockwatch"
277
- version = "0.16.3"
277
+ version = "0.16.5"
278
278
  dependencies = [
279
279
  "anyhow",
280
280
  "assert-json-diff",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "blockwatch"
3
- version = "0.16.3"
3
+ version = "0.16.5"
4
4
  edition = "2024"
5
5
  repository = "https://github.com/mennanov/blockwatch"
6
6
  description = "Language agnostic linter that keeps your code and documentation in sync and valid"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blockwatch-cli
3
- Version: 0.16.3
3
+ Version: 0.16.5
4
4
  Summary: Language agnostic linter that keeps your code and documentation in sync and valid
5
5
  Keywords: linter,sync,drift,comments,agents
6
6
  Home-Page: https://github.com/mennanov/blockwatch
@@ -89,9 +89,9 @@ Two validators work across files:
89
89
  - `same-as` fails when a block and its target hold different values. It needs no diff.
90
90
 
91
91
  Both can point to a block, a whole file, a specific value in a file like `package.json#/version`, a section of a
92
- Markdown file, or a constant in a Go, C, C++, Python, Rust, TypeScript, JavaScript, Java or C# file (see
93
- [Symbols](docs/symbols.md)). The other validators check a single block on their own: the things you'd otherwise have to
94
- nitpick in code review.
92
+ Markdown file, a constant in a Go, C, C++, Python, Rust, TypeScript, JavaScript, Java, C#, Kotlin or Swift file, a
93
+ field in a Protocol Buffers file, or a value in a Terraform or other HCL file (see [Symbols](docs/symbols.md)). The
94
+ other validators check a single block on their own: the things you'd otherwise have to nitpick in code review.
95
95
 
96
96
  <!-- <block name="available-validators"
97
97
  same-as="src/validators/mod.rs:validator-registry, docs/validators/README.md:validators-index"
@@ -219,7 +219,7 @@ exclusions, and custom extension mappings.
219
219
 
220
220
  ```yaml
221
221
  - repo: https://github.com/mennanov/blockwatch
222
- rev: v0.16.3 # Use latest release
222
+ rev: v0.16.5 # Use latest release
223
223
  hooks:
224
224
  - id: blockwatch
225
225
  ```
@@ -258,7 +258,7 @@ For plain git hooks, local pre-commit setups, and sandboxing untrusted Lua scrip
258
258
  - Go (with `go.mod`, `go.sum` and `go.work` support)
259
259
  - GraphQL (`.graphql`, `.graphqls`, `.gql`)
260
260
  - Groovy (with `.gradle` and `Jenkinsfile` support)
261
- - HCL (Terraform and OpenTofu: `.tf`, `.tfvars`, `.tofu`, `.hcl`)
261
+ - HCL (Terraform and OpenTofu: `.tf`, `.tfvars`, `.tofu`, `.hcl`; Nomad: `.nomad`)
262
262
  - HTML (with `.xhtml` support)
263
263
  - JSON (`.json`, `.jsonc`, `.webmanifest`)
264
264
  - Java
@@ -19,7 +19,7 @@ To use [pre-commit](https://pre-commit.com), add the hook to `.pre-commit-config
19
19
 
20
20
  ```yaml
21
21
  - repo: https://github.com/mennanov/blockwatch
22
- rev: v0.16.3 # Use latest release
22
+ rev: v0.16.5 # Use latest release
23
23
  hooks:
24
24
  - id: blockwatch
25
25
  ```
@@ -59,7 +59,7 @@ The `blockwatch` hook runs before the commit message exists, so it cannot see a
59
59
 
60
60
  ```yaml
61
61
  - repo: https://github.com/mennanov/blockwatch
62
- rev: v0.16.3 # Use latest release
62
+ rev: v0.16.5 # Use latest release
63
63
  hooks:
64
64
  - id: blockwatch-commit-msg
65
65
  ```
@@ -557,15 +557,15 @@ Nothing else about the run changes: the same violations are found, and the exit
557
557
  "tool": {
558
558
  "driver": {
559
559
  "name": "blockwatch",
560
- "version": "0.16.3",
561
- "semanticVersion": "0.16.3",
560
+ "version": "0.16.5",
561
+ "semanticVersion": "0.16.5",
562
562
  "informationUri": "https://github.com/mennanov/blockwatch",
563
563
  "rules": [
564
564
  {
565
565
  "id": "keep-sorted",
566
566
  "name": "keep-sorted",
567
567
  "shortDescription": { "text": "Requires the lines of a block to stay in order." },
568
- "helpUri": "https://github.com/mennanov/blockwatch/blob/v0.16.3/docs/validators/keep-sorted.md"
568
+ "helpUri": "https://github.com/mennanov/blockwatch/blob/v0.16.5/docs/validators/keep-sorted.md"
569
569
  }
570
570
  ]
571
571
  }
@@ -24,21 +24,25 @@ declares, instead of tags in a comment.
24
24
  <!-- <block name="extensions-with-symbols" same-as="src/language_parsers/mod.rs:extensions-with-symbols"
25
25
  same-as-pattern="`\.?(?P<value>[A-Za-z.]+)`"> -->
26
26
 
27
- | Language | Files | Paths |
28
- |------------|--------------------------------------------------------------------------------|---------------------------------------------------------|
29
- | JSON | `.json`, `.jsonc`, `.webmanifest` | [JSON](#json) |
30
- | TOML | `.toml`, `Pipfile` | [TOML](#toml) |
31
- | YAML | `.yaml`, `.yml`, `.cff` | [YAML](#yaml) |
32
- | Markdown | `.md`, `.markdown`, `.mdx` | [Markdown](#markdown) |
33
- | Go | `.go` | [Go](#go) |
34
- | C, C++ | `.c`, `.h`, `.cc`, `.cpp`, `.cxx`, `.hh`, `.hpp`, `.hxx` | [C and C++](#c-and-c) |
35
- | Python | `.py`, `.pyi`, `.pyw` | [Python and Starlark](#python-and-starlark) |
36
- | Starlark | `.bzl`, `.bazel`, `.bzlmod`, `.star`, `BUILD`, `BUCK`, `WORKSPACE`, `Tiltfile` | [Python and Starlark](#python-and-starlark) |
37
- | Rust | `.rs` | [Rust](#rust) |
38
- | TypeScript | `.ts`, `.mts`, `.cts`, `.d.ts`, `.tsx` | [TypeScript and JavaScript](#typescript-and-javascript) |
39
- | JavaScript | `.js`, `.mjs`, `.cjs`, `.jsx` | [TypeScript and JavaScript](#typescript-and-javascript) |
40
- | Java | `.java` | [Java](#java) |
41
- | C# | `.cs` | [C#](#c) |
27
+ | Language | Files | Paths |
28
+ |------------------|--------------------------------------------------------------------------------|---------------------------------------------------------|
29
+ | JSON | `.json`, `.jsonc`, `.webmanifest` | [JSON](#json) |
30
+ | TOML | `.toml`, `Pipfile` | [TOML](#toml) |
31
+ | YAML | `.yaml`, `.yml`, `.cff` | [YAML](#yaml) |
32
+ | Markdown | `.md`, `.markdown`, `.mdx` | [Markdown](#markdown) |
33
+ | Go | `.go` | [Go](#go) |
34
+ | C, C++ | `.c`, `.h`, `.cc`, `.cpp`, `.cxx`, `.hh`, `.hpp`, `.hxx` | [C and C++](#c-and-c) |
35
+ | Python | `.py`, `.pyi`, `.pyw` | [Python and Starlark](#python-and-starlark) |
36
+ | Starlark | `.bzl`, `.bazel`, `.bzlmod`, `.star`, `BUILD`, `BUCK`, `WORKSPACE`, `Tiltfile` | [Python and Starlark](#python-and-starlark) |
37
+ | Rust | `.rs` | [Rust](#rust) |
38
+ | TypeScript | `.ts`, `.mts`, `.cts`, `.d.ts`, `.tsx` | [TypeScript and JavaScript](#typescript-and-javascript) |
39
+ | JavaScript | `.js`, `.mjs`, `.cjs`, `.jsx` | [TypeScript and JavaScript](#typescript-and-javascript) |
40
+ | Java | `.java` | [Java](#java) |
41
+ | C# | `.cs` | [C#](#c) |
42
+ | Kotlin | `.kt`, `.kts` | [Kotlin](#kotlin) |
43
+ | Swift | `.swift` | [Swift](#swift) |
44
+ | Protocol Buffers | `.proto` | [Protocol Buffers](#protocol-buffers) |
45
+ | HCL (Terraform) | `.tf`, `.tofu`, `.tfvars`, `.hcl`, `.nomad` | [HCL](#hcl) |
42
46
 
43
47
  <!-- </block> -->
44
48
 
@@ -249,8 +253,9 @@ Clone the repository.
249
253
 
250
254
  In a code file, each top-level name is a symbol: a constant, a variable, a type, a function or a macro. Its path is
251
255
  `#/NAME`.
252
- With `const MaxPorts = 8` in `consts.go`, `consts.go#/MaxPorts` points at `8`. In Java and C#, the members of a type
253
- are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`.
256
+ With `const MaxPorts = 8` in `consts.go`, `consts.go#/MaxPorts` points at `8`. In Java, C#, Kotlin, Swift and Protocol
257
+ Buffers, the members of a type are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`. In HCL, each
258
+ block, attribute and object key is a symbol: `main.tf#/variable/region/default`.
254
259
 
255
260
  - **A value is the initializer as written.** blockwatch never works it out: `20 * 1024 * 1024` stays as it is, and so
256
261
  does `0x10`. Use `same-as-pattern` to take the part you need.
@@ -264,7 +269,8 @@ are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`.
264
269
  with a name from the text that the parser had to skip. Other names in the file still resolve. The message shows
265
270
  where the error is.
266
271
  - **A path to a string that blockwatch can't decode stops the run.** Other paths in the file still resolve.
267
- - **Members are not symbols yet**, such as a method or a field, except in Java and C#.
272
+ - **Members are not symbols yet**, such as a method or a field, except in Java, C#, Kotlin, Swift, Protocol Buffers
273
+ and HCL.
268
274
 
269
275
  <!-- </block> -->
270
276
 
@@ -595,6 +601,261 @@ public class Config
595
601
 
596
602
  <!-- </block> -->
597
603
 
604
+ ## Kotlin
605
+
606
+ <!-- <block name="kotlin-paths"> -->
607
+
608
+ ```kotlin
609
+ const val MAX_RETRIES = 20 * 1024
610
+
611
+ data class Config(val timeout: Int = 30, val name: String) {
612
+ @JvmField
613
+ val url = "https://example.com"
614
+
615
+ fun run() {}
616
+ fun run(times: Int) {}
617
+
618
+ companion object {
619
+ const val ORIGIN = 0
620
+ }
621
+
622
+ enum class Mode { RED, GREEN }
623
+ }
624
+ ```
625
+
626
+ | Path | Points at |
627
+ |-----------------------|--------------------------------------------|
628
+ | `#/MAX_RETRIES` | `20 * 1024` |
629
+ | `#/Config` | the whole class |
630
+ | `#/Config/timeout` | `30` |
631
+ | `#/Config/name` | `val name: String`, as it has no default |
632
+ | `#/Config/url` | `https://example.com` |
633
+ | `#/Config/run` | a violation, as `run` is defined twice |
634
+ | `#/Config/ORIGIN` | `0` |
635
+ | `#/Config/Mode/GREEN` | `GREEN`, as it has no value |
636
+
637
+ - **Each top-level property, function, type and type alias is a symbol, and so is each member of a type**: a property,
638
+ a function, an enum entry, or a nested class, interface or object. A path goes from the top-level type down:
639
+ `#/Config/Mode/GREEN`.
640
+ - **A constructor parameter with `val` or `var` is a symbol.** Its value is its default. A parameter without `val` or
641
+ `var` is not a symbol.
642
+ - **A companion object's members sit under the class**, as code reads them: `#/Config/ORIGIN`. A companion with a
643
+ name works the same way: `companion object Builder` still gives `#/Config/ORIGIN`.
644
+ - **Overloads are defined twice.** So are a property and a function with one name, and two extension functions with
645
+ one name, such as `fun Foo.toDto()` and `fun Bar.toDto()`. Wrap the one you mean in a block instead.
646
+ - **A property's value is its initializer, or the `v` of `get() = v`.** A property with `by`, such as
647
+ `by lazy { 3 }`, has no value, and neither has one whose getter has a block body.
648
+ - **A name in backticks loses them.** `` fun `parses empty input`() `` in `Config` is
649
+ `#/Config/parses empty input`.
650
+ - **Annotations are part of a definition. KDoc is not.** One case is left out: at the top of a file, an annotation with
651
+ arguments on its own line, before a `fun` or `val` with no other modifier. The parser reads it as a separate
652
+ expression.
653
+ - **Constructors, `init` blocks, the companion object itself, local declarations, and the members in the body of an
654
+ enum entry are not symbols.** In a `.kts` script, the top-level properties, functions and types are symbols. Calls
655
+ such as `plugins { ... }` and everything inside them are not.
656
+ - **Strings follow Kotlin's escapes.** `"caf\u00e9"` is `café`. A raw string (`"""..."""`) has no escapes, and each line
657
+ end in it is a line feed. A string with a template, such as `"v$major"` or `"${a + b}"`, stays as written, and so
658
+ does a character such as `'a'`. A path to a string that Kotlin rejects stops the run, such as `"\q"`.
659
+ - **A syntax error stops the run for the member that holds it, and for each type around that member.** The other
660
+ members still resolve. The parser doesn't read some newer syntax, such as context parameters and `$$"..."` strings.
661
+ It also fails on a class body on one line with a property in it, such as `class A { val x = 1 }`.
662
+
663
+ <!-- </block> -->
664
+
665
+ ## Swift
666
+
667
+ <!-- <block name="swift-paths"> -->
668
+
669
+ ```swift
670
+ public let maxRetries = 20 * 1024
671
+
672
+ struct Config {
673
+ static let timeout = 30
674
+ var name: String
675
+ var ready: Bool { timeout > 0 }
676
+
677
+ func run() {}
678
+ func run(times: Int) {}
679
+
680
+ enum Mode: String {
681
+ case red = "r", green
682
+ }
683
+ }
684
+
685
+ extension Config {
686
+ static let url = "https://example.com"
687
+ }
688
+ ```
689
+
690
+ | Path | Points at |
691
+ |-----------------------|--------------------------------------------|
692
+ | `#/maxRetries` | `20 * 1024` |
693
+ | `#/Config` | the whole struct, without its extension |
694
+ | `#/Config/timeout` | `30` |
695
+ | `#/Config/name` | `var name: String`, as it has no value |
696
+ | `#/Config/ready` | `timeout > 0` |
697
+ | `#/Config/run` | a violation, as `run` is defined twice |
698
+ | `#/Config/Mode/red` | `r` |
699
+ | `#/Config/Mode/green` | `green`, as its raw value is implicit |
700
+ | `#/Config/url` | `https://example.com` |
701
+
702
+ - **Each top-level property, function, type, type alias and macro is a symbol, and so is each member of a type**: a
703
+ property, a function, an enum case, an associated type or a nested type. A protocol is a type, and its requirements
704
+ are members. A path goes from the top-level type down: `#/Config/Mode/red`.
705
+ - **An extension's members sit under the type it extends**, as code reads them: `#/Config/url`. The type can come from
706
+ another file too, so `String+Format.swift` can have `#/String/trimmed`. The path follows the type's name as written:
707
+ `extension Outer.Inner` gives `#/Outer/Inner/...`, and `extension Swift.String` gives `#/Swift/String/...`. An
708
+ extension of a type without a name, such as `extension [Int]`, has no symbols.
709
+ - **Overloads are defined twice.** So are a property and a function with one name, copies of a name in `#if` and
710
+ `#else`, and a protocol requirement and its default in an extension. Wrap the one you mean in a block instead.
711
+ - **A property's value is its initializer, or the `v` of `{ v }` or `{ return v }`.** A computed property with `get`
712
+ or `set`, with several statements, or with one statement that is not an expression, such as a `for` loop, has no
713
+ value. An enum case's value is its raw value, the `v` of `= v`. A case
714
+ without one has no value, even when Swift gives it one.
715
+ - **In `let a = 1, b = 2` and `case a = 1, b`, each name covers only its own part.** The first part also covers the
716
+ attributes, the modifiers and `let`, `var` or `case`: `#/a` is `let a = 1`, and `#/b` is `b = 2`.
717
+ - **A name in backticks loses them.** Attributes are part of a definition. Doc comments are not.
718
+ - **`init`, `deinit`, `subscript`, operators, precedence groups, extensions themselves, local declarations and
719
+ top-level statements are not symbols.**
720
+ - **Strings follow Swift's escapes.** `"caf\u{e9}"` is `café`. A raw string, such as `#"C:\new"#`, reads only the
721
+ escapes with as many `#` as its quotes, such as `\#n`. A multi-line string loses the white space before its closing
722
+ quotes on each line, and each line end in it is a line feed. A string with an interpolation, such as `"v\(major)"`,
723
+ stays as written, and so does a regex. A path to a string that Swift rejects stops the run, such as `"\u{D800}"`.
724
+ - **A syntax error stops the run for the member that holds it, and for each type around that member.** The other
725
+ members still resolve. An extension is not part of the type it extends, so an error in an extension's member leaves
726
+ the type readable. The parser fails on an empty tuple passed to a function, as in `f(())`, so a function with one in
727
+ its body stops the run too.
728
+
729
+ <!-- </block> -->
730
+
731
+ ## Protocol Buffers
732
+
733
+ <!-- <block name="proto-paths"> -->
734
+
735
+ ```protobuf
736
+ syntax = "proto3";
737
+
738
+ package shop.v1;
739
+
740
+ option go_package = "shop/v1";
741
+
742
+ message Item {
743
+ string name = 1;
744
+ map<string, int32> counts = 2;
745
+ enum Color {
746
+ COLOR_UNSPECIFIED = 0;
747
+ RED = 1;
748
+ BLUE = -2;
749
+ }
750
+ oneof price {
751
+ int64 cents = 3;
752
+ }
753
+ }
754
+
755
+ service Items {
756
+ rpc Get(Item) returns (Item);
757
+ }
758
+ ```
759
+
760
+ | Path | Points at |
761
+ |----------------------|------------------------------|
762
+ | `#/Item` | the whole message |
763
+ | `#/Item/name` | `1` |
764
+ | `#/Item/counts` | `2` |
765
+ | `#/Item/Color` | the whole enum |
766
+ | `#/Item/Color/RED` | `1` |
767
+ | `#/Item/Color/BLUE` | `-2` |
768
+ | `#/Item/price` | the whole oneof |
769
+ | `#/Item/cents` | `3` |
770
+ | `#/Items/Get` | the whole rpc |
771
+
772
+ - **Each message, enum and service is a symbol, at any depth, and so is each field, map field, oneof, enum value and
773
+ rpc in it.** A proto2 group, such as `optional group Result = 4 { ... }` in `Item`, is a symbol too, with its
774
+ fields under it: `#/Item/Result/code`. It has no value, though it has a number.
775
+ - **The package is not part of a path.** A file has only one, so `#/Item` is enough.
776
+ - **An enum value sits under its enum:** `#/Item/Color/RED`.
777
+ - **A field's value is its number, and an enum value's value is its number.** Both stay as written: `0x3` stays `0x3`,
778
+ and `- 2` stays `- 2`. Options after the number don't change it: `BLUE = -2 [deprecated = true]` is `-2`.
779
+ - **A oneof's fields sit in its message**, as code reads them: `#/Item/cents`, not `#/Item/price/cents`.
780
+ - **An extension field sits where its `extend` is written**, not in the message it extends.
781
+ `extend Other { int32 tag = 100; }` at the top of the file gives `#/tag`, and inside `Item` it gives `#/Item/tag`.
782
+ - **A definition covers its whole statement**, with its label, its options and its `;`, but not the comments above it.
783
+ - **Options are not symbols**, and neither are `syntax`, `package`, `import`, `extend` blocks, `reserved` and
784
+ `extensions`. To check an option such as `go_package`, wrap it in a `[[block]]` entry with a `target-pattern`.
785
+ - **A syntax error stops the run for the definition that holds it, and for each message around it.** The other
786
+ definitions still resolve.
787
+
788
+ <!-- </block> -->
789
+
790
+ ## HCL
791
+
792
+ Terraform, OpenTofu, Terragrunt, Nomad and Packer files are HCL.
793
+
794
+ <!-- <block name="hcl-paths"> -->
795
+
796
+ ```hcl
797
+ terraform {
798
+ required_providers {
799
+ aws = {
800
+ source = "hashicorp/aws"
801
+ version = "~> 5.0"
802
+ }
803
+ }
804
+ }
805
+
806
+ variable "region" {
807
+ default = "us-east-1"
808
+ }
809
+
810
+ locals {
811
+ name = "app-${var.env}"
812
+ tags = { Team = "core", "cost center" = 42 }
813
+ }
814
+
815
+ resource "aws_instance" "web" {
816
+ ami = data.aws_ami.ubuntu.id
817
+ count = (3)
818
+ user_data = <<-EOT
819
+ #!/bin/sh
820
+ echo hi
821
+ EOT
822
+ }
823
+ ```
824
+
825
+ | Path | Points at |
826
+ |----------------------------------------------|-------------------------------------------|
827
+ | `#/terraform/required_providers/aws/version` | `~> 5.0` |
828
+ | `#/variable/region` | the whole block |
829
+ | `#/variable/region/default` | `us-east-1` |
830
+ | `#/locals/name` | `"app-${var.env}"`, as written |
831
+ | `#/locals/tags` | the whole object, as written |
832
+ | `#/locals/tags/cost center` | `42` |
833
+ | `#/resource/aws_instance/web/ami` | `data.aws_ami.ubuntu.id` |
834
+ | `#/resource/aws_instance/web/count` | `3` |
835
+ | `#/resource/aws_instance/web/user_data` | `#!/bin/sh` and `echo hi`, each on a line |
836
+
837
+ - **Each block is a symbol, at any depth, and so is each attribute and each key of an object.** A block's path is its
838
+ type, then each of its labels: `#/resource/aws_instance/web`. In a `.tfvars` file, each attribute sits at the top:
839
+ `#/region`.
840
+ - **A path with only some of a block's labels points at nothing.** `#/resource/aws_instance` is no symbol.
841
+ - **A block written twice in one body makes its path a violation**, such as two `ingress` blocks in a resource. Two
842
+ `locals` blocks make `#/locals` a violation, but `#/locals/name` still resolves when only one of them sets `name`.
843
+ - **A key of an object is a segment when it is a name, a plain string, `true` or `false`**, such as `Team` or
844
+ `"cost center"`. A key written as a number or an expression, such as `3` or `(var.k)`, is not. The items of a list
845
+ are not symbols.
846
+ - **A label or key with an escape, such as `"a\"b"`, gives no symbol**, and neither does anything under it.
847
+ - **A value is the expression as written**, without parentheses around it: `count = (3)` is `3`.
848
+ - **Strings follow HCL's escapes.** `"caf\u00e9"` is `café`, `$${` is `${`, and `%%{` is `%{`. A heredoc is its text,
849
+ with each line end. A `<<-` heredoc loses the indent that HCL removes. A string or heredoc with `${...}` or `%{...}`
850
+ stays as written. blockwatch doesn't turn text into Unicode NFC, as HCL does. A path to an escape that stands for no
851
+ character, such as `"\uD800"`, stops the run.
852
+ - **A block covers its type, labels and body.** An attribute or a key covers its name and its value. Comments above
853
+ them are not part of them.
854
+ - **A syntax error stops the run for the definition that holds it, and for each block around it.** After an error, the
855
+ parser can read the rest of the file wrongly, so a later path may not resolve.
856
+
857
+ <!-- </block> -->
858
+
598
859
  ---
599
860
 
600
861
  [← Return to README](../README.md)
@@ -6,7 +6,7 @@ setup(
6
6
  name='blockwatch-pre-commit-placeholder',
7
7
  version='0.0.0',
8
8
  # <block name="blockwatch-cli-version" same-as-pattern="blockwatch-cli==(?P<value>\d+\.\d+\.\d+)">
9
- install_requires=['blockwatch-cli==0.16.3'],
9
+ install_requires=['blockwatch-cli==0.16.5'],
10
10
  # </block>
11
11
  # Without it, setuptools takes the directories under src/ for Python packages.
12
12
  packages=[],
@@ -899,6 +899,10 @@ mod supported_languages_tests {
899
899
  "tofu.tofu".to_string(),
900
900
  "# <block>\nregion = \"eu-central-1\"\n# </block>".to_string(),
901
901
  ),
902
+ (
903
+ "nomad.nomad".to_string(),
904
+ "# <block>\ndatacenters = [\"dc1\"]\n# </block>".to_string(),
905
+ ),
902
906
  (
903
907
  "htm.htm".to_string(),
904
908
  "<!-- <block> -->\n<div>Content</div>\n<!-- </block> -->".to_string(),