dirsql 0.4.89__tar.gz → 0.4.90__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 (368) hide show
  1. {dirsql-0.4.89 → dirsql-0.4.90}/Cargo.lock +2 -2
  2. {dirsql-0.4.89 → dirsql-0.4.90}/PKG-INFO +1 -1
  3. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/Cargo.toml +1 -1
  4. dirsql-0.4.90/packages/python/changelog.d/2026-10-06-config-braces.md +3 -0
  5. dirsql-0.4.90/packages/python/e2e-attestations/claude-1258-config-braces.json +7 -0
  6. dirsql-0.4.90/packages/python/migrations.d/2026-10-06-config-braces.md +40 -0
  7. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/Cargo.toml +1 -1
  8. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/lib.rs +0 -80
  9. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/matcher.rs +4 -178
  10. {dirsql-0.4.89 → dirsql-0.4.90}/Cargo.toml +0 -0
  11. {dirsql-0.4.89 → dirsql-0.4.90}/README.md +0 -0
  12. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/__init__.py +0 -0
  13. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/_async.py +0 -0
  14. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/_dirsql.pyi +0 -0
  15. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/__init__.py +0 -0
  16. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/discover_plugins/__init__.py +0 -0
  17. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  18. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  19. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  20. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  21. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/main.py +0 -0
  22. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/cli/resolve_config_extensions.py +0 -0
  23. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/plan_entry_path.py +0 -0
  24. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/py.typed +0 -0
  25. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/read_config.py +0 -0
  26. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/resolve_configs_extension_specs.py +0 -0
  27. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/resolve_extension.py +0 -0
  28. {dirsql-0.4.89 → dirsql-0.4.90}/dirsql/resolve_package.py +0 -0
  29. {dirsql-0.4.89 → dirsql-0.4.90}/docs/.claude/CLAUDE.md +0 -0
  30. {dirsql-0.4.89 → dirsql-0.4.90}/docs/.vitepress/config.ts +0 -0
  31. {dirsql-0.4.89 → dirsql-0.4.90}/docs/.vitepress/theme/index.ts +0 -0
  32. {dirsql-0.4.89 → dirsql-0.4.90}/docs/.vitepress/theme/lang.ts +0 -0
  33. {dirsql-0.4.89 → dirsql-0.4.90}/docs/AGENTS.md +0 -0
  34. {dirsql-0.4.89 → dirsql-0.4.90}/docs/context/.gitattributes +0 -0
  35. {dirsql-0.4.89 → dirsql-0.4.90}/docs/context/recipes.md +0 -0
  36. {dirsql-0.4.89 → dirsql-0.4.90}/docs/context/troubleshooting.md +0 -0
  37. {dirsql-0.4.89 → dirsql-0.4.90}/docs/context/usage.md +0 -0
  38. {dirsql-0.4.89 → dirsql-0.4.90}/docs/explanation.md +0 -0
  39. {dirsql-0.4.89 → dirsql-0.4.90}/docs/getting-started.md +0 -0
  40. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/agent-skill.md +0 -0
  41. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/columns-from-paths.md +0 -0
  42. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/define-tables.md +0 -0
  43. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/embed.md +0 -0
  44. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/extract-from-contents.md +0 -0
  45. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/load-extension.md +0 -0
  46. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/parse-files-into-columns.md +0 -0
  47. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/persist.md +0 -0
  48. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/query-json.md +0 -0
  49. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/query-without-config.md +0 -0
  50. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/react-to-changes.md +0 -0
  51. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/search-by-meaning.md +0 -0
  52. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/search-indexes.md +0 -0
  53. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/skip-files.md +0 -0
  54. {dirsql-0.4.89 → dirsql-0.4.90}/docs/howto/write-a-plugin.md +0 -0
  55. {dirsql-0.4.89 → dirsql-0.4.90}/docs/index.md +0 -0
  56. {dirsql-0.4.89 → dirsql-0.4.90}/docs/package.json +0 -0
  57. {dirsql-0.4.89 → dirsql-0.4.90}/docs/plugins.md +0 -0
  58. {dirsql-0.4.89 → dirsql-0.4.90}/docs/pnpm-lock.yaml +0 -0
  59. {dirsql-0.4.89 → dirsql-0.4.90}/docs/pnpm-workspace.yaml +0 -0
  60. {dirsql-0.4.89 → dirsql-0.4.90}/docs/reference/cli.md +0 -0
  61. {dirsql-0.4.89 → dirsql-0.4.90}/docs/reference/columns.md +0 -0
  62. {dirsql-0.4.89 → dirsql-0.4.90}/docs/reference/config.md +0 -0
  63. {dirsql-0.4.89 → dirsql-0.4.90}/docs/reference/hooks.md +0 -0
  64. {dirsql-0.4.89 → dirsql-0.4.90}/docs/reference/http-api.md +0 -0
  65. {dirsql-0.4.89 → dirsql-0.4.90}/docs/reference/path-tables.md +0 -0
  66. {dirsql-0.4.89 → dirsql-0.4.90}/docs/reference/sdk.md +0 -0
  67. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/CHANGELOG.md +0 -0
  68. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/MIGRATIONS.md +0 -0
  69. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/README.md +0 -0
  70. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  71. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  72. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  73. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  74. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  75. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  76. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  77. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  78. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  79. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  80. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  81. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  82. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  83. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  84. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  85. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  86. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  87. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  88. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  89. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  90. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  91. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  92. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  93. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  94. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  95. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  96. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  97. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  98. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  99. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  100. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  101. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  102. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  103. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  104. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  105. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  106. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
  107. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
  108. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  109. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  110. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  111. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
  112. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
  113. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  114. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
  115. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
  116. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
  117. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  118. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/changelog.d/README.md +0 -0
  119. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/conftest.py +0 -0
  120. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/.claude/CLAUDE.md +0 -0
  121. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/.vitepress/config.ts +0 -0
  122. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  123. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  124. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/AGENTS.md +0 -0
  125. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/context/.gitattributes +0 -0
  126. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/context/recipes.md +0 -0
  127. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/context/troubleshooting.md +0 -0
  128. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/context/usage.md +0 -0
  129. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/explanation.md +0 -0
  130. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/getting-started.md +0 -0
  131. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/agent-skill.md +0 -0
  132. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/columns-from-paths.md +0 -0
  133. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/define-tables.md +0 -0
  134. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/embed.md +0 -0
  135. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/extract-from-contents.md +0 -0
  136. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/load-extension.md +0 -0
  137. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  138. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/persist.md +0 -0
  139. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/query-json.md +0 -0
  140. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/query-without-config.md +0 -0
  141. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/react-to-changes.md +0 -0
  142. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/search-by-meaning.md +0 -0
  143. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/search-indexes.md +0 -0
  144. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/skip-files.md +0 -0
  145. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/howto/write-a-plugin.md +0 -0
  146. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/index.md +0 -0
  147. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/package.json +0 -0
  148. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/plugins.md +0 -0
  149. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/pnpm-lock.yaml +0 -0
  150. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/pnpm-workspace.yaml +0 -0
  151. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/reference/cli.md +0 -0
  152. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/reference/columns.md +0 -0
  153. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/reference/config.md +0 -0
  154. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/reference/hooks.md +0 -0
  155. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/reference/http-api.md +0 -0
  156. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/reference/path-tables.md +0 -0
  157. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/docs/reference/sdk.md +0 -0
  158. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
  159. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
  160. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
  161. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
  162. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
  163. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  164. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  165. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  166. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  167. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  168. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  169. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  170. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  171. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  172. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  173. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  174. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  175. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  176. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  177. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  178. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  179. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  180. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  181. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  182. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  183. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  184. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  185. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  186. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  187. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  188. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  189. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  190. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  191. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  192. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  193. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  194. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  195. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  196. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  197. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
  198. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  199. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
  200. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
  201. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
  202. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
  203. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  204. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  205. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  206. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  207. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  208. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  209. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
  210. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
  211. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
  212. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
  213. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  214. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
  215. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
  216. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
  217. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
  218. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
  219. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
  220. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
  221. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
  222. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
  223. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
  224. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
  225. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
  226. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
  227. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
  228. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
  229. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
  230. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
  231. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
  232. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
  233. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
  234. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
  235. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
  236. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
  237. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
  238. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
  239. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  240. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  241. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  242. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  243. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  244. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  245. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  246. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  247. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  248. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  249. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  250. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  251. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  252. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  253. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  254. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  255. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  256. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  257. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  258. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  259. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  260. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  261. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  262. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  263. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  264. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  265. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  266. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  267. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  268. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  269. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  270. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  271. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  272. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
  273. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
  274. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  275. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  276. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  277. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
  278. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
  279. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  280. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
  281. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
  282. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
  283. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  284. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/migrations.d/README.md +0 -0
  285. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/src/lib.rs +0 -0
  286. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/testing-conventions.toml +0 -0
  287. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/__init__.py +0 -0
  288. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/conftest.py +0 -0
  289. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/e2e/__init__.py +0 -0
  290. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  291. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  292. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/e2e/speed_of_light.py +0 -0
  293. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/integration/__init__.py +0 -0
  294. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/integration/binding/__init__.py +0 -0
  295. {dirsql-0.4.89 → dirsql-0.4.90}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  296. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/CHANGELOG.md +0 -0
  297. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/MIGRATIONS.md +0 -0
  298. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/README.md +0 -0
  299. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/benches/db_bench.rs +0 -0
  300. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/benches/differ_bench.rs +0 -0
  301. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/benches/matcher_bench.rs +0 -0
  302. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/benches/scanner_bench.rs +0 -0
  303. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/context/.gitattributes +0 -0
  304. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/context/recipes.md +0 -0
  305. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/context/troubleshooting.md +0 -0
  306. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/context/usage.md +0 -0
  307. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/explanation.md +0 -0
  308. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/getting-started.md +0 -0
  309. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/agent-skill.md +0 -0
  310. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  311. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/define-tables.md +0 -0
  312. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/embed.md +0 -0
  313. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  314. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/load-extension.md +0 -0
  315. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  316. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/persist.md +0 -0
  317. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/query-json.md +0 -0
  318. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/query-without-config.md +0 -0
  319. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/react-to-changes.md +0 -0
  320. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  321. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/search-indexes.md +0 -0
  322. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/skip-files.md +0 -0
  323. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  324. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/index.md +0 -0
  325. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/plugins.md +0 -0
  326. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/reference/cli.md +0 -0
  327. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/reference/columns.md +0 -0
  328. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/reference/config.md +0 -0
  329. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/reference/hooks.md +0 -0
  330. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/reference/http-api.md +0 -0
  331. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/reference/path-tables.md +0 -0
  332. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/docs/reference/sdk.md +0 -0
  333. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/bin/dirsql.rs +0 -0
  334. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/brace.rs +0 -0
  335. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/context.rs +0 -0
  336. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/execute.rs +0 -0
  337. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/init.rs +0 -0
  338. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/mod.rs +0 -0
  339. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/repl.rs +0 -0
  340. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/router.rs +0 -0
  341. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/run.rs +0 -0
  342. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/serialize.rs +0 -0
  343. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/server.rs +0 -0
  344. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/cli/table.rs +0 -0
  345. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/command.rs +0 -0
  346. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/config.rs +0 -0
  347. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/db.rs +0 -0
  348. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/default_config.toml +0 -0
  349. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/differ.rs +0 -0
  350. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/extension_resolution.rs +0 -0
  351. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/functions.rs +0 -0
  352. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/infer.rs +0 -0
  353. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/launcher.rs +0 -0
  354. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/listing.rs +0 -0
  355. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/on_file.rs +0 -0
  356. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/parsed_vtab.rs +0 -0
  357. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/path_table.rs +0 -0
  358. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/persist.rs +0 -0
  359. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/posix_class.rs +0 -0
  360. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/progress.rs +0 -0
  361. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/row_event_flat.rs +0 -0
  362. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/scanner.rs +0 -0
  363. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/sql_literal.rs +0 -0
  364. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/tree_walk.rs +0 -0
  365. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/vtab.rs +0 -0
  366. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/vtab_scaffold.rs +0 -0
  367. {dirsql-0.4.89 → dirsql-0.4.90}/packages/rust/src/watcher.rs +0 -0
  368. {dirsql-0.4.89 → dirsql-0.4.90}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.89"
555
+ version = "0.4.90"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -603,7 +603,7 @@ dependencies = [
603
603
 
604
604
  [[package]]
605
605
  name = "dirsql-py-ext"
606
- version = "0.4.89"
606
+ version = "0.4.90"
607
607
  dependencies = [
608
608
  "dirsql",
609
609
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.89
3
+ Version: 0.4.90
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
@@ -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.89"
7
+ version = "0.4.90"
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,3 @@
1
+ **Changed** In a declared `[[table]] glob`, `{name}` is a literal, not a
2
+ wildcard, as in a path-table and in bash. The load-time error for a `{name}`
3
+ that collides with a declared column is gone. Write `*` for the old meaning.
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/query_contract_test.py -x -q",
3
+ "ran_at": 1791333540,
4
+ "exit_code": 0,
5
+ "commit": "37586d9320ebca5d4be159cfe3a523ebcf017884",
6
+ "branch": "claude/1258-config-braces"
7
+ }
@@ -0,0 +1,40 @@
1
+ ### A braced name in a config glob is a literal
2
+
3
+ #### Summary
4
+
5
+ `glob = "data/{id}/metadata.json"` used to treat `{id}` as `*`. It now matches
6
+ a directory literally named `{id}`. `{a,b}` alternation is unchanged. A column
7
+ named like a `{name}` no longer errors at load.
8
+
9
+ #### Required changes
10
+
11
+ | Before | After |
12
+ | --- | --- |
13
+ | `glob = "data/{id}/metadata.json"` | `glob = "data/*/metadata.json"` |
14
+
15
+ #### Deprecations removed
16
+
17
+ - The `CaptureColumnCollision` error: a `{name}` is no longer a capture, so
18
+ nothing can collide.
19
+
20
+ #### Behavior changes without code changes
21
+
22
+ - A config that kept `{name}` in a glob stops matching files and loads no rows.
23
+
24
+ #### Verification
25
+
26
+ ```bash
27
+ cd "$(mktemp -d)"
28
+ mkdir -p 'data/{id}' data/x
29
+ echo '[{"p":"lit"}]' > 'data/{id}/m.json'
30
+ echo '[{"p":"other"}]' > data/x/m.json
31
+ cat > .dirsql.toml <<'TOML'
32
+ [[table]]
33
+ name = "t"
34
+ glob = "data/{id}/m.json"
35
+ ddl = "CREATE TABLE t (p TEXT)"
36
+ on-file = "jq -sc add"
37
+ TOML
38
+ dirsql query "SELECT p FROM t" -c .dirsql.toml
39
+ # expected: [{"p":"lit"}]
40
+ ```
@@ -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.89"
9
+ version = "0.4.90"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -199,14 +199,6 @@ pub enum DirSqlError {
199
199
  source: Option<BoxError>,
200
200
  },
201
201
 
202
- #[error(
203
- "glob capture `{{{placeholder}}}` collides with declared column `{column}`: \
204
- captures no longer populate columns, so `{column}` would always be NULL. \
205
- Remove `{column}` from the table's DDL, or emit its value from the on-file \
206
- hook by splitting the path yourself."
207
- )]
208
- CaptureColumnCollision { placeholder: String, column: String },
209
-
210
202
  #[error(
211
203
  "query() only accepts read-only statements; SQLite classified this statement as a write"
212
204
  )]
@@ -1323,18 +1315,6 @@ impl DirSQL {
1323
1315
  eprintln!("{warning}");
1324
1316
  }
1325
1317
  }
1326
- // Reject a `{name}` glob placeholder whose name is also a declared
1327
- // column: captures no longer populate columns, so it would read
1328
- // NULL forever. The table exists here either way (freshly created
1329
- // or restored from cache), so its columns are knowable, and this
1330
- // runs before any file is ingested — a load-time failure.
1331
- let declared_columns = db.get_table_columns(&table_name).map_err(map_db_error)?;
1332
- if let Some(name) = find_capture_column_collision(&table.glob, &declared_columns) {
1333
- return Err(DirSqlError::CaptureColumnCollision {
1334
- placeholder: name.clone(),
1335
- column: name,
1336
- });
1337
- }
1338
1318
  on_file_map.insert(table_name.clone(), table.hook);
1339
1319
  strict_map.insert(table_name.clone(), table.strict);
1340
1320
  ddl_map.insert(table_name, table.ddl);
@@ -2519,18 +2499,6 @@ pub(crate) fn json_to_value(value: &serde_json::Value) -> Value {
2519
2499
  }
2520
2500
  }
2521
2501
 
2522
- /// Returns the first `{name}` placeholder in `glob` whose name is also one of
2523
- /// `declared_columns`. `None` when the glob has no placeholders or none of
2524
- /// them names a declared column. Pure: the sole input is the glob string and
2525
- /// the column list, so it is exhaustively unit-testable.
2526
- fn find_capture_column_collision(glob: &str, declared_columns: &[String]) -> Option<String> {
2527
- let declared: std::collections::HashSet<&str> =
2528
- declared_columns.iter().map(String::as_str).collect();
2529
- crate::matcher::placeholder_names(glob)
2530
- .into_iter()
2531
- .find(|name| declared.contains(name.as_str()))
2532
- }
2533
-
2534
2502
  /// Async wrapper around [`DirSQL`] whose constructor returns immediately while
2535
2503
  /// the initial scan runs on a background thread.
2536
2504
  ///
@@ -4506,54 +4474,6 @@ mod internal_tests {
4506
4474
  assert_eq!(deleted, vec![("gone.txt".to_string(), "t".to_string())]);
4507
4475
  }
4508
4476
 
4509
- #[test]
4510
- fn find_capture_column_collision_flags_a_placeholder_naming_a_column() {
4511
- let declared = vec!["thread_id".to_string(), "basename".to_string()];
4512
- assert_eq!(
4513
- find_capture_column_collision("_comments/{thread_id}/*.txt", &declared),
4514
- Some("thread_id".to_string())
4515
- );
4516
- }
4517
-
4518
- #[test]
4519
- fn find_capture_column_collision_ignores_a_placeholder_with_no_column() {
4520
- let declared = vec!["path".to_string(), "basename".to_string()];
4521
- assert_eq!(
4522
- find_capture_column_collision("_comments/{thread_id}/*.txt", &declared),
4523
- None
4524
- );
4525
- }
4526
-
4527
- #[test]
4528
- fn find_capture_column_collision_none_without_placeholders() {
4529
- let declared = vec!["thread_id".to_string()];
4530
- assert_eq!(
4531
- find_capture_column_collision("_comments/*/*.txt", &declared),
4532
- None
4533
- );
4534
- }
4535
-
4536
- #[test]
4537
- fn find_capture_column_collision_returns_first_colliding_placeholder() {
4538
- let declared = vec!["repo".to_string(), "org".to_string()];
4539
- assert_eq!(
4540
- find_capture_column_collision("{org}/{repo}/data.json", &declared),
4541
- Some("org".to_string())
4542
- );
4543
- }
4544
-
4545
- #[test]
4546
- fn capture_column_collision_error_names_placeholder_and_fix() {
4547
- let err = DirSqlError::CaptureColumnCollision {
4548
- placeholder: "thread_id".to_string(),
4549
- column: "thread_id".to_string(),
4550
- };
4551
- let msg = err.to_string();
4552
- assert!(msg.contains("thread_id"));
4553
- assert!(msg.contains("collides"));
4554
- assert!(msg.contains("on-file"));
4555
- }
4556
-
4557
4477
  /// A `name` the batch never created: the error has to say what it *did*
4558
4478
  /// create, or a typo gives the reader nothing to compare against.
4559
4479
  #[test]
@@ -79,8 +79,6 @@ pub struct MatchResult {
79
79
  pub table_name: String,
80
80
  }
81
81
 
82
- /// A compiled glob pattern. `{name}` placeholders are rewritten to `*` before
83
- /// compilation, so they are pure match wildcards.
84
82
  #[derive(Clone)]
85
83
  struct PatternEntry {
86
84
  pattern: PathGlob,
@@ -100,72 +98,13 @@ pub struct TableMatcher {
100
98
  gitignore: bool,
101
99
  }
102
100
 
103
- /// Byte spans of the `{name}` placeholders in `pattern`, in order: `(start,
104
- /// end, name)` with `end` past the closing brace.
105
- ///
106
- /// The grammar is exactly `{` `[a-zA-Z_][a-zA-Z0-9_]*` `}`. Anything else --
107
- /// `{}`, `{1a}`, `{a-b}`, an unclosed `{` -- is not a placeholder and is left
108
- /// alone, matching the leftmost-first, non-overlapping scan the equivalent
109
- /// regex performed.
110
- fn placeholder_spans(pattern: &str) -> Vec<(usize, usize, String)> {
111
- let bytes = pattern.as_bytes();
112
- let mut spans = Vec::new();
113
- let mut i = 0;
114
- while i < bytes.len() {
115
- if bytes[i] == b'{' {
116
- let mut j = i + 1;
117
- if j < bytes.len() && (bytes[j].is_ascii_alphabetic() || bytes[j] == b'_') {
118
- j += 1;
119
- while j < bytes.len() && (bytes[j].is_ascii_alphanumeric() || bytes[j] == b'_') {
120
- j += 1;
121
- }
122
- if j < bytes.len() && bytes[j] == b'}' {
123
- // Every byte in `i..=j` is ASCII, so these are char boundaries.
124
- spans.push((i, j + 1, pattern[i + 1..j].to_string()));
125
- i = j + 1;
126
- continue;
127
- }
128
- }
129
- }
130
- i += 1;
131
- }
132
- spans
133
- }
134
-
135
- /// Names of the `{name}` placeholders in `pattern`, in order of appearance.
136
- pub fn placeholder_names(pattern: &str) -> Vec<String> {
137
- placeholder_spans(pattern)
138
- .into_iter()
139
- .map(|(_, _, name)| name)
140
- .collect()
141
- }
142
-
143
- /// Rewrite `{name}` placeholders in a glob to `*`, so they match a single path
144
- /// segment without producing any captured value.
145
- fn glob_with_placeholders_as_star(pattern: &str) -> String {
146
- let spans = placeholder_spans(pattern);
147
- if spans.is_empty() {
148
- return pattern.to_string();
149
- }
150
- let mut out = String::with_capacity(pattern.len());
151
- let mut last = 0;
152
- for (start, end, _) in spans {
153
- out.push_str(&pattern[last..start]);
154
- out.push('*');
155
- last = end;
156
- }
157
- out.push_str(&pattern[last..]);
158
- out
159
- }
160
-
161
101
  impl TableMatcher {
162
102
  /// Build a new matcher from (glob_pattern, table_name) pairs and ignore patterns.
163
- /// Glob patterns may contain `{name}` placeholders, which match like `*`.
164
103
  pub fn new(mappings: &[(&str, &str)], ignore_patterns: &[&str]) -> Result<Self, GlobError> {
165
104
  let mut entries = Vec::new();
166
105
  for (pattern, table_name) in mappings {
167
106
  entries.push(PatternEntry {
168
- pattern: compile_glob(&glob_with_placeholders_as_star(pattern))?,
107
+ pattern: compile_glob(pattern)?,
169
108
  table_name: table_name.to_string(),
170
109
  });
171
110
  }
@@ -273,20 +212,6 @@ mod tests {
273
212
  );
274
213
  }
275
214
 
276
- #[test]
277
- fn placeholder_glob_matches_like_a_star() {
278
- // A `{name}` placeholder and a `*` compile to the same matcher: both
279
- // globs match exactly the same file.
280
- let placeholder = TableMatcher::new(&[("data/{id}/metadata.json", "a")], &[]).unwrap();
281
- let star = TableMatcher::new(&[("data/*/metadata.json", "a")], &[]).unwrap();
282
- let path = Path::new("data/x/metadata.json");
283
- assert_eq!(names(&placeholder, "data/x/metadata.json"), vec!["a"]);
284
- assert_eq!(
285
- placeholder.match_all(path).is_empty(),
286
- star.match_all(path).is_empty(),
287
- );
288
- }
289
-
290
215
  #[test]
291
216
  fn match_all_with_nested_path() {
292
217
  let matcher = TableMatcher::new(&[("**/*.jsonl", "events")], &[]).unwrap();
@@ -368,105 +293,6 @@ mod tests {
368
293
  assert_eq!(names(&matcher, "logs/deep/nested/b.txt"), vec!["t"]);
369
294
  }
370
295
 
371
- #[test]
372
- fn placeholder_matches_the_filled_segment() {
373
- let matcher =
374
- TableMatcher::new(&[("comments/{thread_id}/index.jsonl", "comments")], &[]).unwrap();
375
- assert_eq!(
376
- names(&matcher, "comments/abc123/index.jsonl"),
377
- vec!["comments"]
378
- );
379
- }
380
-
381
- #[test]
382
- fn multiple_placeholders_match() {
383
- let matcher = TableMatcher::new(&[("{org}/{repo}/data.json", "repos")], &[]).unwrap();
384
- assert_eq!(names(&matcher, "acme/widgets/data.json"), vec!["repos"]);
385
- }
386
-
387
- #[test]
388
- fn placeholder_no_match_returns_empty() {
389
- let matcher =
390
- TableMatcher::new(&[("comments/{thread_id}/index.jsonl", "comments")], &[]).unwrap();
391
- assert!(matcher.match_all(Path::new("other/file.txt")).is_empty());
392
- }
393
-
394
- #[test]
395
- fn placeholder_with_double_star_matches() {
396
- let matcher = TableMatcher::new(&[("**/{category}/items.json", "items")], &[]).unwrap();
397
- assert_eq!(
398
- names(&matcher, "shop/electronics/items.json"),
399
- vec!["items"]
400
- );
401
- }
402
-
403
- #[test]
404
- fn placeholder_with_question_mark_matches() {
405
- let matcher = TableMatcher::new(&[("{name}?.txt", "files")], &[]).unwrap();
406
- assert_eq!(names(&matcher, "ab.txt"), vec!["files"]);
407
- }
408
-
409
- #[test]
410
- fn placeholder_names_lists_names_in_order() {
411
- assert_eq!(
412
- placeholder_names("{org}/{repo}/data.json"),
413
- vec!["org".to_string(), "repo".to_string()]
414
- );
415
- }
416
-
417
- #[test]
418
- fn placeholder_names_empty_when_none() {
419
- assert!(placeholder_names("data/*/metadata.json").is_empty());
420
- }
421
-
422
- #[test]
423
- fn placeholder_names_rejects_everything_outside_the_grammar() {
424
- // The grammar is exactly `{` `[a-zA-Z_][a-zA-Z0-9_]*` `}`. Each of these
425
- // fails it at a different point -- empty name, a leading digit, a
426
- // disallowed interior byte, and a brace that runs off the end of the
427
- // pattern -- and all are left alone rather than read as a placeholder.
428
- for pattern in ["{}", "{1a}", "{a-b}", "{a b}", "{", "a{", "{a", "{_"] {
429
- assert!(
430
- placeholder_names(pattern).is_empty(),
431
- "`{pattern}` is outside the grammar, so it is not a placeholder"
432
- );
433
- assert_eq!(
434
- glob_with_placeholders_as_star(pattern),
435
- pattern,
436
- "`{pattern}` is not a placeholder, so the glob is unrewritten"
437
- );
438
- }
439
- }
440
-
441
- #[test]
442
- fn placeholder_names_accepts_the_whole_grammar() {
443
- // A name starts with a letter or `_` and continues with those plus
444
- // digits.
445
- assert_eq!(placeholder_names("{a}"), vec!["a".to_string()]);
446
- assert_eq!(placeholder_names("{_}"), vec!["_".to_string()]);
447
- assert_eq!(placeholder_names("{_a1}"), vec!["_a1".to_string()]);
448
- assert_eq!(placeholder_names("{A_1z}"), vec!["A_1z".to_string()]);
449
- }
450
-
451
- #[test]
452
- fn the_scan_resumes_at_the_byte_after_a_closing_brace() {
453
- // Leftmost-first and non-overlapping: back-to-back placeholders both
454
- // register, and every byte outside a span survives the rewrite.
455
- assert_eq!(
456
- placeholder_names("{a}{b}"),
457
- vec!["a".to_string(), "b".to_string()]
458
- );
459
- assert_eq!(glob_with_placeholders_as_star("x{a}y{b}z"), "x*y*z");
460
- }
461
-
462
- #[test]
463
- fn an_unclosed_brace_leaves_a_later_placeholder_intact() {
464
- // The `{` at 0 fails the grammar, so the scan advances one byte at a
465
- // time and still finds the real placeholder behind it.
466
- assert_eq!(placeholder_names("{a{b}"), vec!["b".to_string()]);
467
- assert_eq!(glob_with_placeholders_as_star("{a{b}"), "{a*");
468
- }
469
-
470
296
  /// Two files at depth 0, two under `folder/`, two under `folder/sub/`, one
471
297
  /// under a sibling directory.
472
298
  const FIXTURE: [&str; 7] = [
@@ -602,12 +428,12 @@ mod tests {
602
428
  }
603
429
 
604
430
  #[test]
605
- fn a_placeholder_matches_exactly_one_path_segment() {
431
+ fn a_braced_name_matches_only_itself() {
606
432
  let matcher = TableMatcher::new(&[("data/{id}/metadata.json", "a")], &[]).unwrap();
607
- assert_eq!(names(&matcher, "data/x/metadata.json"), vec!["a"]);
433
+ assert_eq!(names(&matcher, "data/{id}/metadata.json"), vec!["a"]);
608
434
  assert!(
609
435
  matcher
610
- .match_all(Path::new("data/x/y/metadata.json"))
436
+ .match_all(Path::new("data/x/metadata.json"))
611
437
  .is_empty()
612
438
  );
613
439
  }
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes