dirsql 0.4.68__tar.gz → 0.4.69__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 (304) hide show
  1. {dirsql-0.4.68 → dirsql-0.4.69}/Cargo.lock +3 -2
  2. {dirsql-0.4.68 → dirsql-0.4.69}/PKG-INFO +1 -1
  3. {dirsql-0.4.68/packages/rust → dirsql-0.4.69}/docs/context/troubleshooting.md +1 -1
  4. {dirsql-0.4.68/packages/rust → dirsql-0.4.69}/docs/context/usage.md +1 -1
  5. {dirsql-0.4.68 → dirsql-0.4.69}/docs/reference/cli.md +1 -1
  6. {dirsql-0.4.68 → dirsql-0.4.69}/docs/reference/http-api.md +1 -1
  7. {dirsql-0.4.68/packages/python → dirsql-0.4.69}/docs/reference/path-tables.md +17 -10
  8. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/Cargo.toml +1 -1
  9. dirsql-0.4.69/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +5 -0
  10. {dirsql-0.4.68 → dirsql-0.4.69/packages/python}/docs/context/troubleshooting.md +1 -1
  11. {dirsql-0.4.68 → dirsql-0.4.69/packages/python}/docs/context/usage.md +1 -1
  12. {dirsql-0.4.68/packages/rust → dirsql-0.4.69/packages/python}/docs/reference/cli.md +1 -1
  13. {dirsql-0.4.68/packages/rust → dirsql-0.4.69/packages/python}/docs/reference/http-api.md +1 -1
  14. {dirsql-0.4.68 → dirsql-0.4.69/packages/python}/docs/reference/path-tables.md +17 -10
  15. dirsql-0.4.69/packages/python/e2e-attestations/claude-1269-utf8-chars.json +7 -0
  16. dirsql-0.4.69/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +7 -0
  17. dirsql-0.4.69/packages/python/e2e-attestations/claude-1273-walk-prune.json +7 -0
  18. dirsql-0.4.69/packages/python/e2e-attestations/claude-1285-ingest-fast.json +7 -0
  19. dirsql-0.4.69/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +36 -0
  20. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/Cargo.toml +2 -1
  21. {dirsql-0.4.68/packages/python → dirsql-0.4.69/packages/rust}/docs/context/troubleshooting.md +1 -1
  22. {dirsql-0.4.68/packages/python → dirsql-0.4.69/packages/rust}/docs/context/usage.md +1 -1
  23. {dirsql-0.4.68/packages/python → dirsql-0.4.69/packages/rust}/docs/reference/cli.md +1 -1
  24. {dirsql-0.4.68/packages/python → dirsql-0.4.69/packages/rust}/docs/reference/http-api.md +1 -1
  25. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/reference/path-tables.md +17 -10
  26. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/db.rs +22 -17
  27. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/lib.rs +228 -22
  28. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/matcher.rs +113 -27
  29. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/on_file.rs +43 -11
  30. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/scanner.rs +195 -51
  31. {dirsql-0.4.68 → dirsql-0.4.69}/Cargo.toml +0 -0
  32. {dirsql-0.4.68 → dirsql-0.4.69}/README.md +0 -0
  33. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/__init__.py +0 -0
  34. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/_async.py +0 -0
  35. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/_dirsql.pyi +0 -0
  36. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/__init__.py +0 -0
  37. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/discover_plugins/__init__.py +0 -0
  38. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  39. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  40. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  41. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  42. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  43. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/main.py +0 -0
  44. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/cli/resolve_config_extensions.py +0 -0
  45. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/plan_entry_path.py +0 -0
  46. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/py.typed +0 -0
  47. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/read_config.py +0 -0
  48. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/resolve_configs_extension_specs.py +0 -0
  49. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/resolve_extension.py +0 -0
  50. {dirsql-0.4.68 → dirsql-0.4.69}/dirsql/resolve_package.py +0 -0
  51. {dirsql-0.4.68 → dirsql-0.4.69}/docs/.claude/CLAUDE.md +0 -0
  52. {dirsql-0.4.68 → dirsql-0.4.69}/docs/.vitepress/config.ts +0 -0
  53. {dirsql-0.4.68 → dirsql-0.4.69}/docs/.vitepress/theme/index.ts +0 -0
  54. {dirsql-0.4.68 → dirsql-0.4.69}/docs/.vitepress/theme/lang.ts +0 -0
  55. {dirsql-0.4.68 → dirsql-0.4.69}/docs/AGENTS.md +0 -0
  56. {dirsql-0.4.68 → dirsql-0.4.69}/docs/context/.gitattributes +0 -0
  57. {dirsql-0.4.68 → dirsql-0.4.69}/docs/context/recipes.md +0 -0
  58. {dirsql-0.4.68 → dirsql-0.4.69}/docs/explanation.md +0 -0
  59. {dirsql-0.4.68 → dirsql-0.4.69}/docs/getting-started.md +0 -0
  60. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/columns-from-paths.md +0 -0
  61. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/define-tables.md +0 -0
  62. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/embed.md +0 -0
  63. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/extract-from-contents.md +0 -0
  64. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/load-extension.md +0 -0
  65. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/parse-files-into-columns.md +0 -0
  66. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/persist.md +0 -0
  67. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/query-json.md +0 -0
  68. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/query-without-config.md +0 -0
  69. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/react-to-changes.md +0 -0
  70. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/search-by-meaning.md +0 -0
  71. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/search-indexes.md +0 -0
  72. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/skip-files.md +0 -0
  73. {dirsql-0.4.68 → dirsql-0.4.69}/docs/howto/write-a-plugin.md +0 -0
  74. {dirsql-0.4.68 → dirsql-0.4.69}/docs/index.md +0 -0
  75. {dirsql-0.4.68 → dirsql-0.4.69}/docs/package.json +0 -0
  76. {dirsql-0.4.68 → dirsql-0.4.69}/docs/plugins.md +0 -0
  77. {dirsql-0.4.68 → dirsql-0.4.69}/docs/pnpm-lock.yaml +0 -0
  78. {dirsql-0.4.68 → dirsql-0.4.69}/docs/pnpm-workspace.yaml +0 -0
  79. {dirsql-0.4.68 → dirsql-0.4.69}/docs/reference/columns.md +0 -0
  80. {dirsql-0.4.68 → dirsql-0.4.69}/docs/reference/config.md +0 -0
  81. {dirsql-0.4.68 → dirsql-0.4.69}/docs/reference/hooks.md +0 -0
  82. {dirsql-0.4.68 → dirsql-0.4.69}/docs/reference/sdk.md +0 -0
  83. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/CHANGELOG.md +0 -0
  84. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/MIGRATIONS.md +0 -0
  85. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/README.md +0 -0
  86. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  87. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  88. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  89. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  90. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  91. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  92. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  93. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  94. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  95. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  96. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  97. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  98. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  99. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  100. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  101. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  102. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  103. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  104. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  105. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  106. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  107. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  108. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  109. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  110. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  111. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  112. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  113. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  114. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  115. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  116. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  117. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  118. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  119. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  120. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  121. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  122. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  123. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/changelog.d/README.md +0 -0
  124. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/conftest.py +0 -0
  125. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/.claude/CLAUDE.md +0 -0
  126. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/.vitepress/config.ts +0 -0
  127. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  128. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  129. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/AGENTS.md +0 -0
  130. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/context/.gitattributes +0 -0
  131. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/context/recipes.md +0 -0
  132. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/explanation.md +0 -0
  133. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/getting-started.md +0 -0
  134. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/columns-from-paths.md +0 -0
  135. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/define-tables.md +0 -0
  136. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/embed.md +0 -0
  137. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/extract-from-contents.md +0 -0
  138. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/load-extension.md +0 -0
  139. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  140. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/persist.md +0 -0
  141. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/query-json.md +0 -0
  142. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/query-without-config.md +0 -0
  143. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/react-to-changes.md +0 -0
  144. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/search-by-meaning.md +0 -0
  145. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/search-indexes.md +0 -0
  146. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/skip-files.md +0 -0
  147. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/howto/write-a-plugin.md +0 -0
  148. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/index.md +0 -0
  149. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/package.json +0 -0
  150. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/plugins.md +0 -0
  151. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/pnpm-lock.yaml +0 -0
  152. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/pnpm-workspace.yaml +0 -0
  153. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/reference/columns.md +0 -0
  154. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/reference/config.md +0 -0
  155. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/reference/hooks.md +0 -0
  156. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/docs/reference/sdk.md +0 -0
  157. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  158. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  159. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  160. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  161. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  162. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  163. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  164. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  165. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  166. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  167. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  168. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  169. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  170. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  171. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  172. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  173. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  174. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  175. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  176. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  177. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  178. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  179. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  180. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  181. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  182. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  183. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  184. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  185. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  186. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  187. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  188. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  189. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  190. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  191. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  192. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  193. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  194. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  195. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  196. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  197. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  198. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  199. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  200. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  201. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  202. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  203. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  204. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  205. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  206. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  207. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  208. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  209. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  210. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  211. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  212. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  213. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  214. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  215. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  216. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  217. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  218. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  219. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  220. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  221. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  222. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  223. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  224. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  225. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  226. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  227. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  228. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  229. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  230. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  231. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  232. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  233. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/migrations.d/README.md +0 -0
  234. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/src/lib.rs +0 -0
  235. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/testing-conventions.toml +0 -0
  236. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/__init__.py +0 -0
  237. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/conftest.py +0 -0
  238. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/e2e/__init__.py +0 -0
  239. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  240. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  241. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/e2e/speed_of_light.py +0 -0
  242. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/integration/__init__.py +0 -0
  243. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/integration/binding/__init__.py +0 -0
  244. {dirsql-0.4.68 → dirsql-0.4.69}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  245. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/CHANGELOG.md +0 -0
  246. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/MIGRATIONS.md +0 -0
  247. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/README.md +0 -0
  248. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/benches/db_bench.rs +0 -0
  249. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/benches/differ_bench.rs +0 -0
  250. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/benches/matcher_bench.rs +0 -0
  251. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/benches/scanner_bench.rs +0 -0
  252. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/context/.gitattributes +0 -0
  253. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/context/recipes.md +0 -0
  254. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/explanation.md +0 -0
  255. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/getting-started.md +0 -0
  256. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  257. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/define-tables.md +0 -0
  258. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/embed.md +0 -0
  259. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  260. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/load-extension.md +0 -0
  261. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  262. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/persist.md +0 -0
  263. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/query-json.md +0 -0
  264. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/query-without-config.md +0 -0
  265. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/react-to-changes.md +0 -0
  266. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  267. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/search-indexes.md +0 -0
  268. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/skip-files.md +0 -0
  269. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  270. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/index.md +0 -0
  271. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/plugins.md +0 -0
  272. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/reference/columns.md +0 -0
  273. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/reference/config.md +0 -0
  274. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/reference/hooks.md +0 -0
  275. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/docs/reference/sdk.md +0 -0
  276. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/bin/dirsql.rs +0 -0
  277. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/context.rs +0 -0
  278. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/execute.rs +0 -0
  279. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/init.rs +0 -0
  280. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/mod.rs +0 -0
  281. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/repl.rs +0 -0
  282. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/router.rs +0 -0
  283. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/run.rs +0 -0
  284. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/serialize.rs +0 -0
  285. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/server.rs +0 -0
  286. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/cli/table.rs +0 -0
  287. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/command.rs +0 -0
  288. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/config.rs +0 -0
  289. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/default_config.toml +0 -0
  290. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/differ.rs +0 -0
  291. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/extension_resolution.rs +0 -0
  292. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/functions.rs +0 -0
  293. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/infer.rs +0 -0
  294. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/launcher.rs +0 -0
  295. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/parsed_vtab.rs +0 -0
  296. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/path_table.rs +0 -0
  297. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/persist.rs +0 -0
  298. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/progress.rs +0 -0
  299. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/row_event_flat.rs +0 -0
  300. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/sql_literal.rs +0 -0
  301. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/vtab.rs +0 -0
  302. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/vtab_scaffold.rs +0 -0
  303. {dirsql-0.4.68 → dirsql-0.4.69}/packages/rust/src/watcher.rs +0 -0
  304. {dirsql-0.4.68 → dirsql-0.4.69}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.68"
555
+ version = "0.4.69"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -574,6 +574,7 @@ dependencies = [
574
574
  "notify",
575
575
  "predicates",
576
576
  "reedline",
577
+ "regex",
577
578
  "reqwest",
578
579
  "rusqlite",
579
580
  "serde",
@@ -600,7 +601,7 @@ dependencies = [
600
601
 
601
602
  [[package]]
602
603
  name = "dirsql-py-ext"
603
- version = "0.4.68"
604
+ version = "0.4.69"
604
605
  dependencies = [
605
606
  "dirsql",
606
607
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.68
3
+ Version: 0.4.69
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
@@ -45,7 +45,7 @@ uvx dirsql "SELECT path FROM './**'" --format json
45
45
  ### Empty `[]` for files you can see
46
46
 
47
47
  - **You named a directory**, which lists one level only. `'./**'` and `'./docs/**'` are the recursive forms.
48
- - **The files are gitignored.** `--no-ignore` scans them:
48
+ - **The files are gitignored**, inside a git repo (outside one, no `.gitignore` applies). `--no-ignore` scans them:
49
49
 
50
50
  ```sh
51
51
  uvx dirsql "SELECT path FROM './**'" --format json --no-ignore
@@ -35,7 +35,7 @@ Every row has `path`, `basename`, `dir`, `ext` (no dot, `NULL` when absent), `si
35
35
 
36
36
  ### What a scan skips
37
37
 
38
- - **`.gitignore` is respected.** Pass `--no-ignore` to scan gitignored files too, or name the ignored directory outright: `'./build'` scans `build/`.
38
+ - **`.gitignore` is respected inside a git repo**, as git does; outside one (no enclosing `.git`) no `.gitignore` applies. Pass `--no-ignore` to scan gitignored files too, or name the ignored directory outright: `'./build'` scans `build/`.
39
39
  - **`node_modules` is skipped** unless the path names it: `'./node_modules/**'`.
40
40
  - **`'./**'` does not enter `.git`.** Naming it scans it: `'./.git/**'`.
41
41
  - **To match dotfiles, spell the dot:** `'./.github/**'`, `'./**/.env'`.
@@ -278,7 +278,7 @@ with all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
278
278
 
279
279
  ```bash
280
280
  curl -s localhost:7117/query -H 'content-type: application/json' \
281
- -d '{"sql":"SELECT basename, size FROM \'./\' ORDER BY size DESC LIMIT 5"}'
281
+ -d "{\"sql\":\"SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5\"}"
282
282
  ```
283
283
 
284
284
  Earlier versions served an implicit table named `files` here. It is gone; a
@@ -27,7 +27,7 @@ The `200` response is a JSON array of row objects keyed by column name:
27
27
  ```bash
28
28
  curl -s http://localhost:7117/query \
29
29
  -H 'content-type: application/json' \
30
- -d '{"sql":"SELECT COUNT(*) AS n FROM \'./\'"}' \
30
+ -d "{\"sql\":\"SELECT COUNT(*) AS n FROM './'\"}" \
31
31
  | jq
32
32
  ```
33
33
 
@@ -55,9 +55,10 @@ A path containing `*`, `?`, `[` or `{` is a glob and is used exactly as
55
55
  written: `*` matches within a single directory, `**` crosses directories.
56
56
 
57
57
  The scan starts at the last directory named outright before the first glob
58
- component -- `'./small/*.md'` walks `small/` and nothing else -- so a query
59
- over one directory costs what `find ./small` costs, however large the
60
- directories beside it.
58
+ component, and descends only as deep as the pattern can match --
59
+ `'./small/*.md'` lists `small/` and nothing else -- so a query over one
60
+ directory costs what `ls small` costs, however large the directories beside
61
+ or below it. Only `**` walks a whole subtree.
61
62
 
62
63
  A path naming a single file yields exactly one row. dirsql never splits a file
63
64
  into rows on its own — that is what a table's `on_file` hook is for.
@@ -260,15 +261,21 @@ skipped just like one at the top.
260
261
 
261
262
  ### `.gitignore`
262
263
 
263
- Path-table scans also respect `.gitignore` files by default, the way fd and
264
- ripgrep do: a `.gitignore` anywhere in the tree applies below its own
264
+ Path-table scans also respect `.gitignore` files by default, inside a git
265
+ repo, the way git, fd and ripgrep do: a `.gitignore` applies below its own
265
266
  directory, deeper files override shallower ones, `!pattern` re-includes, and
266
267
  an ignored directory is pruned rather than walked. In a typical repo this
267
- excludes build output, virtualenvs, and caches with zero ceremony. No `.git`
268
- directory is required — a `.gitignore` in any scanned directory counts — and
269
- the built-in defaults above remain as a floor for directories with no
268
+ excludes build output, virtualenvs, and caches with zero ceremony. The
269
+ built-in defaults above remain as a floor for directories with no
270
270
  `.gitignore` at all.
271
271
 
272
+ A `.gitignore` is in force only when a directory holding `.git` encloses it.
273
+ Outside a repo none applies, at the scan's start, above it or below it: a
274
+ `~/.claude` whose `.gitignore` is `*` still lists its files when `~/.claude`
275
+ is not a repo. Inside one, every `.gitignore` from the repo root down
276
+ applies, including those above the directory a scan starts in, so
277
+ `'./docs/*.log'` and `'./**/*.log'` agree about `docs/`.
278
+
272
279
  Pass [`--no-ignore`](./cli.md#flags) to restore the full walk — the
273
280
  determinism switch for scripted use, since results otherwise depend on
274
281
  `.gitignore` state. It disables only the `.gitignore` respect; the built-in
@@ -285,8 +292,8 @@ SELECT path FROM './node_modules/*/package.json'; -- scans it anyway
285
292
  SELECT path FROM './dist'; -- scans dist/ even when gitignored
286
293
  ```
287
294
 
288
- A `.gitignore` at or below the directory the scan starts in still filters
289
- beneath it; one above it is never read.
295
+ The `.gitignore` files in force there, including those above it, still
296
+ filter what lies beneath it.
290
297
 
291
298
  ### Hidden files
292
299
 
@@ -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.68"
7
+ version = "0.4.69"
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,5 @@
1
+ **Changed** A `.gitignore` applies to path-table scans only inside a git
2
+ repo, as in git, fd and ripgrep: one is in force only when a directory
3
+ holding `.git` encloses it. Outside a repo none applies, at the scan's start,
4
+ above it or below it, so a `~/.claude` whose `.gitignore` is `*` lists its
5
+ files. Inside a repo nothing changes. `--no-ignore` is unchanged.
@@ -45,7 +45,7 @@ uvx dirsql "SELECT path FROM './**'" --format json
45
45
  ### Empty `[]` for files you can see
46
46
 
47
47
  - **You named a directory**, which lists one level only. `'./**'` and `'./docs/**'` are the recursive forms.
48
- - **The files are gitignored.** `--no-ignore` scans them:
48
+ - **The files are gitignored**, inside a git repo (outside one, no `.gitignore` applies). `--no-ignore` scans them:
49
49
 
50
50
  ```sh
51
51
  uvx dirsql "SELECT path FROM './**'" --format json --no-ignore
@@ -35,7 +35,7 @@ Every row has `path`, `basename`, `dir`, `ext` (no dot, `NULL` when absent), `si
35
35
 
36
36
  ### What a scan skips
37
37
 
38
- - **`.gitignore` is respected.** Pass `--no-ignore` to scan gitignored files too, or name the ignored directory outright: `'./build'` scans `build/`.
38
+ - **`.gitignore` is respected inside a git repo**, as git does; outside one (no enclosing `.git`) no `.gitignore` applies. Pass `--no-ignore` to scan gitignored files too, or name the ignored directory outright: `'./build'` scans `build/`.
39
39
  - **`node_modules` is skipped** unless the path names it: `'./node_modules/**'`.
40
40
  - **`'./**'` does not enter `.git`.** Naming it scans it: `'./.git/**'`.
41
41
  - **To match dotfiles, spell the dot:** `'./.github/**'`, `'./**/.env'`.
@@ -278,7 +278,7 @@ with all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
278
278
 
279
279
  ```bash
280
280
  curl -s localhost:7117/query -H 'content-type: application/json' \
281
- -d '{"sql":"SELECT basename, size FROM \'./\' ORDER BY size DESC LIMIT 5"}'
281
+ -d "{\"sql\":\"SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5\"}"
282
282
  ```
283
283
 
284
284
  Earlier versions served an implicit table named `files` here. It is gone; a
@@ -27,7 +27,7 @@ The `200` response is a JSON array of row objects keyed by column name:
27
27
  ```bash
28
28
  curl -s http://localhost:7117/query \
29
29
  -H 'content-type: application/json' \
30
- -d '{"sql":"SELECT COUNT(*) AS n FROM \'./\'"}' \
30
+ -d "{\"sql\":\"SELECT COUNT(*) AS n FROM './'\"}" \
31
31
  | jq
32
32
  ```
33
33
 
@@ -55,9 +55,10 @@ A path containing `*`, `?`, `[` or `{` is a glob and is used exactly as
55
55
  written: `*` matches within a single directory, `**` crosses directories.
56
56
 
57
57
  The scan starts at the last directory named outright before the first glob
58
- component -- `'./small/*.md'` walks `small/` and nothing else -- so a query
59
- over one directory costs what `find ./small` costs, however large the
60
- directories beside it.
58
+ component, and descends only as deep as the pattern can match --
59
+ `'./small/*.md'` lists `small/` and nothing else -- so a query over one
60
+ directory costs what `ls small` costs, however large the directories beside
61
+ or below it. Only `**` walks a whole subtree.
61
62
 
62
63
  A path naming a single file yields exactly one row. dirsql never splits a file
63
64
  into rows on its own — that is what a table's `on_file` hook is for.
@@ -260,15 +261,21 @@ skipped just like one at the top.
260
261
 
261
262
  ### `.gitignore`
262
263
 
263
- Path-table scans also respect `.gitignore` files by default, the way fd and
264
- ripgrep do: a `.gitignore` anywhere in the tree applies below its own
264
+ Path-table scans also respect `.gitignore` files by default, inside a git
265
+ repo, the way git, fd and ripgrep do: a `.gitignore` applies below its own
265
266
  directory, deeper files override shallower ones, `!pattern` re-includes, and
266
267
  an ignored directory is pruned rather than walked. In a typical repo this
267
- excludes build output, virtualenvs, and caches with zero ceremony. No `.git`
268
- directory is required — a `.gitignore` in any scanned directory counts — and
269
- the built-in defaults above remain as a floor for directories with no
268
+ excludes build output, virtualenvs, and caches with zero ceremony. The
269
+ built-in defaults above remain as a floor for directories with no
270
270
  `.gitignore` at all.
271
271
 
272
+ A `.gitignore` is in force only when a directory holding `.git` encloses it.
273
+ Outside a repo none applies, at the scan's start, above it or below it: a
274
+ `~/.claude` whose `.gitignore` is `*` still lists its files when `~/.claude`
275
+ is not a repo. Inside one, every `.gitignore` from the repo root down
276
+ applies, including those above the directory a scan starts in, so
277
+ `'./docs/*.log'` and `'./**/*.log'` agree about `docs/`.
278
+
272
279
  Pass [`--no-ignore`](./cli.md#flags) to restore the full walk — the
273
280
  determinism switch for scripted use, since results otherwise depend on
274
281
  `.gitignore` state. It disables only the `.gitignore` respect; the built-in
@@ -285,8 +292,8 @@ SELECT path FROM './node_modules/*/package.json'; -- scans it anyway
285
292
  SELECT path FROM './dist'; -- scans dist/ even when gitignored
286
293
  ```
287
294
 
288
- A `.gitignore` at or below the directory the scan starts in still filters
289
- beneath it; one above it is never read.
295
+ The `.gitignore` files in force there, including those above it, still
296
+ filter what lies beneath it.
290
297
 
291
298
  ### Hidden files
292
299
 
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1791215881,
4
+ "exit_code": 0,
5
+ "commit": "e6e8716ac1fca13d6b03e48c7ff0551b48c7f537",
6
+ "branch": "claude/1269-utf8-chars"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1791218987,
4
+ "exit_code": 0,
5
+ "commit": "a433cc9c0cf5c32e3d731625dd63ecd040d9f235",
6
+ "branch": "claude/1272-ancestor-gitignore"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1791208404,
4
+ "exit_code": 0,
5
+ "commit": "e6dcbe0770d2d87d3a26d6318a4b1f716a677197",
6
+ "branch": "claude/1273-walk-prune"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1791218826,
4
+ "exit_code": 0,
5
+ "commit": "c31adf5c4c57cf7683aed2dddf847f1719d44016",
6
+ "branch": "claude/1285-ingest-fast"
7
+ }
@@ -0,0 +1,36 @@
1
+ ### Python SDK: `.gitignore` applies only inside a git repo
2
+
3
+ #### Summary
4
+
5
+ Path-tables used to apply `.gitignore` files with no git repo present. Now a
6
+ `.gitignore` is in force only when a directory holding `.git` encloses it,
7
+ as in git, fd and ripgrep. Every surface that resolves a path-table is
8
+ affected: the CLI, the REPL, the HTTP server, the SDKs, and the `--on-file`
9
+ form. No call changes. Outside a repo a query can return more rows; inside
10
+ one nothing changes.
11
+
12
+ #### Required changes
13
+
14
+ _None._
15
+
16
+ #### Deprecations removed
17
+
18
+ _None._
19
+
20
+ #### Behavior changes without code changes
21
+
22
+ - Outside a git repo, files a `.gitignore` names are listed. To hide them,
23
+ add `ignore` patterns in a config file, or run `git init`.
24
+
25
+ #### Verification
26
+
27
+ ```bash
28
+ cd "$(mktemp -d)"
29
+ printf '*.log\n' > .gitignore
30
+ touch a.md z.log
31
+ dirsql query "SELECT path FROM './*' ORDER BY path"
32
+ # expected: [{"path":"a.md"},{"path":"z.log"}]
33
+ git init -q
34
+ dirsql query "SELECT path FROM './*' ORDER BY path"
35
+ # expected: [{"path":"a.md"}]
36
+ ```
@@ -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.68"
9
+ version = "0.4.69"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -73,6 +73,7 @@ hex = { version = "0.4", optional = true }
73
73
  ignore = "0.4"
74
74
  indicatif = "0.18.6"
75
75
  notify = "7"
76
+ regex.workspace = true
76
77
  # The REPL's interactive line editor (history, Ctrl+R, multi-line entry).
77
78
  # CLI-only: a library consumer never pulls crossterm.
78
79
  reedline = { version = "0.49", optional = true }
@@ -45,7 +45,7 @@ uvx dirsql "SELECT path FROM './**'" --format json
45
45
  ### Empty `[]` for files you can see
46
46
 
47
47
  - **You named a directory**, which lists one level only. `'./**'` and `'./docs/**'` are the recursive forms.
48
- - **The files are gitignored.** `--no-ignore` scans them:
48
+ - **The files are gitignored**, inside a git repo (outside one, no `.gitignore` applies). `--no-ignore` scans them:
49
49
 
50
50
  ```sh
51
51
  uvx dirsql "SELECT path FROM './**'" --format json --no-ignore
@@ -35,7 +35,7 @@ Every row has `path`, `basename`, `dir`, `ext` (no dot, `NULL` when absent), `si
35
35
 
36
36
  ### What a scan skips
37
37
 
38
- - **`.gitignore` is respected.** Pass `--no-ignore` to scan gitignored files too, or name the ignored directory outright: `'./build'` scans `build/`.
38
+ - **`.gitignore` is respected inside a git repo**, as git does; outside one (no enclosing `.git`) no `.gitignore` applies. Pass `--no-ignore` to scan gitignored files too, or name the ignored directory outright: `'./build'` scans `build/`.
39
39
  - **`node_modules` is skipped** unless the path names it: `'./node_modules/**'`.
40
40
  - **`'./**'` does not enter `.git`.** Naming it scans it: `'./.git/**'`.
41
41
  - **To match dotfiles, spell the dot:** `'./.github/**'`, `'./**/.env'`.
@@ -278,7 +278,7 @@ with all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
278
278
 
279
279
  ```bash
280
280
  curl -s localhost:7117/query -H 'content-type: application/json' \
281
- -d '{"sql":"SELECT basename, size FROM \'./\' ORDER BY size DESC LIMIT 5"}'
281
+ -d "{\"sql\":\"SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5\"}"
282
282
  ```
283
283
 
284
284
  Earlier versions served an implicit table named `files` here. It is gone; a
@@ -27,7 +27,7 @@ The `200` response is a JSON array of row objects keyed by column name:
27
27
  ```bash
28
28
  curl -s http://localhost:7117/query \
29
29
  -H 'content-type: application/json' \
30
- -d '{"sql":"SELECT COUNT(*) AS n FROM \'./\'"}' \
30
+ -d "{\"sql\":\"SELECT COUNT(*) AS n FROM './'\"}" \
31
31
  | jq
32
32
  ```
33
33
 
@@ -55,9 +55,10 @@ A path containing `*`, `?`, `[` or `{` is a glob and is used exactly as
55
55
  written: `*` matches within a single directory, `**` crosses directories.
56
56
 
57
57
  The scan starts at the last directory named outright before the first glob
58
- component -- `'./small/*.md'` walks `small/` and nothing else -- so a query
59
- over one directory costs what `find ./small` costs, however large the
60
- directories beside it.
58
+ component, and descends only as deep as the pattern can match --
59
+ `'./small/*.md'` lists `small/` and nothing else -- so a query over one
60
+ directory costs what `ls small` costs, however large the directories beside
61
+ or below it. Only `**` walks a whole subtree.
61
62
 
62
63
  A path naming a single file yields exactly one row. dirsql never splits a file
63
64
  into rows on its own — that is what a table's `on_file` hook is for.
@@ -260,15 +261,21 @@ skipped just like one at the top.
260
261
 
261
262
  ### `.gitignore`
262
263
 
263
- Path-table scans also respect `.gitignore` files by default, the way fd and
264
- ripgrep do: a `.gitignore` anywhere in the tree applies below its own
264
+ Path-table scans also respect `.gitignore` files by default, inside a git
265
+ repo, the way git, fd and ripgrep do: a `.gitignore` applies below its own
265
266
  directory, deeper files override shallower ones, `!pattern` re-includes, and
266
267
  an ignored directory is pruned rather than walked. In a typical repo this
267
- excludes build output, virtualenvs, and caches with zero ceremony. No `.git`
268
- directory is required — a `.gitignore` in any scanned directory counts — and
269
- the built-in defaults above remain as a floor for directories with no
268
+ excludes build output, virtualenvs, and caches with zero ceremony. The
269
+ built-in defaults above remain as a floor for directories with no
270
270
  `.gitignore` at all.
271
271
 
272
+ A `.gitignore` is in force only when a directory holding `.git` encloses it.
273
+ Outside a repo none applies, at the scan's start, above it or below it: a
274
+ `~/.claude` whose `.gitignore` is `*` still lists its files when `~/.claude`
275
+ is not a repo. Inside one, every `.gitignore` from the repo root down
276
+ applies, including those above the directory a scan starts in, so
277
+ `'./docs/*.log'` and `'./**/*.log'` agree about `docs/`.
278
+
272
279
  Pass [`--no-ignore`](./cli.md#flags) to restore the full walk — the
273
280
  determinism switch for scripted use, since results otherwise depend on
274
281
  `.gitignore` state. It disables only the `.gitignore` respect; the built-in
@@ -285,8 +292,8 @@ SELECT path FROM './node_modules/*/package.json'; -- scans it anyway
285
292
  SELECT path FROM './dist'; -- scans dist/ even when gitignored
286
293
  ```
287
294
 
288
- A `.gitignore` at or below the directory the scan starts in still filters
289
- beneath it; one above it is never read.
295
+ The `.gitignore` files in force there, including those above it, still
296
+ filter what lies beneath it.
290
297
 
291
298
  ### Hidden files
292
299
 
@@ -1,4 +1,5 @@
1
1
  use rusqlite::Connection;
2
+ use rusqlite::types::{ToSql, ToSqlOutput, ValueRef};
2
3
  use std::collections::{HashMap, HashSet};
3
4
  use std::path::{Path, PathBuf};
4
5
  use std::sync::Arc;
@@ -1191,24 +1192,14 @@ pub enum Value {
1191
1192
  Blob(Vec<u8>),
1192
1193
  }
1193
1194
 
1194
- impl rusqlite::types::ToSql for Value {
1195
- fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> {
1195
+ impl ToSql for Value {
1196
+ fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
1196
1197
  match self {
1197
- Value::Null => Ok(rusqlite::types::ToSqlOutput::Owned(
1198
- rusqlite::types::Value::Null,
1199
- )),
1200
- Value::Integer(i) => Ok(rusqlite::types::ToSqlOutput::Owned(
1201
- rusqlite::types::Value::Integer(*i),
1202
- )),
1203
- Value::Real(f) => Ok(rusqlite::types::ToSqlOutput::Owned(
1204
- rusqlite::types::Value::Real(*f),
1205
- )),
1206
- Value::Text(s) => Ok(rusqlite::types::ToSqlOutput::Owned(
1207
- rusqlite::types::Value::Text(s.clone()),
1208
- )),
1209
- Value::Blob(b) => Ok(rusqlite::types::ToSqlOutput::Owned(
1210
- rusqlite::types::Value::Blob(b.clone()),
1211
- )),
1198
+ Value::Null => Ok(ToSqlOutput::Owned(rusqlite::types::Value::Null)),
1199
+ Value::Integer(i) => Ok(ToSqlOutput::Owned(rusqlite::types::Value::Integer(*i))),
1200
+ Value::Real(f) => Ok(ToSqlOutput::Owned(rusqlite::types::Value::Real(*f))),
1201
+ Value::Text(s) => Ok(ToSqlOutput::Borrowed(ValueRef::Text(s.as_bytes()))),
1202
+ Value::Blob(b) => Ok(ToSqlOutput::Borrowed(ValueRef::Blob(b))),
1212
1203
  }
1213
1204
  }
1214
1205
  }
@@ -1283,6 +1274,20 @@ impl From<rusqlite::types::Value> for Value {
1283
1274
  mod tests {
1284
1275
  use super::*;
1285
1276
 
1277
+ #[test]
1278
+ fn text_and_blob_values_bind_without_copying() {
1279
+ let text = Value::Text("abc".into());
1280
+ let blob = Value::Blob(vec![1, 2]);
1281
+ assert_eq!(
1282
+ text.to_sql().unwrap(),
1283
+ ToSqlOutput::Borrowed(ValueRef::Text(b"abc"))
1284
+ );
1285
+ assert_eq!(
1286
+ blob.to_sql().unwrap(),
1287
+ ToSqlOutput::Borrowed(ValueRef::Blob(&[1, 2]))
1288
+ );
1289
+ }
1290
+
1286
1291
  #[test]
1287
1292
  fn create_table_from_ddl() {
1288
1293
  let db = Db::new().unwrap();