dirsql 0.4.106__tar.gz → 0.4.107__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 (423) hide show
  1. {dirsql-0.4.106 → dirsql-0.4.107}/Cargo.lock +2 -2
  2. {dirsql-0.4.106 → dirsql-0.4.107}/PKG-INFO +1 -1
  3. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/react-to-changes.md +2 -1
  4. {dirsql-0.4.106/packages/rust → dirsql-0.4.107}/docs/reference/http-api.md +1 -1
  5. {dirsql-0.4.106 → dirsql-0.4.107}/docs/reference/sdk.md +4 -0
  6. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/Cargo.toml +1 -1
  7. dirsql-0.4.107/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +1 -0
  8. {dirsql-0.4.106/packages/rust → dirsql-0.4.107/packages/python}/docs/howto/react-to-changes.md +2 -1
  9. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/reference/http-api.md +1 -1
  10. {dirsql-0.4.106/packages/rust → dirsql-0.4.107/packages/python}/docs/reference/sdk.md +4 -0
  11. dirsql-0.4.107/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +7 -0
  12. dirsql-0.4.107/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +23 -0
  13. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/Cargo.toml +1 -1
  14. {dirsql-0.4.106/packages/python → dirsql-0.4.107/packages/rust}/docs/howto/react-to-changes.md +2 -1
  15. {dirsql-0.4.106 → dirsql-0.4.107/packages/rust}/docs/reference/http-api.md +1 -1
  16. {dirsql-0.4.106/packages/python → dirsql-0.4.107/packages/rust}/docs/reference/sdk.md +4 -0
  17. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/server.rs +25 -3
  18. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/lib.rs +82 -42
  19. {dirsql-0.4.106 → dirsql-0.4.107}/Cargo.toml +0 -0
  20. {dirsql-0.4.106 → dirsql-0.4.107}/README.md +0 -0
  21. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/__init__.py +0 -0
  22. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/_async.py +0 -0
  23. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/_dirsql.pyi +0 -0
  24. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/__init__.py +0 -0
  25. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/discover_plugins/__init__.py +0 -0
  26. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  27. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  28. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  29. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  30. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/main.py +0 -0
  31. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/cli/resolve_config_extensions.py +0 -0
  32. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/plan_entry_path.py +0 -0
  33. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/py.typed +0 -0
  34. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/read_config.py +0 -0
  35. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/resolve_configs_extension_specs.py +0 -0
  36. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/resolve_extension.py +0 -0
  37. {dirsql-0.4.106 → dirsql-0.4.107}/dirsql/resolve_package.py +0 -0
  38. {dirsql-0.4.106 → dirsql-0.4.107}/docs/.claude/CLAUDE.md +0 -0
  39. {dirsql-0.4.106 → dirsql-0.4.107}/docs/.vitepress/config.ts +0 -0
  40. {dirsql-0.4.106 → dirsql-0.4.107}/docs/.vitepress/theme/index.ts +0 -0
  41. {dirsql-0.4.106 → dirsql-0.4.107}/docs/.vitepress/theme/lang.ts +0 -0
  42. {dirsql-0.4.106 → dirsql-0.4.107}/docs/AGENTS.md +0 -0
  43. {dirsql-0.4.106 → dirsql-0.4.107}/docs/context/.gitattributes +0 -0
  44. {dirsql-0.4.106 → dirsql-0.4.107}/docs/context/recipes.md +0 -0
  45. {dirsql-0.4.106 → dirsql-0.4.107}/docs/context/troubleshooting.md +0 -0
  46. {dirsql-0.4.106 → dirsql-0.4.107}/docs/context/usage.md +0 -0
  47. {dirsql-0.4.106 → dirsql-0.4.107}/docs/explanation.md +0 -0
  48. {dirsql-0.4.106 → dirsql-0.4.107}/docs/getting-started.md +0 -0
  49. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/agent-skill.md +0 -0
  50. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/columns-from-paths.md +0 -0
  51. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/define-tables.md +0 -0
  52. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/embed.md +0 -0
  53. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/extract-from-contents.md +0 -0
  54. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/load-extension.md +0 -0
  55. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/parse-files-into-columns.md +0 -0
  56. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/persist.md +0 -0
  57. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/query-json.md +0 -0
  58. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/query-without-config.md +0 -0
  59. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/search-by-meaning.md +0 -0
  60. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/search-indexes.md +0 -0
  61. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/skip-files.md +0 -0
  62. {dirsql-0.4.106 → dirsql-0.4.107}/docs/howto/write-a-plugin.md +0 -0
  63. {dirsql-0.4.106 → dirsql-0.4.107}/docs/index.md +0 -0
  64. {dirsql-0.4.106 → dirsql-0.4.107}/docs/package.json +0 -0
  65. {dirsql-0.4.106 → dirsql-0.4.107}/docs/plugins.md +0 -0
  66. {dirsql-0.4.106 → dirsql-0.4.107}/docs/pnpm-lock.yaml +0 -0
  67. {dirsql-0.4.106 → dirsql-0.4.107}/docs/pnpm-workspace.yaml +0 -0
  68. {dirsql-0.4.106 → dirsql-0.4.107}/docs/reference/cli.md +0 -0
  69. {dirsql-0.4.106 → dirsql-0.4.107}/docs/reference/columns.md +0 -0
  70. {dirsql-0.4.106 → dirsql-0.4.107}/docs/reference/config.md +0 -0
  71. {dirsql-0.4.106 → dirsql-0.4.107}/docs/reference/glob.md +0 -0
  72. {dirsql-0.4.106 → dirsql-0.4.107}/docs/reference/hooks.md +0 -0
  73. {dirsql-0.4.106 → dirsql-0.4.107}/docs/reference/path-tables.md +0 -0
  74. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/CHANGELOG.md +0 -0
  75. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/MIGRATIONS.md +0 -0
  76. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/README.md +0 -0
  77. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  78. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  79. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  80. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  81. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  82. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  83. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  84. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  85. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  86. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  87. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  88. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  89. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  90. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  91. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  92. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  93. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  94. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  95. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  96. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  97. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  98. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  99. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  100. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  101. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  102. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  103. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  104. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  105. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  106. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  107. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  108. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  109. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  110. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  111. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  112. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  113. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
  114. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
  115. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  116. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  117. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  118. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
  119. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
  120. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
  121. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
  122. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  123. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
  124. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
  125. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
  126. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
  127. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  128. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
  129. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  130. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
  131. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
  132. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
  133. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
  134. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
  135. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
  136. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
  137. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
  138. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
  139. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/changelog.d/README.md +0 -0
  140. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/conftest.py +0 -0
  141. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/.claude/CLAUDE.md +0 -0
  142. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/.vitepress/config.ts +0 -0
  143. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  144. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  145. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/AGENTS.md +0 -0
  146. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/context/.gitattributes +0 -0
  147. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/context/recipes.md +0 -0
  148. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/context/troubleshooting.md +0 -0
  149. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/context/usage.md +0 -0
  150. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/explanation.md +0 -0
  151. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/getting-started.md +0 -0
  152. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/agent-skill.md +0 -0
  153. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/columns-from-paths.md +0 -0
  154. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/define-tables.md +0 -0
  155. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/embed.md +0 -0
  156. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/extract-from-contents.md +0 -0
  157. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/load-extension.md +0 -0
  158. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  159. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/persist.md +0 -0
  160. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/query-json.md +0 -0
  161. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/query-without-config.md +0 -0
  162. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/search-by-meaning.md +0 -0
  163. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/search-indexes.md +0 -0
  164. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/skip-files.md +0 -0
  165. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/howto/write-a-plugin.md +0 -0
  166. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/index.md +0 -0
  167. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/package.json +0 -0
  168. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/plugins.md +0 -0
  169. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/pnpm-lock.yaml +0 -0
  170. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/pnpm-workspace.yaml +0 -0
  171. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/reference/cli.md +0 -0
  172. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/reference/columns.md +0 -0
  173. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/reference/config.md +0 -0
  174. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/reference/glob.md +0 -0
  175. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/reference/hooks.md +0 -0
  176. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/docs/reference/path-tables.md +0 -0
  177. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
  178. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
  179. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
  180. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
  181. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
  182. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
  183. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
  184. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
  185. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
  186. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
  187. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
  188. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
  189. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
  190. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
  191. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
  192. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
  193. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
  194. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
  195. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
  196. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
  197. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
  198. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
  199. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
  200. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
  201. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
  202. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
  203. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  204. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  205. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  206. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  207. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  208. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  209. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  210. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  211. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  212. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  213. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  214. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  215. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  216. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  217. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  218. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  219. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  220. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  221. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  222. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  223. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  224. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  225. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  226. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  227. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  228. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  229. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  230. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  231. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  232. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  233. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  234. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  235. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  236. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  237. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
  238. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  239. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
  240. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
  241. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
  242. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
  243. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  244. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  245. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  246. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  247. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  248. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  249. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
  250. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
  251. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
  252. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
  253. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
  254. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
  255. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
  256. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  257. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
  258. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
  259. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
  260. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
  261. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
  262. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
  263. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
  264. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
  265. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
  266. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
  267. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
  268. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
  269. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
  270. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
  271. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
  272. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
  273. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
  274. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
  275. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
  276. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
  277. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
  278. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
  279. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
  280. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
  281. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
  282. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  283. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  284. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  285. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  286. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  287. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  288. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  289. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  290. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  291. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  292. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  293. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  294. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  295. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  296. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  297. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  298. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  299. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  300. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  301. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  302. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  303. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  304. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  305. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  306. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  307. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  308. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  309. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  310. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  311. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  312. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  313. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  314. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  315. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
  316. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
  317. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  318. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  319. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  320. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
  321. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
  322. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
  323. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
  324. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  325. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
  326. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
  327. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
  328. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
  329. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  330. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
  331. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  332. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
  333. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
  334. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
  335. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
  336. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
  337. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
  338. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
  339. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
  340. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
  341. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/migrations.d/README.md +0 -0
  342. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/src/lib.rs +0 -0
  343. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/testing-conventions.toml +0 -0
  344. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/__init__.py +0 -0
  345. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/conftest.py +0 -0
  346. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/e2e/__init__.py +0 -0
  347. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  348. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  349. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/e2e/speed_of_light.py +0 -0
  350. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/integration/__init__.py +0 -0
  351. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/integration/binding/__init__.py +0 -0
  352. {dirsql-0.4.106 → dirsql-0.4.107}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  353. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/CHANGELOG.md +0 -0
  354. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/MIGRATIONS.md +0 -0
  355. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/README.md +0 -0
  356. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/benches/db_bench.rs +0 -0
  357. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/benches/differ_bench.rs +0 -0
  358. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/benches/matcher_bench.rs +0 -0
  359. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/benches/scanner_bench.rs +0 -0
  360. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/context/.gitattributes +0 -0
  361. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/context/recipes.md +0 -0
  362. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/context/troubleshooting.md +0 -0
  363. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/context/usage.md +0 -0
  364. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/explanation.md +0 -0
  365. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/getting-started.md +0 -0
  366. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/agent-skill.md +0 -0
  367. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  368. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/define-tables.md +0 -0
  369. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/embed.md +0 -0
  370. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  371. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/load-extension.md +0 -0
  372. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  373. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/persist.md +0 -0
  374. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/query-json.md +0 -0
  375. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/query-without-config.md +0 -0
  376. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  377. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/search-indexes.md +0 -0
  378. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/skip-files.md +0 -0
  379. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  380. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/index.md +0 -0
  381. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/plugins.md +0 -0
  382. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/reference/cli.md +0 -0
  383. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/reference/columns.md +0 -0
  384. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/reference/config.md +0 -0
  385. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/reference/glob.md +0 -0
  386. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/reference/hooks.md +0 -0
  387. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/docs/reference/path-tables.md +0 -0
  388. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/bin/dirsql.rs +0 -0
  389. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/brace.rs +0 -0
  390. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/context.rs +0 -0
  391. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/execute.rs +0 -0
  392. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/init.rs +0 -0
  393. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/mod.rs +0 -0
  394. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/repl.rs +0 -0
  395. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/router.rs +0 -0
  396. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/run.rs +0 -0
  397. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/serialize.rs +0 -0
  398. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/cli/table.rs +0 -0
  399. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/command.rs +0 -0
  400. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/config.rs +0 -0
  401. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/db.rs +0 -0
  402. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/default_config.toml +0 -0
  403. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/differ.rs +0 -0
  404. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/extension_resolution.rs +0 -0
  405. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/functions.rs +0 -0
  406. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/infer.rs +0 -0
  407. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/launcher.rs +0 -0
  408. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/listing.rs +0 -0
  409. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/matcher.rs +0 -0
  410. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/on_file.rs +0 -0
  411. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/parsed_vtab.rs +0 -0
  412. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/path_table.rs +0 -0
  413. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/persist.rs +0 -0
  414. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/posix_class.rs +0 -0
  415. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/progress.rs +0 -0
  416. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/row_event_flat.rs +0 -0
  417. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/scanner.rs +0 -0
  418. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/sql_literal.rs +0 -0
  419. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/tree_walk.rs +0 -0
  420. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/vtab.rs +0 -0
  421. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/vtab_scaffold.rs +0 -0
  422. {dirsql-0.4.106 → dirsql-0.4.107}/packages/rust/src/watcher.rs +0 -0
  423. {dirsql-0.4.106 → dirsql-0.4.107}/pyproject.toml +0 -0
@@ -573,7 +573,7 @@ dependencies = [
573
573
 
574
574
  [[package]]
575
575
  name = "dirsql"
576
- version = "0.4.106"
576
+ version = "0.4.107"
577
577
  dependencies = [
578
578
  "assert_cmd",
579
579
  "axum",
@@ -625,7 +625,7 @@ dependencies = [
625
625
 
626
626
  [[package]]
627
627
  name = "dirsql-py-ext"
628
- version = "0.4.106"
628
+ version = "0.4.107"
629
629
  dependencies = [
630
630
  "dirsql",
631
631
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.106
3
+ Version: 0.4.107
4
4
  Requires-Dist: bin-shim>=0.1
5
5
  Summary: Ephemeral SQL index over a local directory
6
6
  Keywords: sql,filesystem,directory,sqlite,index
@@ -7,7 +7,8 @@ side.
7
7
 
8
8
  Row events are emitted for **named tables**, so this flow needs a config —
9
9
  [path-tables](../reference/path-tables.md) are scanned per query and are not
10
- watched. Define one next to your files. A named table's columns are whatever
10
+ watched, so `watch()` on an instance with no named tables raises an error and
11
+ `/events` returns `503`. Define one next to your files. A named table's columns are whatever
11
12
  its [`on-file`](../reference/config.md#table) hook emits; here a minimal hook
12
13
  prints each file's basename:
13
14
 
@@ -115,4 +115,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
115
115
  |---|---|
116
116
  | `200` | Stream opened (`text/event-stream`). |
117
117
  | `405` | `POST /events`. Plain-text body `method not allowed`. |
118
- | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
118
+ | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted, or the instance has no named tables). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
@@ -301,6 +301,10 @@ under the root. The watcher starts on first iteration (Python/TypeScript)
301
301
  or at the `watch()` call (Rust). The stream never terminates on its own;
302
302
  stop consuming it to stop.
303
303
 
304
+ An instance with no named tables cannot be watched: path-tables emit no
305
+ watch events, so `watch()` (and the polling primitives) raise an error naming
306
+ that cause. Define a table first.
307
+
304
308
  Python/TypeScript: each `watch()` call returns an independent stream, and every stream
305
309
  on one instance receives every event observed after it was created, so
306
310
  several consumers (one per client, say) can share one instance.
@@ -4,7 +4,7 @@ name = "dirsql-py-ext"
4
4
  # pypi/maturin handler can rewrite it via `write-version` before
5
5
  # `maturin build`. `pyproject.toml` declares `dynamic = ["version"]`
6
6
  # and maturin reads this field. Mirrors `packages/rust/Cargo.toml`.
7
- version = "0.4.106"
7
+ version = "0.4.107"
8
8
  # abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
9
9
  # `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
10
10
  # (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
@@ -0,0 +1 @@
1
+ **Changed** — `watch()` (and the polling primitives) on an instance with no named tables now fails immediately with `watching requires at least one named table: path-tables emit no watch events; define a table`, instead of starting a watcher that never yields. The `dirsql server` `/events` endpoint returns 503 with the same reason; `/query` is unaffected.
@@ -7,7 +7,8 @@ side.
7
7
 
8
8
  Row events are emitted for **named tables**, so this flow needs a config —
9
9
  [path-tables](../reference/path-tables.md) are scanned per query and are not
10
- watched. Define one next to your files. A named table's columns are whatever
10
+ watched, so `watch()` on an instance with no named tables raises an error and
11
+ `/events` returns `503`. Define one next to your files. A named table's columns are whatever
11
12
  its [`on-file`](../reference/config.md#table) hook emits; here a minimal hook
12
13
  prints each file's basename:
13
14
 
@@ -115,4 +115,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
115
115
  |---|---|
116
116
  | `200` | Stream opened (`text/event-stream`). |
117
117
  | `405` | `POST /events`. Plain-text body `method not allowed`. |
118
- | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
118
+ | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted, or the instance has no named tables). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
@@ -301,6 +301,10 @@ under the root. The watcher starts on first iteration (Python/TypeScript)
301
301
  or at the `watch()` call (Rust). The stream never terminates on its own;
302
302
  stop consuming it to stop.
303
303
 
304
+ An instance with no named tables cannot be watched: path-tables emit no
305
+ watch events, so `watch()` (and the polling primitives) raise an error naming
306
+ that cause. Define a table first.
307
+
304
308
  Python/TypeScript: each `watch()` call returns an independent stream, and every stream
305
309
  on one instance receives every event observed after it was created, so
306
310
  several consumers (one per client, say) can share one instance.
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/server_speed_test.py tests/e2e/query_contract_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/cli_version_test.py -x -q",
3
+ "ran_at": 1791474667,
4
+ "exit_code": 0,
5
+ "commit": "31f567c6cc0e5873a9bdc41df84e95a6722527f1",
6
+ "branch": "bot/1406-watch-no-tables-1008"
7
+ }
@@ -0,0 +1,23 @@
1
+ ### `watch()` requires a named table
2
+
3
+ #### Summary
4
+
5
+ `watch()`, `poll_events()`/`pollEvents()` and `start_watching()`/`startWatcher()` on an instance with no named tables now raise an error naming the cause, rather than watching and silently yielding nothing. Path-tables emit no watch events. Instances with at least one named table are unaffected.
6
+
7
+ #### Required changes
8
+
9
+ | Before | After |
10
+ | --- | --- |
11
+ | `DirSQL(root).watch()` yields nothing forever | Define a table (programmatic or `[[table]]`), or stop calling `watch()` |
12
+
13
+ #### Deprecations removed
14
+
15
+ _None._
16
+
17
+ #### Behavior changes without code changes
18
+
19
+ A path-table-only instance that called `watch()` now gets an error. `dirsql server` with no tables returns 503 from `/events`.
20
+
21
+ #### Verification
22
+
23
+ Run `dirsql server -c <config with no [[table]]>` and `curl -i http://localhost:7117/events`; expect `503` naming "path-tables emit no watch events".
@@ -6,7 +6,7 @@ description = "Ephemeral SQL index over a local directory"
6
6
  # version stays for the binding crates (publish = false). The literal
7
7
  # intentionally lags the published version: putitoutthere rewrites it to
8
8
  # the planned release version at build time and never commits it back.
9
- version = "0.4.106"
9
+ version = "0.4.107"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -7,7 +7,8 @@ side.
7
7
 
8
8
  Row events are emitted for **named tables**, so this flow needs a config —
9
9
  [path-tables](../reference/path-tables.md) are scanned per query and are not
10
- watched. Define one next to your files. A named table's columns are whatever
10
+ watched, so `watch()` on an instance with no named tables raises an error and
11
+ `/events` returns `503`. Define one next to your files. A named table's columns are whatever
11
12
  its [`on-file`](../reference/config.md#table) hook emits; here a minimal hook
12
13
  prints each file's basename:
13
14
 
@@ -115,4 +115,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
115
115
  |---|---|
116
116
  | `200` | Stream opened (`text/event-stream`). |
117
117
  | `405` | `POST /events`. Plain-text body `method not allowed`. |
118
- | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
118
+ | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted, or the instance has no named tables). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
@@ -301,6 +301,10 @@ under the root. The watcher starts on first iteration (Python/TypeScript)
301
301
  or at the `watch()` call (Rust). The stream never terminates on its own;
302
302
  stop consuming it to stop.
303
303
 
304
+ An instance with no named tables cannot be watched: path-tables emit no
305
+ watch events, so `watch()` (and the polling primitives) raise an error naming
306
+ that cause. Define a table first.
307
+
304
308
  Python/TypeScript: each `watch()` call returns an independent stream, and every stream
305
309
  on one instance receives every event observed after it was created, so
306
310
  several consumers (one per client, say) can share one instance.
@@ -109,6 +109,16 @@ fn start_watch_task(db: DirSQL, tx: broadcast::Sender<String>) -> Option<String>
109
109
  mod tests {
110
110
  use super::*;
111
111
 
112
+ fn db_with_a_table(root: &std::path::Path) -> DirSQL {
113
+ let config = root.join("dirsql.toml");
114
+ std::fs::write(
115
+ &config,
116
+ "[[table]]\nname = \"t\"\nddl = \"CREATE TABLE t (x TEXT)\"\nglob = \"*.none\"\non-file = \"true\"\n",
117
+ )
118
+ .unwrap();
119
+ DirSQL::builder().root(root).config(config).build().unwrap()
120
+ }
121
+
112
122
  // An `Unavailable` state needs no DB/filesystem, so the real bind /
113
123
  // graceful-shutdown plumbing runs without standing up an index.
114
124
  #[tokio::test]
@@ -130,7 +140,7 @@ mod tests {
130
140
  #[tokio::test]
131
141
  async fn serve_with_a_ready_db_attaches_the_watcher_then_shuts_down() {
132
142
  let dir = tempfile::tempdir().unwrap();
133
- let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
143
+ let db = db_with_a_table(dir.path());
134
144
  let config = ServerConfig::bind("127.0.0.1".to_string(), 0);
135
145
  let handle = serve(config, db).await.expect("bind on an ephemeral port");
136
146
  assert_ne!(handle.local_addr().port(), 0);
@@ -140,17 +150,29 @@ mod tests {
140
150
  #[tokio::test]
141
151
  async fn start_watch_task_reports_no_failure_once_the_watcher_attaches() {
142
152
  let dir = tempfile::tempdir().unwrap();
143
- let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
153
+ let db = db_with_a_table(dir.path());
144
154
  let (tx, _) = broadcast::channel::<String>(1);
145
155
  assert_eq!(start_watch_task(db, tx), None);
146
156
  }
147
157
 
158
+ #[tokio::test]
159
+ async fn start_watch_task_names_the_cause_without_named_tables() {
160
+ let dir = tempfile::tempdir().unwrap();
161
+ let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
162
+ let (tx, _) = broadcast::channel::<String>(1);
163
+ let reason = start_watch_task(db, tx).expect("watch() must fail");
164
+ assert!(
165
+ reason.contains("path-tables emit no watch events"),
166
+ "got: {reason}"
167
+ );
168
+ }
169
+
148
170
  // `poll_events` locks out `watch`, the one deterministic way to make the
149
171
  // watcher refuse to attach without exhausting inotify.
150
172
  #[tokio::test]
151
173
  async fn start_watch_task_returns_the_reason_when_the_watcher_cannot_attach() {
152
174
  let dir = tempfile::tempdir().unwrap();
153
- let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
175
+ let db = db_with_a_table(dir.path());
154
176
  db.poll_events(std::time::Duration::ZERO).unwrap();
155
177
  let (tx, _) = broadcast::channel::<String>(1);
156
178
  let reason = start_watch_task(db, tx).expect("watch() must fail");
@@ -407,13 +407,6 @@ impl Table {
407
407
  struct DirSqlInner {
408
408
  db: Mutex<Db>,
409
409
  root: PathBuf,
410
- /// Canonicalized `root`, used **only** for the live filesystem watcher:
411
- /// `notify` misbehaves on relative paths (it may deliver no events, or
412
- /// deliver them under the cwd-joined path so the relative prefix no
413
- /// longer strips). Literal fallback when canonicalization fails (e.g. a
414
- /// not-yet-created root); the user's `root` — and therefore the initial
415
- /// scan and the `path` column — stays byte-for-byte unchanged.
416
- watch_root: PathBuf,
417
410
  /// One entry per distinct table anchor; each holds the matcher for the
418
411
  /// tables anchored there.
419
412
  groups: Vec<AnchorGroup>,
@@ -437,13 +430,7 @@ struct DirSqlInner {
437
430
  fs: Arc<dyn FileSystem>,
438
431
  }
439
432
 
440
- fn watch_scopes(index_root: &Path, groups: &[AnchorGroup]) -> Vec<WatchScope> {
441
- if groups.is_empty() {
442
- return vec![WatchScope {
443
- root: index_root.to_path_buf(),
444
- ignore: TableMatcher::new(&[], &[]).expect("no patterns to compile"),
445
- }];
446
- }
433
+ fn watch_scopes(groups: &[AnchorGroup]) -> Vec<WatchScope> {
447
434
  groups
448
435
  .iter()
449
436
  .map(|group| WatchScope {
@@ -456,8 +443,11 @@ fn watch_scopes(index_root: &Path, groups: &[AnchorGroup]) -> Vec<WatchScope> {
456
443
  /// The tables sharing one anchor, matched against paths relative to it.
457
444
  struct AnchorGroup {
458
445
  anchor: PathBuf,
459
- /// `anchor` canonicalized for the live watcher; see
460
- /// [`DirSqlInner::watch_root`].
446
+ /// `anchor` canonicalized for the live watcher only: `notify` misbehaves
447
+ /// on relative paths (it may deliver no events, or deliver them under the
448
+ /// cwd-joined path so the relative prefix no longer strips). Literal
449
+ /// fallback when canonicalization fails; `anchor` and the `path` column
450
+ /// stay byte-for-byte as supplied.
461
451
  watch_anchor: PathBuf,
462
452
  matcher: TableMatcher,
463
453
  tables: Vec<String>,
@@ -585,6 +575,7 @@ impl DirSQL {
585
575
  /// no-ops. Called implicitly by [`poll_events`](Self::poll_events) and
586
576
  /// [`watch`](Self::watch).
587
577
  pub fn start_watching(&self) -> Result<()> {
578
+ self.require_named_tables()?;
588
579
  let mut guard = self.inner.watcher.lock().map_err(DirSqlError::lock)?;
589
580
  if guard.is_none() {
590
581
  // Watch the canonicalized anchors, never the (possibly relative)
@@ -595,11 +586,19 @@ impl DirSQL {
595
586
  Ok(())
596
587
  }
597
588
 
589
+ fn require_named_tables(&self) -> Result<()> {
590
+ if self.inner.groups.is_empty() {
591
+ return Err(DirSqlError::watch_msg(
592
+ "watching requires at least one named table: path-tables emit no watch events; define a table",
593
+ ));
594
+ }
595
+ Ok(())
596
+ }
597
+
598
598
  /// The trees the live watcher must cover: each table anchor, under the
599
- /// skip rules its tables' scan applies. A build with no tables still
600
- /// watches the index root.
599
+ /// skip rules its tables' scan applies.
601
600
  fn watch_scopes(&self) -> Vec<WatchScope> {
602
- watch_scopes(&self.inner.watch_root, &self.inner.groups)
601
+ watch_scopes(&self.inner.groups)
603
602
  }
604
603
 
605
604
  /// Poll-based watch API. Blocks up to `timeout` waiting for the next
@@ -680,6 +679,7 @@ impl DirSQL {
680
679
  ///
681
680
  /// Mutually exclusive with [`poll_events`](Self::poll_events).
682
681
  pub fn watch(&self) -> Result<WatchStream> {
682
+ self.require_named_tables()?;
683
683
  if self.inner.poll_used.load(Ordering::SeqCst) {
684
684
  return Err(DirSqlError::watch_msg(
685
685
  "poll_events() already in use; cannot call watch()",
@@ -1583,9 +1583,6 @@ impl DirSQL {
1583
1583
  // Commit the ingest transaction.
1584
1584
  _tx.commit().map_err(DirSqlError::sqlite)?;
1585
1585
 
1586
- // Canonicalize the watch root so the live watcher never sees a
1587
- // relative path; `root` itself is left untouched.
1588
- let watch_root = PathBuf::from(fs.canonical_root(&root));
1589
1586
  let mut groups = groups;
1590
1587
  for group in &mut groups {
1591
1588
  group.watch_anchor = PathBuf::from(fs.canonical_root(&group.anchor));
@@ -1595,7 +1592,6 @@ impl DirSQL {
1595
1592
  inner: Arc::new(DirSqlInner {
1596
1593
  db: Mutex::new(db),
1597
1594
  root,
1598
- watch_root,
1599
1595
  groups,
1600
1596
  on_file_map,
1601
1597
  strict_map,
@@ -3436,11 +3432,11 @@ mod internal_tests {
3436
3432
  );
3437
3433
  }
3438
3434
 
3439
- /// Building with a **relative** root canonicalizes `watch_root` to an
3435
+ /// Building with a **relative** root canonicalizes the watch anchor to an
3440
3436
  /// absolute path while leaving `root` exactly as the caller supplied it,
3441
3437
  /// so `notify` never sees `.`.
3442
3438
  #[test]
3443
- fn relative_root_canonicalizes_watch_root_only() {
3439
+ fn relative_root_canonicalizes_watch_anchor_only() {
3444
3440
  let canonical = if cfg!(windows) {
3445
3441
  r"C:\ws\canonical"
3446
3442
  } else {
@@ -3462,11 +3458,11 @@ mod internal_tests {
3462
3458
 
3463
3459
  assert_eq!(db.inner.root, PathBuf::from("."));
3464
3460
  assert!(
3465
- db.inner.watch_root.is_absolute(),
3466
- "watch_root must be absolute, got {:?}",
3467
- db.inner.watch_root
3461
+ db.inner.groups[0].watch_anchor.is_absolute(),
3462
+ "watch_anchor must be absolute, got {:?}",
3463
+ db.inner.groups[0].watch_anchor
3468
3464
  );
3469
- assert_eq!(db.inner.watch_root, PathBuf::from(canonical));
3465
+ assert_eq!(db.inner.groups[0].watch_anchor, PathBuf::from(canonical));
3470
3466
  }
3471
3467
 
3472
3468
  /// With an absolute root, `process_file_event` strips the `watch_root`
@@ -3730,8 +3726,17 @@ mod internal_tests {
3730
3726
  /// tableless for these lock-poison / error-path tests.
3731
3727
  fn simple_db() -> (TempDir, DirSQL) {
3732
3728
  let dir = TempDir::new().unwrap();
3733
- let db =
3734
- DirSQL::with_ignore(dir.path(), Vec::<Table>::new(), Vec::<String>::new()).unwrap();
3729
+ let db = DirSQL::with_ignore(
3730
+ dir.path(),
3731
+ vec![Table::new(
3732
+ "t",
3733
+ "CREATE TABLE t (x TEXT)",
3734
+ "*.none",
3735
+ |_| vec![],
3736
+ )],
3737
+ Vec::<String>::new(),
3738
+ )
3739
+ .unwrap();
3735
3740
  (dir, db)
3736
3741
  }
3737
3742
 
@@ -4141,6 +4146,27 @@ mod internal_tests {
4141
4146
  );
4142
4147
  }
4143
4148
 
4149
+ #[test]
4150
+ fn watch_without_named_tables_names_the_cause() {
4151
+ let db = DirSQL::new(TempDir::new().unwrap().path(), vec![]).unwrap();
4152
+ let err = db.watch().unwrap_err().to_string();
4153
+ assert!(
4154
+ err.contains("path-tables emit no watch events"),
4155
+ "got: {err}"
4156
+ );
4157
+ assert!(err.contains("define a table"), "got: {err}");
4158
+ }
4159
+
4160
+ #[test]
4161
+ fn poll_events_without_named_tables_names_the_cause() {
4162
+ let db = DirSQL::new(TempDir::new().unwrap().path(), vec![]).unwrap();
4163
+ let err = db.poll_events(Duration::ZERO).unwrap_err().to_string();
4164
+ assert!(
4165
+ err.contains("path-tables emit no watch events"),
4166
+ "got: {err}"
4167
+ );
4168
+ }
4169
+
4144
4170
  #[test]
4145
4171
  fn watch_twice_reports_already_started() {
4146
4172
  let (_dir, db) = simple_db();
@@ -4968,7 +4994,16 @@ mod internal_tests {
4968
4994
  #[tokio::test]
4969
4995
  async fn async_dirsql_builds_queries_and_forwards() {
4970
4996
  let dir = TempDir::new().unwrap();
4971
- let adb = AsyncDirSQL::new(dir.path(), Vec::<Table>::new()).unwrap();
4997
+ let adb = AsyncDirSQL::new(
4998
+ dir.path(),
4999
+ vec![Table::new(
5000
+ "t",
5001
+ "CREATE TABLE t (x TEXT)",
5002
+ "*.none",
5003
+ |_| vec![],
5004
+ )],
5005
+ )
5006
+ .unwrap();
4972
5007
  adb.ready().await.unwrap();
4973
5008
  let rows = adb.query("SELECT 1 AS n").await.unwrap();
4974
5009
  assert_eq!(rows[0]["n"], Value::Integer(1));
@@ -4984,7 +5019,16 @@ mod internal_tests {
4984
5019
  #[tokio::test]
4985
5020
  async fn async_dirsql_watch_forwards() {
4986
5021
  let dir = TempDir::new().unwrap();
4987
- let adb = AsyncDirSQL::new(dir.path(), Vec::<Table>::new()).unwrap();
5022
+ let adb = AsyncDirSQL::new(
5023
+ dir.path(),
5024
+ vec![Table::new(
5025
+ "t",
5026
+ "CREATE TABLE t (x TEXT)",
5027
+ "*.none",
5028
+ |_| vec![],
5029
+ )],
5030
+ )
5031
+ .unwrap();
4988
5032
  adb.ready().await.unwrap();
4989
5033
  let _stream = adb.watch().unwrap();
4990
5034
  }
@@ -5848,7 +5892,7 @@ mod internal_tests {
5848
5892
  .collect();
5849
5893
  let ignore: Vec<String> = ignore.iter().map(|p| p.to_string()).collect();
5850
5894
  let (groups, _, _) = compile_groups(&tables, &ignore, Path::new("/idx")).unwrap();
5851
- watch_scopes(Path::new("/canonical-idx"), &groups)
5895
+ watch_scopes(&groups)
5852
5896
  }
5853
5897
 
5854
5898
  fn roots(scopes: &[WatchScope]) -> Vec<PathBuf> {
@@ -5860,14 +5904,10 @@ mod internal_tests {
5860
5904
  let dir = TempDir::new().unwrap();
5861
5905
  let db = populated_db(dir.path(), "**/*.txt", &["a.txt"]);
5862
5906
 
5863
- assert_eq!(roots(&db.watch_scopes()), vec![db.inner.watch_root.clone()]);
5864
- }
5865
-
5866
- #[test]
5867
- fn watch_scopes_without_tables_is_the_whole_index_root() {
5868
- let scopes = scopes_for(&[], &[]);
5869
- assert_eq!(roots(&scopes), vec![PathBuf::from("/canonical-idx")]);
5870
- assert!(!scopes[0].ignore.is_ignored_dir(Path::new("node_modules")));
5907
+ assert_eq!(
5908
+ roots(&db.watch_scopes()),
5909
+ vec![db.inner.groups[0].watch_anchor.clone()]
5910
+ );
5871
5911
  }
5872
5912
 
5873
5913
  #[test]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes