blockwatch-cli 0.16.7__tar.gz → 0.17.0__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 (328) hide show
  1. blockwatch_cli-0.17.0/.github/FUNDING.yml +15 -0
  2. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.markdownlint-cli2.yaml +4 -0
  3. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/AGENTS.md +7 -5
  4. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/CHANGELOG.md +52 -0
  5. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/CLAUDE.md +7 -5
  6. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/Cargo.lock +51 -16
  7. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/Cargo.toml +3 -2
  8. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/PKG-INFO +1 -1
  9. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/README.md +7 -6
  10. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/ci.md +2 -2
  11. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/cli.md +3 -3
  12. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/symbols.md +193 -4
  13. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/setup.py +1 -1
  14. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/bash.rs +39 -17
  15. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/c.rs +115 -36
  16. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/c_sharp.rs +44 -32
  17. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/cmake.rs +10 -11
  18. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/cpp.rs +30 -2
  19. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/css.rs +3 -15
  20. blockwatch_cli-0.17.0/src/language_parsers/dart.rs +1216 -0
  21. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/dockerfile.rs +7 -1
  22. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/elixir.rs +7 -1
  23. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/go.rs +19 -2
  24. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/graphql.rs +7 -1
  25. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/groovy.rs +17 -4
  26. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/hcl.rs +25 -2
  27. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/java.rs +25 -32
  28. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/javascript.rs +13 -1
  29. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/json.rs +27 -2
  30. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/kotlin.rs +21 -6
  31. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/lean.rs +82 -58
  32. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/lua.rs +23 -18
  33. blockwatch_cli-0.17.0/src/language_parsers/makefile.rs +1016 -0
  34. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/markdown.rs +53 -24
  35. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/mdx.rs +40 -17
  36. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/mod.rs +125 -214
  37. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/nix.rs +8 -3
  38. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/ocaml.rs +10 -0
  39. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/php.rs +106 -76
  40. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/proto.rs +55 -30
  41. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/python.rs +16 -1
  42. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/ruby.rs +13 -8
  43. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/rust.rs +12 -23
  44. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/scala.rs +29 -9
  45. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/sql.rs +9 -3
  46. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/starlark.rs +7 -1
  47. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/swift.rs +31 -20
  48. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/toml.rs +28 -16
  49. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/tsx.rs +13 -1
  50. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/typescript.rs +89 -56
  51. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/xml.rs +41 -30
  52. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/yaml.rs +45 -29
  53. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/skill.md +45 -4
  54. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/symbols/code.rs +48 -13
  55. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/symbol_references.rs +14 -0
  56. blockwatch_cli-0.17.0/tests/testdata/symbol_references/Makefile +1 -0
  57. blockwatch_cli-0.17.0/tests/testdata/symbol_references/dart_source.rs +3 -0
  58. blockwatch_cli-0.17.0/tests/testdata/symbol_references/dart_target.dart +3 -0
  59. blockwatch_cli-0.17.0/tests/testdata/symbol_references/makefile_source.rs +3 -0
  60. blockwatch_cli-0.16.7/src/language_parsers/dart.rs +0 -79
  61. blockwatch_cli-0.16.7/src/language_parsers/makefile.rs +0 -61
  62. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.agents/.claude-plugin/plugin.json +0 -0
  63. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.agents/skills/blockwatch/SKILL.md +0 -0
  64. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.claude-plugin/marketplace.json +0 -0
  65. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/dependabot.yml +0 -0
  66. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/workflows/blockwatch.yml +0 -0
  67. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/workflows/codeql.yml +0 -0
  68. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/workflows/markdownlint.yml +0 -0
  69. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/workflows/pypi.yml +0 -0
  70. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/workflows/release.yml +0 -0
  71. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/workflows/rust.yml +0 -0
  72. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.github/workflows/trusted-checks.yml +0 -0
  73. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.gitignore +0 -0
  74. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.pre-commit-config.yaml +0 -0
  75. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/.pre-commit-hooks.yaml +0 -0
  76. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/LICENSE +0 -0
  77. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/SECURITY.md +0 -0
  78. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/blockwatch.toml +0 -0
  79. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/clippy.toml +0 -0
  80. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/codecov.yml +0 -0
  81. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/demo.gif +0 -0
  82. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/dist-workspace.toml +0 -0
  83. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/agents.md +0 -0
  84. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/README.md +0 -0
  85. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/affects.md +0 -0
  86. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/check-ai.md +0 -0
  87. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/check-lua.md +0 -0
  88. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/keep-sorted.md +0 -0
  89. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/keep-unique.md +0 -0
  90. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/line-count.md +0 -0
  91. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/line-pattern.md +0 -0
  92. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/docs/validators/same-as.md +0 -0
  93. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/pypi/pyproject.toml +0 -0
  94. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/pyproject.toml +0 -0
  95. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/release.toml +0 -0
  96. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/scripts/check_language_count.lua +0 -0
  97. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/scripts/check_latest_gpt_nano_model.lua +0 -0
  98. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/block_parser.rs +0 -0
  99. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/blocks.rs +0 -0
  100. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/cli.rs +0 -0
  101. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/config.rs +0 -0
  102. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/diff_parser.rs +0 -0
  103. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/explain.rs +0 -0
  104. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/flags.rs +0 -0
  105. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/fs.rs +0 -0
  106. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/language_parsers/html.rs +0 -0
  107. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/lib.rs +0 -0
  108. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/main.rs +0 -0
  109. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/path_arguments.rs +0 -0
  110. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/paths_glob.rs +0 -0
  111. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/repo_path.rs +0 -0
  112. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/report.rs +0 -0
  113. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/sarif.rs +0 -0
  114. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/scan.rs +0 -0
  115. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/settings.rs +0 -0
  116. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/symbol_path.rs +0 -0
  117. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/symbols/mod.rs +0 -0
  118. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/tag_parser.rs +0 -0
  119. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/target_reference.rs +0 -0
  120. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/affects.rs +0 -0
  121. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/check_ai.rs +0 -0
  122. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/check_lua.rs +0 -0
  123. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/keep_sorted.rs +0 -0
  124. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/keep_unique.rs +0 -0
  125. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/line_count.rs +0 -0
  126. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/line_pattern.rs +0 -0
  127. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/mod.rs +0 -0
  128. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/validators/same_as.rs +0 -0
  129. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/violation_address.rs +0 -0
  130. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/src/virtual_blocks.rs +0 -0
  131. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/affects.rs +0 -0
  132. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/check_ai.rs +0 -0
  133. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/check_lua.rs +0 -0
  134. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/common/empty.toml +0 -0
  135. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/common/mod.rs +0 -0
  136. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/config.rs +0 -0
  137. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/encoding.rs +0 -0
  138. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/explain.rs +0 -0
  139. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/general.rs +0 -0
  140. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/keep_sorted.rs +0 -0
  141. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/keep_unique.rs +0 -0
  142. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/line_count.rs +0 -0
  143. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/line_pattern.rs +0 -0
  144. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/list.rs +0 -0
  145. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/path_arguments.rs +0 -0
  146. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/repository_root.rs +0 -0
  147. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/same_as.rs +0 -0
  148. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/sarif.rs +0 -0
  149. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/skill.rs +0 -0
  150. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/suppressions.rs +0 -0
  151. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/cross_file_source.rs +0 -0
  152. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/cross_file_target.md +0 -0
  153. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/custom_ext_source.javascript +0 -0
  154. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/custom_ext_target.javascript +0 -0
  155. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/dangling.md +0 -0
  156. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/missing_symbol.rs +0 -0
  157. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/more_added_than_deleted.py +0 -0
  158. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/multiline_tag_source.rs +0 -0
  159. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/multiline_tag_target.rs +0 -0
  160. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/nested_mapping_source.rs +0 -0
  161. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/nested_mapping_target.yaml +0 -0
  162. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/sibling.md +0 -0
  163. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/symbol_source.rs +0 -0
  164. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/symbol_target.json +0 -0
  165. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/table_source.rs +0 -0
  166. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/table_target.toml +0 -0
  167. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/tag_and_content_source.ts +0 -0
  168. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/tag_and_content_target.ts +0 -0
  169. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/whole_file_source.rs +0 -0
  170. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/affects/whole_file_target.json +0 -0
  171. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_ai/two_blocks.py +0 -0
  172. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/affects.lua +0 -0
  173. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/affects.py +0 -0
  174. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/affects_drift.py +0 -0
  175. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/blocking_io.lua +0 -0
  176. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/blocking_io.py +0 -0
  177. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/echo.lua +0 -0
  178. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/fail.lua +0 -0
  179. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/mode.py +0 -0
  180. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/os.lua +0 -0
  181. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/pathfmt/report_path.lua +0 -0
  182. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/pathfmt/source.py +0 -0
  183. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/pattern.py +0 -0
  184. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/pattern_many_matches.py +0 -0
  185. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/pattern_no_match.py +0 -0
  186. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/success.lua +0 -0
  187. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/check_lua/success_and_failure.py +0 -0
  188. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/config/glob_target/config.toml +0 -0
  189. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/config/glob_target/package.json +0 -0
  190. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/config/glob_target/plugins/blue/package.json +0 -0
  191. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/config/glob_target/plugins/green/package.json +0 -0
  192. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/config/glob_target/plugins/red/package.json +0 -0
  193. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/explain/a.py +0 -0
  194. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/explain/check.lua +0 -0
  195. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/block_selection.py +0 -0
  196. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/custom_file_extension.javascript +0 -0
  197. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/custom_file_extension.python +0 -0
  198. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/disable_enable.py +0 -0
  199. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/paths/invalid.py +0 -0
  200. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/paths/subdir/nested_invalid.py +0 -0
  201. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/paths/valid.py +0 -0
  202. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/general/severity.py +0 -0
  203. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/hidden/.github/workflows/ci.yml +0 -0
  204. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/keep_sorted/orderings.py +0 -0
  205. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/keep_unique/basic_and_pattern.py +0 -0
  206. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/line_count/equality_and_greater_than.py +0 -0
  207. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/line_pattern/forbidden_text.py +0 -0
  208. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/line_pattern/hex_and_word_patterns.py +0 -0
  209. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/list/.hg/.gitkeep +0 -0
  210. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/list/a.py +0 -0
  211. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/list/b.py +0 -0
  212. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/positions/unicode_columns.py +0 -0
  213. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/custom_ext_source.javascript +0 -0
  214. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/custom_ext_target.javascript +0 -0
  215. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/package.json +0 -0
  216. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/paths/alpha/item.txt +0 -0
  217. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/paths/beta/item.txt +0 -0
  218. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/paths_and_block_source.md +0 -0
  219. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/paths_source.md +0 -0
  220. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/sibling.rs +0 -0
  221. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/source.rs +0 -0
  222. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/split_table_source.rs +0 -0
  223. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/split_table_target.toml +0 -0
  224. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/symbol_mismatch_source.rs +0 -0
  225. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/symbol_source.rs +0 -0
  226. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/target.md +0 -0
  227. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/whole_file_mismatch_source.rs +0 -0
  228. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/whole_file_source.rs +0 -0
  229. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/same_as/whole_file_target.json +0 -0
  230. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/sarif/advisory.py +0 -0
  231. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/sarif/clean.py +0 -0
  232. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/sarif/sorted.py +0 -0
  233. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/sarif/unnamed.py +0 -0
  234. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/commit_msg.txt +0 -0
  235. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/commit_msg_gone_a.txt +0 -0
  236. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/commit_msg_gone_b.txt +0 -0
  237. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/commit_msg_lowercase_trailer.txt +0 -0
  238. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/commit_msg_malformed.txt +0 -0
  239. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/commit_msg_with_noise.txt +0 -0
  240. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/dangling.py +0 -0
  241. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/sorted.py +0 -0
  242. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/symbol.py +0 -0
  243. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/symbol_target.json +0 -0
  244. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/two_rules.py +0 -0
  245. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/suppressions/unnamed.py +0 -0
  246. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/bzl_source.rs +0 -0
  247. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/bzl_target.bzl +0 -0
  248. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/c_source.rs +0 -0
  249. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/c_target.c +0 -0
  250. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/cpp_source.rs +0 -0
  251. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/cpp_target.cpp +0 -0
  252. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/cs_source.rs +0 -0
  253. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/cs_target.cs +0 -0
  254. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/csproj_source.rs +0 -0
  255. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/csproj_target.csproj +0 -0
  256. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/escapes_source.rs +0 -0
  257. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/escapes_target.json +0 -0
  258. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/filter_source.rs +0 -0
  259. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/filter_target.yaml +0 -0
  260. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/go_source.rs +0 -0
  261. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/go_target.go +0 -0
  262. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/h_source.rs +0 -0
  263. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/h_target.h +0 -0
  264. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/hcl_source.rs +0 -0
  265. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/hcl_target.hcl +0 -0
  266. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/java_source.rs +0 -0
  267. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/java_target.java +0 -0
  268. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/js_source.rs +0 -0
  269. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/js_target.js +0 -0
  270. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/json_source.rs +0 -0
  271. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/json_target.json +0 -0
  272. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/jsonc_source.rs +0 -0
  273. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/jsonc_target.jsonc +0 -0
  274. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/kt_source.rs +0 -0
  275. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/kt_target.kt +0 -0
  276. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/kts_source.rs +0 -0
  277. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/kts_target.kts +0 -0
  278. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/markdown_source.rs +0 -0
  279. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/markdown_target.markdown +0 -0
  280. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/md_source.rs +0 -0
  281. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/md_target.md +0 -0
  282. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/mdx_source.rs +0 -0
  283. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/mdx_target.mdx +0 -0
  284. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/mixed_list_source.rs +0 -0
  285. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/mixed_list_target.json +0 -0
  286. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/nomad_source.rs +0 -0
  287. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/nomad_target.nomad +0 -0
  288. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/php_source.rs +0 -0
  289. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/php_target.php +0 -0
  290. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/phtml_source.rs +0 -0
  291. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/phtml_target.phtml +0 -0
  292. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/proto_source.rs +0 -0
  293. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/proto_target.proto +0 -0
  294. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/py_source.rs +0 -0
  295. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/py_target.py +0 -0
  296. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/rs_source.rs +0 -0
  297. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/rs_target.rs +0 -0
  298. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/sh_source.rs +0 -0
  299. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/sh_target.sh +0 -0
  300. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/swift_source.rs +0 -0
  301. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/swift_target.swift +0 -0
  302. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tf_source.rs +0 -0
  303. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tf_target.tf +0 -0
  304. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tfvars_source.rs +0 -0
  305. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tfvars_target.tfvars +0 -0
  306. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tofu_source.rs +0 -0
  307. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tofu_target.tofu +0 -0
  308. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/toml_source.rs +0 -0
  309. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/toml_target.toml +0 -0
  310. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/ts_source.rs +0 -0
  311. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/ts_target.ts +0 -0
  312. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tsx_source.rs +0 -0
  313. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/tsx_target.tsx +0 -0
  314. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/xml_source.rs +0 -0
  315. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/xml_target.xml +0 -0
  316. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/yaml_source.rs +0 -0
  317. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/yaml_target.yaml +0 -0
  318. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/yml_source.rs +0 -0
  319. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/symbol_references/yml_target.yml +0 -0
  320. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/affects/pair.py +0 -0
  321. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/clean/counted.py +0 -0
  322. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/clean/noop.py +0 -0
  323. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/clean/notes.txt +0 -0
  324. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/clean/sorted.py +0 -0
  325. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/diff/two_blocks.py +0 -0
  326. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/failing/unsorted.py +0 -0
  327. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/testdata/verbosity/mixed/both_kinds.py +0 -0
  328. {blockwatch_cli-0.16.7 → blockwatch_cli-0.17.0}/tests/verbosity.rs +0 -0
@@ -0,0 +1,15 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: mennanov # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: # Replace with a single Ko-fi username
7
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12
+ polar: # Replace with a single Polar username
13
+ buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
14
+ thanks_dev: # Replace with a single thanks.dev username
15
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
@@ -21,6 +21,10 @@ config:
21
21
  # A shell command or a table row cannot be wrapped without changing what it means.
22
22
  code_blocks: false
23
23
  tables: false
24
+ MD010:
25
+ # A recipe line in a Makefile must start with a tab, so an example with spaces would not work.
26
+ ignore_code_languages:
27
+ - make
24
28
  MD024:
25
29
  # CHANGELOG.md follows Keep a Changelog, where every release repeats "Added" and "Fixed".
26
30
  # Requiring uniqueness only among headings sharing a parent still catches a real duplicate.
@@ -226,11 +226,11 @@ The main modules:
226
226
  (`b/src/main.rs`), a path found in the walk and a `file:name` attribute all become a `RepoPath`. So the same file is
227
227
  always the same map key.
228
228
  - `src/language_parsers/` — one parser for each language, most of them a tree-sitter grammar. Markdown and MDX use
229
- the `markdown` crate, and Lean has its own scanner. Each language has a `parser()` that returns a
230
- `LanguageParser`, which knows which syntax nodes are comments. `src/block_parser.rs` turns those comments into
231
- blocks. `language_parsers()` in `language_parsers/mod.rs` returns `LanguageParsers`: the parser of each extension.
232
- Its `parser_for` picks the parser of a file, using the settings' extension mappings too. **To add a language, add a
233
- module here and register it in that function.**
229
+ the `markdown` crate, Makefile uses the `makefile-lossless` crate, and Lean has its own scanner. Each language has
230
+ a `parser()` that returns a `LanguageParser`, which knows which syntax nodes are comments. `src/block_parser.rs`
231
+ turns those comments into blocks. `language_parsers()` in `language_parsers/mod.rs` returns `LanguageParsers`: the
232
+ parser of each extension. Its `parser_for` picks the parser of a file, using the settings' extension mappings too.
233
+ **To add a language, add a module here and register it in that function.**
234
234
 
235
235
  Some languages also have symbols. Such a language has a `SymbolsParser`, which its `parser()` passes to
236
236
  `.with_symbols(...)`:
@@ -239,6 +239,8 @@ The main modules:
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
241
  - Markdown finds its sections with the `markdown` crate, the same parser that finds its comments.
242
+ - Makefile finds its symbols with `makefile-lossless`, the same crate that finds its comments. The crate is pinned to
243
+ one version. Its known bugs are listed in `docs/symbols.md`, not worked around.
242
244
 
243
245
  Each language's tests list every symbol it finds. When you give a language symbols, also document its paths in
244
246
  `docs/symbols.md` and in the "Symbols" section of the skill, `src/skill.md`. A test in `language_parsers/mod.rs` and the
@@ -12,6 +12,58 @@ 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.17.0] - 2026-11-06
16
+
17
+ ### Added
18
+
19
+ - Symbols in Dart files (`.dart`). `config.dart#/Invoice/maxLines` points at a field of the class `Invoice`, and
20
+ `#/kApiVersion` at a variable at the top of the file. Each type is a symbol, and so is each field, method, getter,
21
+ setter, named constructor and enum value in it. A named extension's members sit under its name. See
22
+ [Dart](docs/symbols.md#dart).
23
+
24
+ ### Changed
25
+
26
+ - In a tag that wraps over several comment lines, a longer marker such as `##`, `////` or `---` is now blanked whole,
27
+ in every language with `#`, `//` or `--` comments. So an attribute value that goes on to such a line loses the extra
28
+ characters. For example, in Python, a value that goes on to the line `##a` now holds `a` there, not `#a`. The same
29
+ goes for the stars at the start of a line in a `/* */` comment, such as ` ** `.
30
+
31
+ ### Fixed
32
+
33
+ - A tag that wraps over several comment lines is no longer reported as malformed when each line starts with a longer
34
+ marker, such as `///`, `////`, `//!`, `##`, `---` or Python's `#:`. This works in every language with `//`, `#` or
35
+ `--` comments. In C and C++, it also works with Doxygen's `///<` and `//!<`. In Markdown, a tag can now wrap over
36
+ several `[//]: # (...)` lines too. In a `/* */` or OCaml `(* *)` comment, it can wrap over lines that start with
37
+ ` ** `.
38
+ - In Bash and zsh files, a comment that starts with `#!` is no longer skipped, unless it is the shebang on the first
39
+ line. Before, a tag in such a comment was ignored.
40
+ - A string value with one of these line ends now reads as its language reads it:
41
+ - In JavaScript and TypeScript, a backslash before U+2028 or U+2029 joins the two lines. Before, the value kept the
42
+ separator.
43
+ - In a JavaScript or TypeScript template, a lone `\r` line end is `\n`. Before, the value kept the `\r`.
44
+ - In a C++ raw string, a `\r\n` line end is `\n`. Before, the value kept the `\r`.
45
+
46
+ ## [0.16.8] - 2026-11-05
47
+
48
+ ### Added
49
+
50
+ - Symbols in Makefiles (`Makefile`, `GNUmakefile`, `makefile`, `.mk` and `.mak`). `Makefile#/GO_VERSION` points at
51
+ the value of a variable, and `#/build` at the rule of a target. A value is read as GNU make reads it, without its
52
+ inline comment, and is never expanded. See [Makefile](docs/symbols.md#makefile).
53
+
54
+ ### Fixed
55
+
56
+ - Some block tags in Makefile comments were not found, such as one after an assignment, as in `VERSION := 1.2 # ...`,
57
+ or one below a `(` that is not part of a reference. Now Makefiles are read with the `makefile-lossless` crate. A
58
+ comment that ends in `\` takes in the next line. A `#` after a rule's `;`, after a backslash, as in `\#`, or inside
59
+ `$(...)` doesn't start a comment.
60
+
61
+ ### Changed
62
+
63
+ - A block tag in a Makefile is now found on a recipe line whose first character after the tab is `#`, and after any
64
+ `#` in a `define` body. Make reads no comment there, so these tags were not found before. See the known limits in
65
+ [Makefile](docs/symbols.md#makefile).
66
+
15
67
  ## [0.16.7] - 2026-11-04
16
68
 
17
69
  ### Added
@@ -226,11 +226,11 @@ The main modules:
226
226
  (`b/src/main.rs`), a path found in the walk and a `file:name` attribute all become a `RepoPath`. So the same file is
227
227
  always the same map key.
228
228
  - `src/language_parsers/` — one parser for each language, most of them a tree-sitter grammar. Markdown and MDX use
229
- the `markdown` crate, and Lean has its own scanner. Each language has a `parser()` that returns a
230
- `LanguageParser`, which knows which syntax nodes are comments. `src/block_parser.rs` turns those comments into
231
- blocks. `language_parsers()` in `language_parsers/mod.rs` returns `LanguageParsers`: the parser of each extension.
232
- Its `parser_for` picks the parser of a file, using the settings' extension mappings too. **To add a language, add a
233
- module here and register it in that function.**
229
+ the `markdown` crate, Makefile uses the `makefile-lossless` crate, and Lean has its own scanner. Each language has
230
+ a `parser()` that returns a `LanguageParser`, which knows which syntax nodes are comments. `src/block_parser.rs`
231
+ turns those comments into blocks. `language_parsers()` in `language_parsers/mod.rs` returns `LanguageParsers`: the
232
+ parser of each extension. Its `parser_for` picks the parser of a file, using the settings' extension mappings too.
233
+ **To add a language, add a module here and register it in that function.**
234
234
 
235
235
  Some languages also have symbols. Such a language has a `SymbolsParser`, which its `parser()` passes to
236
236
  `.with_symbols(...)`:
@@ -239,6 +239,8 @@ The main modules:
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
241
  - Markdown finds its sections with the `markdown` crate, the same parser that finds its comments.
242
+ - Makefile finds its symbols with `makefile-lossless`, the same crate that finds its comments. The crate is pinned to
243
+ one version. Its known bugs are listed in `docs/symbols.md`, not worked around.
242
244
 
243
245
  Each language's tests list every symbol it finds. When you give a language symbols, also document its paths in
244
246
  `docs/symbols.md` and in the "Symbols" section of the skill, `src/skill.md`. A test in `language_parsers/mod.rs` and the
@@ -274,7 +274,7 @@ checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
274
274
 
275
275
  [[package]]
276
276
  name = "blockwatch"
277
- version = "0.16.7"
277
+ version = "0.17.0"
278
278
  dependencies = [
279
279
  "anyhow",
280
280
  "assert-json-diff",
@@ -289,6 +289,7 @@ dependencies = [
289
289
  "heck",
290
290
  "ignore",
291
291
  "libc",
292
+ "makefile-lossless",
292
293
  "markdown",
293
294
  "mlua",
294
295
  "percent-encoding",
@@ -326,7 +327,6 @@ dependencies = [
326
327
  "tree-sitter-json",
327
328
  "tree-sitter-kotlin-ng",
328
329
  "tree-sitter-lua",
329
- "tree-sitter-make",
330
330
  "tree-sitter-nix",
331
331
  "tree-sitter-ocaml",
332
332
  "tree-sitter-php",
@@ -491,6 +491,12 @@ version = "1.0.0"
491
491
  source = "registry+https://github.com/rust-lang/crates.io-index"
492
492
  checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48"
493
493
 
494
+ [[package]]
495
+ name = "countme"
496
+ version = "3.0.1"
497
+ source = "registry+https://github.com/rust-lang/crates.io-index"
498
+ checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636"
499
+
494
500
  [[package]]
495
501
  name = "cpufeatures"
496
502
  version = "0.3.1"
@@ -861,6 +867,12 @@ dependencies = [
861
867
  "regex-syntax",
862
868
  ]
863
869
 
870
+ [[package]]
871
+ name = "hashbrown"
872
+ version = "0.14.5"
873
+ source = "registry+https://github.com/rust-lang/crates.io-index"
874
+ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
875
+
864
876
  [[package]]
865
877
  name = "hashbrown"
866
878
  version = "0.17.1"
@@ -1119,7 +1131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1119
1131
  checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
1120
1132
  dependencies = [
1121
1133
  "equivalent",
1122
- "hashbrown",
1134
+ "hashbrown 0.17.1",
1123
1135
  ]
1124
1136
 
1125
1137
  [[package]]
@@ -1274,6 +1286,15 @@ dependencies = [
1274
1286
  "which",
1275
1287
  ]
1276
1288
 
1289
+ [[package]]
1290
+ name = "makefile-lossless"
1291
+ version = "0.4.8"
1292
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1293
+ checksum = "25a80f1e6bd18fe790d69cc1dda3eedaaa75bbd052a9734a137017056b5e1fa7"
1294
+ dependencies = [
1295
+ "rowan",
1296
+ ]
1297
+
1277
1298
  [[package]]
1278
1299
  name = "markdown"
1279
1300
  version = "1.0.0"
@@ -1341,7 +1362,7 @@ dependencies = [
1341
1362
  "mlua-sys",
1342
1363
  "num-traits",
1343
1364
  "parking_lot",
1344
- "rustc-hash",
1365
+ "rustc-hash 2.1.3",
1345
1366
  ]
1346
1367
 
1347
1368
  [[package]]
@@ -1535,7 +1556,7 @@ dependencies = [
1535
1556
  "pin-project-lite",
1536
1557
  "quinn-proto",
1537
1558
  "quinn-udp",
1538
- "rustc-hash",
1559
+ "rustc-hash 2.1.3",
1539
1560
  "rustls",
1540
1561
  "socket2",
1541
1562
  "thiserror",
@@ -1557,7 +1578,7 @@ dependencies = [
1557
1578
  "rand 0.10.3",
1558
1579
  "rand_pcg",
1559
1580
  "ring",
1560
- "rustc-hash",
1581
+ "rustc-hash 2.1.3",
1561
1582
  "rustls",
1562
1583
  "rustls-pki-types",
1563
1584
  "slab",
@@ -1751,6 +1772,24 @@ dependencies = [
1751
1772
  "windows-sys 0.52.0",
1752
1773
  ]
1753
1774
 
1775
+ [[package]]
1776
+ name = "rowan"
1777
+ version = "0.16.1"
1778
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1779
+ checksum = "417a3a9f582e349834051b8a10c8d71ca88da4211e4093528e36b9845f6b5f21"
1780
+ dependencies = [
1781
+ "countme",
1782
+ "hashbrown 0.14.5",
1783
+ "rustc-hash 1.1.0",
1784
+ "text-size",
1785
+ ]
1786
+
1787
+ [[package]]
1788
+ name = "rustc-hash"
1789
+ version = "1.1.0"
1790
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1791
+ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
1792
+
1754
1793
  [[package]]
1755
1794
  name = "rustc-hash"
1756
1795
  version = "2.1.3"
@@ -2183,6 +2222,12 @@ version = "0.5.1"
2183
2222
  source = "registry+https://github.com/rust-lang/crates.io-index"
2184
2223
  checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683"
2185
2224
 
2225
+ [[package]]
2226
+ name = "text-size"
2227
+ version = "1.1.1"
2228
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2229
+ checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233"
2230
+
2186
2231
  [[package]]
2187
2232
  name = "thiserror"
2188
2233
  version = "2.0.21"
@@ -2602,16 +2647,6 @@ dependencies = [
2602
2647
  "tree-sitter-language",
2603
2648
  ]
2604
2649
 
2605
- [[package]]
2606
- name = "tree-sitter-make"
2607
- version = "1.1.1"
2608
- source = "registry+https://github.com/rust-lang/crates.io-index"
2609
- checksum = "c5998dc7cbcbdab19fae8aefef982bf2d6544513d8d2e69cc44aec4c63810104"
2610
- dependencies = [
2611
- "cc",
2612
- "tree-sitter-language",
2613
- ]
2614
-
2615
2650
  [[package]]
2616
2651
  name = "tree-sitter-nix"
2617
2652
  version = "0.3.0"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "blockwatch"
3
- version = "0.16.7"
3
+ version = "0.17.0"
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"
@@ -25,6 +25,8 @@ fnv = "1.0"
25
25
  globset = "0.4.18"
26
26
  heck = "0.5"
27
27
  ignore = "0.4"
28
+ # Pinned exactly: a new version can change which symbols and comments a Makefile has.
29
+ makefile-lossless = "=0.4.8"
28
30
  markdown = "1.0.0"
29
31
  mlua = { version = "0.12.0", features = ["lua54", "vendored", "async", "send"] }
30
32
  percent-encoding = "2.3"
@@ -61,7 +63,6 @@ tree-sitter-javascript = "0.25"
61
63
  tree-sitter-json = "0.24.8"
62
64
  tree-sitter-kotlin-ng = "1.1"
63
65
  tree-sitter-lua = "0.5"
64
- tree-sitter-make = "1.1"
65
66
  tree-sitter-nix = "0.3.0"
66
67
  tree-sitter-ocaml = "0.26"
67
68
  tree-sitter-php = "0.25"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blockwatch-cli
3
- Version: 0.16.7
3
+ Version: 0.17.0
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
@@ -90,9 +90,10 @@ Two validators work across files:
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
92
  Markdown file, an element or attribute in an XML file such as `pom.xml` or a `.csproj`, a constant in a Go, C, C++,
93
- Python, Rust, TypeScript, JavaScript, Java, C#, Kotlin, Swift or PHP file, a variable in a shell script, a field in a
94
- Protocol Buffers file, or a value in a Terraform or other HCL file (see [Symbols](docs/symbols.md)). The other
95
- validators check a single block on their own: the things you'd otherwise have to nitpick in code review.
93
+ Python, Rust, TypeScript, JavaScript, Java, C#, Kotlin, Swift, PHP or Dart file, a variable in a shell script or a
94
+ Makefile, a field in a Protocol Buffers file, or a value in a Terraform or other HCL file (see
95
+ [Symbols](docs/symbols.md)). The other validators check a single block on their own: the things you'd otherwise have
96
+ to nitpick in code review.
96
97
 
97
98
  <!-- <block name="available-validators"
98
99
  same-as="src/validators/mod.rs:validator-registry, docs/validators/README.md:validators-index"
@@ -220,7 +221,7 @@ exclusions, and custom extension mappings.
220
221
 
221
222
  ```yaml
222
223
  - repo: https://github.com/mennanov/blockwatch
223
- rev: v0.16.7 # Use latest release
224
+ rev: v0.17.0 # Use latest release
224
225
  hooks:
225
226
  - id: blockwatch
226
227
  ```
@@ -260,7 +261,7 @@ For plain git hooks, local pre-commit setups, and sandboxing untrusted Lua scrip
260
261
  - GraphQL (`.graphql`, `.graphqls`, `.gql`)
261
262
  - Groovy (with `.gradle` and `Jenkinsfile` support)
262
263
  - HCL (Terraform and OpenTofu: `.tf`, `.tfvars`, `.tofu`, `.hcl`; Nomad: `.nomad`)
263
- - HTML (with `.xhtml` support)
264
+ - HTML (with `.xhtml` support; comments inside `<script>` and `<style>` are not read)
264
265
  - JSON (`.json`, `.jsonc`, `.webmanifest`)
265
266
  - Java
266
267
  - JavaScript (with `.mjs` and `.cjs` support)
@@ -272,7 +273,7 @@ For plain git hooks, local pre-commit setups, and sandboxing untrusted Lua scrip
272
273
  - Markdown
273
274
  - Nix
274
275
  - OCaml (`.ml`, `.mli`)
275
- - PHP
276
+ - PHP (comments inside `<script>` and `<style>` are not read)
276
277
  - Protocol Buffers (`.proto`)
277
278
  - Python (with `.pyi` and `.pyw` support)
278
279
  - Ruby (with `Gemfile`, `Rakefile`, `Podfile`, `Brewfile`, `Fastfile`, `Vagrantfile`, `.gemspec`, `.podspec`, `.rake`,
@@ -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.7 # Use latest release
22
+ rev: v0.17.0 # 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.7 # Use latest release
62
+ rev: v0.17.0 # 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.7",
561
- "semanticVersion": "0.16.7",
560
+ "version": "0.17.0",
561
+ "semanticVersion": "0.17.0",
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.7/docs/validators/keep-sorted.md"
568
+ "helpUri": "https://github.com/mennanov/blockwatch/blob/v0.17.0/docs/validators/keep-sorted.md"
569
569
  }
570
570
  ]
571
571
  }
@@ -46,6 +46,8 @@ declares, instead of tags in a comment.
46
46
  | HCL (Terraform) | `.tf`, `.tofu`, `.tfvars`, `.hcl`, `.nomad` | [HCL](#hcl) |
47
47
  | PHP | `.php`, `.phtml` | [PHP](#php) |
48
48
  | Shell | `.sh`, `.bash`, `.bashrc`, `.bash_profile`, `.envrc` | [Shell](#shell) |
49
+ | Makefile | `Makefile`, `GNUmakefile`, `makefile`, `.mk`, `.mak` | [Makefile](#makefile) |
50
+ | Dart | `.dart` | [Dart](#dart) |
49
51
 
50
52
  <!-- </block> -->
51
53
 
@@ -326,8 +328,8 @@ is `@` and its name, under its element:
326
328
  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
327
329
  `#/NAME`.
328
330
  With `const MaxPorts = 8` in `consts.go`, `consts.go#/MaxPorts` points at `8`. In Java, C#, Kotlin, Swift, Protocol
329
- Buffers and PHP, the members of a type are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`. In
330
- HCL, each block, attribute and object key is a symbol: `main.tf#/variable/region/default`.
331
+ Buffers, PHP and Dart, the members of a type are symbols too, under the type's name: `Config.java#/Config/MAX_PORTS`.
332
+ In HCL, each block, attribute and object key is a symbol: `main.tf#/variable/region/default`.
331
333
 
332
334
  - **A value is the initializer as written.** blockwatch never works it out: `20 * 1024 * 1024` stays as it is, and so
333
335
  does `0x10`. Use `same-as-pattern` to take the part you need.
@@ -342,7 +344,7 @@ HCL, each block, attribute and object key is a symbol: `main.tf#/variable/region
342
344
  where the error is.
343
345
  - **A path to a string that blockwatch can't decode stops the run.** Other paths in the file still resolve.
344
346
  - **Members are not symbols yet**, such as a method or a field, except in Java, C#, Kotlin, Swift, Protocol Buffers,
345
- HCL and PHP.
347
+ HCL, PHP and Dart.
346
348
 
347
349
  <!-- </block> -->
348
350
 
@@ -423,7 +425,7 @@ int helper(void) { return 0; }
423
425
  - **Prototypes and `extern` variables are not symbols.** The definition is.
424
426
  - **`template <...>` and `extern "C"` are part of the definition.** The contents of `extern "C" { ... }` are top-level.
425
427
  - **Strings follow C's escapes, and strings written one after the other are joined.** A raw string, `R"(...)"`, is its
426
- text. `L`, `u` and `U` strings and character literals stay as written.
428
+ text, with each `\r\n` line end read as `\n`. `L`, `u` and `U` strings and character literals stay as written.
427
429
  - **Namespaces, class members and names such as `Foo::bar` are not symbols yet.**
428
430
 
429
431
  <!-- </block> -->
@@ -1083,6 +1085,193 @@ done
1083
1085
 
1084
1086
  <!-- </block> -->
1085
1087
 
1088
+ ## Makefile
1089
+
1090
+ <!-- <block name="makefile-paths"> -->
1091
+
1092
+ ```make
1093
+ GO_VERSION := 1.22.5
1094
+ VERSION ?= $(shell git describe --tags)
1095
+ export IMAGE = ghcr.io/acme/app:$(VERSION)
1096
+ LINT := v2.10.1 # keep in sync with CI
1097
+ TARGETS = linux \
1098
+ darwin
1099
+ CFLAGS += -O2
1100
+
1101
+ ifeq ($(shell uname),Darwin)
1102
+ SED = gsed
1103
+ else
1104
+ SED = sed
1105
+ endif
1106
+
1107
+ define BANNER
1108
+ Build $(VERSION)
1109
+ endef
1110
+
1111
+ build: deps
1112
+ go build ./...
1113
+
1114
+ bin/app: $(SRC)
1115
+ go build -o $@ .
1116
+
1117
+ %.o: %.c
1118
+ $(CC) -c $<
1119
+
1120
+ .PHONY: build
1121
+ ```
1122
+
1123
+ | Path | Points at |
1124
+ |----------------|---------------------------------------------------|
1125
+ | `#/GO_VERSION` | `1.22.5` |
1126
+ | `#/VERSION` | `$(shell git describe --tags)`, as written |
1127
+ | `#/IMAGE` | `ghcr.io/acme/app:$(VERSION)`, as written |
1128
+ | `#/LINT` | `v2.10.1`, without the comment |
1129
+ | `#/TARGETS` | `linux darwin` |
1130
+ | `#/CFLAGS` | not found, as `+=` adds to a name |
1131
+ | `#/SED` | a violation, as both branches set it |
1132
+ | `#/BANNER` | `Build $(VERSION)` |
1133
+ | `#/build` | the whole rule: the target line and the recipe |
1134
+ | `#/bin~1app` | the whole rule |
1135
+ | `#/%25.o` | not found, as a pattern rule is not a symbol |
1136
+ | `#/.PHONY` | not found, as a special target is not a symbol |
1137
+
1138
+ - **A variable or a target set at the top or in a conditional is a symbol.** Every branch of `ifeq`, `ifneq`,
1139
+ `ifdef` and `ifndef` counts, at any depth. So a name set in two branches is defined twice. Variables and targets
1140
+ share one set of names, so a variable and a target with the same name are defined twice too.
1141
+ - **Every assignment but `+=` sets a name:** `=`, `:=`, `::=`, `:::=`, `?=` and `!=`, with any of `export`,
1142
+ `override` and `private` in front. So does `define NAME` ... `endef`, with the same keywords and operators.
1143
+ `X ?= 1` next to `X = 2` is defined twice too.
1144
+ - **A target covers its whole rule.** In `a b: c`, both `a` and `b` cover the whole rule. A target in two rules is
1145
+ defined twice, even with `::`. Write each `/` in a target as `~1`: `bin/app` is `#/bin~1app`.
1146
+ - **A rule ends at its last recipe line.** It takes in a conditional below it when a branch of the conditional starts
1147
+ with a recipe line, since make could read that branch. A rule in a branch of a conditional ends with that branch,
1148
+ since a path can't tell which branch make reads.
1149
+ - **A line that starts with a tab is a recipe line only in a rule, as in make.** It is one when the last statement
1150
+ above it, apart from conditionals, comments and other recipe lines, is a rule. Each branch of a conditional starts
1151
+ from the statements above the conditional. After `endif`, a tab line is a recipe line when any branch ended in a
1152
+ rule. Anywhere else, an assignment on such a line sets a name, such as `CC = clang` after a tab, and a `#` on it
1153
+ starts a comment. After `.RECIPEPREFIX = >`, a recipe line starts with `>` in place of a tab.
1154
+ - **These are not symbols:** `NAME += value`, a target-specific variable such as `build: NAME = x`, `export NAME`
1155
+ without a value, a computed name such as `$(PKG)_VERSION = 1` or `$(BIN):`, a pattern rule such as `%.o`, a suffix
1156
+ rule, and a special target. A suffix rule, such as `.c.o`, is the old way to write `%.o: %.c`. Its target is one or
1157
+ two of the suffixes that make knows, such as `.c`, `.o` or `.sh`, and it has no prerequisites. So
1158
+ `.sh: install.txt` is a symbol. A special target is `.` followed by only capital letters and `_`, such as
1159
+ `.PHONY`. So `.venv` and `.coverage` are symbols. The files that `include` reads are not searched. A path into
1160
+ such a file works.
1161
+ - **A value is read as GNU make reads it, but it is never expanded:**
1162
+ - A `#` starts a comment, which is not part of the value. `\#` gives `#`.
1163
+ - A `\` at the end of a line joins the next line, with one space between them. The white space after the operator
1164
+ is left out, even when the value starts on the next line, as in `SRCS = \`.
1165
+ - `$(...)`, `${...}` and `$$` stay as written, with any `#` in them.
1166
+ - The white space at the end is left out. GNU make keeps it, but a `same-as` check would fail on spaces no one
1167
+ can see.
1168
+ - `X != cmd` gives `cmd`. The command is not run.
1169
+ - A `define` body keeps its comments and its `\#`, as make does.
1170
+ - `X =` gives the empty string.
1171
+ - A carriage return before a line feed is left out, as make does.
1172
+ - **A line that make joins to a statement is part of it.** So it sets no name:
1173
+ - After a comment that ends in `\`, the next line is part of the comment.
1174
+ - In `A = a$\` with `B = 1` on the next line, `#/A` gives `a$ B = 1`, and `#/B` is not found.
1175
+ - The lines of a `define` body are part of it, up to the `endef` that make matches to it. A `define` inside it
1176
+ needs its own `endef`, and an `endef` after a tab doesn't count.
1177
+ - **BSD make's own lines, such as `.if` and `.include`, set nothing.** An assignment between `.if` and `.endif`
1178
+ sets its name, as anywhere else.
1179
+ - **A file that make stops on stops the run:** one with a `define` without `endef`, a conditional without `endif`,
1180
+ an `else` or `endif` outside a conditional, a second `else` in one conditional, or an `ifeq` without its arguments.
1181
+ The message shows the line. For a missing `endif`, that is the end of the file, as in make's own message.
1182
+
1183
+ <!-- <block name="makefile-nesting"> -->
1184
+
1185
+ - **A file nested more than 128 levels deep stops the run too,** with conditionals or with `$(...)` references.
1186
+ Make reads it, but the `makefile-lossless` crate skips the conditionals nested deeper, so a name set in them would
1187
+ be missing.
1188
+
1189
+ <!-- </block> -->
1190
+
1191
+ - **Known limits.** blockwatch reads Makefiles with the `makefile-lossless` crate, and keeps what it finds:
1192
+ - A rule takes in the comment lines after its last recipe line. In `test:`, a recipe line, then `# Tools.`, `#/test`
1193
+ covers `# Tools.`. So editing that comment counts as a change to `#/test`.
1194
+ - In a `define` body, a line that starts with a tab keeps a `\` at its end, and the line end after it. Make joins
1195
+ the two lines with one space.
1196
+ - A line that make stops on can give targets. `a b = 6` gives `#/a` and `#/b`, and `= 7` gives `#/7`. Make stops
1197
+ on them with "missing separator" and "empty variable name".
1198
+ - A comment is found on a recipe line whose first character after the tab is `#`, and after any `#` in a `define`
1199
+ body. So a block tag there is found. Make passes these lines on as they are, without reading a comment.
1200
+ - In `lint: N = x;y # value`, `# value` is read as a comment. Make keeps it in the value that `N` has for `lint`.
1201
+ - In `D = a$# b`, the `#` and the text after it are read as comments, and `#/D` gives `a$#`. Make reads `$#` as a
1202
+ variable reference, so the line has no comment, and the value is `a$# b`.
1203
+
1204
+ <!-- </block> -->
1205
+
1206
+ ## Dart
1207
+
1208
+ <!-- <block name="dart-paths"> -->
1209
+
1210
+ ```dart
1211
+ const kApiVersion = '2.1.0';
1212
+ int retries = 3, timeout = 30;
1213
+ String get greeting => 'hi';
1214
+
1215
+ class Invoice {
1216
+ static const int maxLines = 20 * 1024;
1217
+ final int id;
1218
+
1219
+ Invoice(this.id);
1220
+ Invoice.draft() : id = 0;
1221
+
1222
+ int get total => _total;
1223
+ set total(int v) => _total = v;
1224
+ void send() {}
1225
+ }
1226
+
1227
+ enum Mode { light, dark('d'); const Mode([this.code]); final String? code; }
1228
+
1229
+ extension StringX on String { bool get isBlank => trim().isEmpty; }
1230
+ ```
1231
+
1232
+ | Path | Points at |
1233
+ |----------------------|---------------------------------------------------|
1234
+ | `#/kApiVersion` | `2.1.0` |
1235
+ | `#/retries` | `3` |
1236
+ | `#/greeting` | `hi` |
1237
+ | `#/Invoice` | the whole class |
1238
+ | `#/Invoice/maxLines` | `20 * 1024` |
1239
+ | `#/Invoice/id` | `final int id;`, as it has no value |
1240
+ | `#/Invoice/draft` | the whole constructor |
1241
+ | `#/Invoice/total` | a violation, as a getter and a setter share it |
1242
+ | `#/Invoice/send` | the whole method |
1243
+ | `#/Mode/dark` | `dark('d')`, as an enum value has no value |
1244
+ | `#/Mode/code` | `final String? code;` |
1245
+ | `#/StringX/isBlank` | `trim().isEmpty` |
1246
+
1247
+ - **Each top-level variable, function, getter, setter, type and type alias is a symbol, and so is each member of a
1248
+ type**: a field, a method, a getter, a setter, a named constructor or an enum value. Classes, mixins, enums,
1249
+ extensions and extension types are types. Dart has no nested types, so a path has at most two names:
1250
+ `#/Mode/dark`.
1251
+ - **A named constructor is a symbol**, as code calls it by its name: `Invoice.draft()` is `#/Invoice/draft`. The
1252
+ unnamed constructor is not, even when it is written `Invoice.new()`. The header of an extension type can declare a
1253
+ named constructor and a field: `extension type Meters.from(double value)` gives `#/Meters/from` and
1254
+ `#/Meters/value`.
1255
+ - **A named extension's members sit under its name**: `#/StringX/isBlank`. Two extensions of `String` in one file
1256
+ don't clash. An extension without a name has no symbols.
1257
+ - **A getter and a setter with one name are defined twice**, and so are a named constructor and a field with one
1258
+ name, such as `Button.disabled()` and `disabled`. Wrap the one you mean in a block instead.
1259
+ - **A variable's value is its initializer, and a getter's is the `v` of `=> v`.** A getter with a block body has no
1260
+ value, and neither has a function, a method or a constructor.
1261
+ - **Annotations are part of a definition. Doc comments are not.** In `int a = 1, b = 2;`, each name covers only its
1262
+ own part.
1263
+ - **The unnamed constructor, operators, `external` declarations, `library`, `import` and `part` directives, local
1264
+ declarations and closures are not symbols.** A file with `part of` has its own symbols.
1265
+ - **Strings follow Dart's escapes.** `'caf\u{e9}'` is `café`. Adjacent strings, such as `'a' "b"`, are joined. A raw
1266
+ string, such as `r'C:\new'`, has no escapes. A `'''` or `"""` string loses a first line that holds only spaces and
1267
+ tabs. Each line end in a string is a line feed, unless a backslash comes before it. A string with `$name` or
1268
+ `${...}` in any part stays as written. A path to a string that Dart rejects, such as `'\u{110000}'`, or to half of a
1269
+ character, such as `'\u{D800}'`, stops the run.
1270
+ - **A syntax error stops the run for the member that holds it, and for the type around it.** The other members still
1271
+ resolve.
1272
+
1273
+ <!-- </block> -->
1274
+
1086
1275
  ---
1087
1276
 
1088
1277
  [← 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.7'],
9
+ install_requires=['blockwatch-cli==0.17.0'],
10
10
  # </block>
11
11
  # Without it, setuptools takes the directories under src/ for Python packages.
12
12
  packages=[],