dirsql 0.4.66__tar.gz → 0.4.67__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 (279) hide show
  1. {dirsql-0.4.66 → dirsql-0.4.67}/Cargo.lock +2 -2
  2. {dirsql-0.4.66 → dirsql-0.4.67}/PKG-INFO +1 -1
  3. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/skip-files.md +4 -2
  4. {dirsql-0.4.66 → dirsql-0.4.67}/docs/reference/cli.md +4 -2
  5. {dirsql-0.4.66/packages/python → dirsql-0.4.67}/docs/reference/path-tables.md +19 -4
  6. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/Cargo.toml +1 -1
  7. dirsql-0.4.67/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +6 -0
  8. {dirsql-0.4.66/packages/rust → dirsql-0.4.67/packages/python}/docs/howto/skip-files.md +4 -2
  9. {dirsql-0.4.66/packages/rust → dirsql-0.4.67/packages/python}/docs/reference/cli.md +4 -2
  10. {dirsql-0.4.66 → dirsql-0.4.67/packages/python}/docs/reference/path-tables.md +19 -4
  11. dirsql-0.4.67/packages/python/e2e-attestations/claude-1249-dotfiles.json +7 -0
  12. dirsql-0.4.67/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +45 -0
  13. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/Cargo.toml +1 -1
  14. {dirsql-0.4.66/packages/python → dirsql-0.4.67/packages/rust}/docs/howto/skip-files.md +4 -2
  15. {dirsql-0.4.66/packages/python → dirsql-0.4.67/packages/rust}/docs/reference/cli.md +4 -2
  16. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/reference/path-tables.md +19 -4
  17. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/scanner.rs +143 -24
  18. {dirsql-0.4.66 → dirsql-0.4.67}/Cargo.toml +0 -0
  19. {dirsql-0.4.66 → dirsql-0.4.67}/README.md +0 -0
  20. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/__init__.py +0 -0
  21. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/_async.py +0 -0
  22. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/_dirsql.pyi +0 -0
  23. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/__init__.py +0 -0
  24. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/discover_plugins/__init__.py +0 -0
  25. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  26. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  27. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  28. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  29. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  30. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/main.py +0 -0
  31. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/cli/resolve_config_extensions.py +0 -0
  32. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/plan_entry_path.py +0 -0
  33. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/py.typed +0 -0
  34. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/read_config.py +0 -0
  35. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/resolve_configs_extension_specs.py +0 -0
  36. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/resolve_extension.py +0 -0
  37. {dirsql-0.4.66 → dirsql-0.4.67}/dirsql/resolve_package.py +0 -0
  38. {dirsql-0.4.66 → dirsql-0.4.67}/docs/.claude/CLAUDE.md +0 -0
  39. {dirsql-0.4.66 → dirsql-0.4.67}/docs/.vitepress/config.ts +0 -0
  40. {dirsql-0.4.66 → dirsql-0.4.67}/docs/.vitepress/theme/index.ts +0 -0
  41. {dirsql-0.4.66 → dirsql-0.4.67}/docs/.vitepress/theme/lang.ts +0 -0
  42. {dirsql-0.4.66 → dirsql-0.4.67}/docs/AGENTS.md +0 -0
  43. {dirsql-0.4.66 → dirsql-0.4.67}/docs/explanation.md +0 -0
  44. {dirsql-0.4.66 → dirsql-0.4.67}/docs/getting-started.md +0 -0
  45. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/columns-from-paths.md +0 -0
  46. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/define-tables.md +0 -0
  47. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/embed.md +0 -0
  48. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/extract-from-contents.md +0 -0
  49. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/load-extension.md +0 -0
  50. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/parse-files-into-columns.md +0 -0
  51. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/persist.md +0 -0
  52. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/query-json.md +0 -0
  53. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/query-without-config.md +0 -0
  54. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/react-to-changes.md +0 -0
  55. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/search-by-meaning.md +0 -0
  56. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/search-indexes.md +0 -0
  57. {dirsql-0.4.66 → dirsql-0.4.67}/docs/howto/write-a-plugin.md +0 -0
  58. {dirsql-0.4.66 → dirsql-0.4.67}/docs/index.md +0 -0
  59. {dirsql-0.4.66 → dirsql-0.4.67}/docs/package.json +0 -0
  60. {dirsql-0.4.66 → dirsql-0.4.67}/docs/plugins.md +0 -0
  61. {dirsql-0.4.66 → dirsql-0.4.67}/docs/pnpm-lock.yaml +0 -0
  62. {dirsql-0.4.66 → dirsql-0.4.67}/docs/pnpm-workspace.yaml +0 -0
  63. {dirsql-0.4.66 → dirsql-0.4.67}/docs/reference/columns.md +0 -0
  64. {dirsql-0.4.66 → dirsql-0.4.67}/docs/reference/config.md +0 -0
  65. {dirsql-0.4.66 → dirsql-0.4.67}/docs/reference/hooks.md +0 -0
  66. {dirsql-0.4.66 → dirsql-0.4.67}/docs/reference/http-api.md +0 -0
  67. {dirsql-0.4.66 → dirsql-0.4.67}/docs/reference/sdk.md +0 -0
  68. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/CHANGELOG.md +0 -0
  69. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/MIGRATIONS.md +0 -0
  70. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/README.md +0 -0
  71. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  72. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  73. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  74. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  75. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  76. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  77. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  78. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  79. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  80. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  81. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  82. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  83. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  84. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  85. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  86. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  87. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  88. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  89. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  90. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  91. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  92. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  93. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  94. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  95. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  96. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  97. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  98. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  99. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  100. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  101. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  102. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  103. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  104. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  105. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/changelog.d/README.md +0 -0
  106. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/conftest.py +0 -0
  107. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/.claude/CLAUDE.md +0 -0
  108. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/.vitepress/config.ts +0 -0
  109. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  110. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  111. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/AGENTS.md +0 -0
  112. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/explanation.md +0 -0
  113. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/getting-started.md +0 -0
  114. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/columns-from-paths.md +0 -0
  115. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/define-tables.md +0 -0
  116. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/embed.md +0 -0
  117. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/extract-from-contents.md +0 -0
  118. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/load-extension.md +0 -0
  119. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  120. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/persist.md +0 -0
  121. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/query-json.md +0 -0
  122. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/query-without-config.md +0 -0
  123. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/react-to-changes.md +0 -0
  124. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/search-by-meaning.md +0 -0
  125. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/search-indexes.md +0 -0
  126. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/howto/write-a-plugin.md +0 -0
  127. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/index.md +0 -0
  128. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/package.json +0 -0
  129. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/plugins.md +0 -0
  130. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/pnpm-lock.yaml +0 -0
  131. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/pnpm-workspace.yaml +0 -0
  132. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/reference/columns.md +0 -0
  133. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/reference/config.md +0 -0
  134. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/reference/hooks.md +0 -0
  135. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/reference/http-api.md +0 -0
  136. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/docs/reference/sdk.md +0 -0
  137. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  138. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  139. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  140. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  141. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  142. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  143. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  144. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  145. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  146. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  147. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  148. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  149. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  150. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  151. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  152. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  153. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  154. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  155. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  156. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  157. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  158. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  159. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  160. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  161. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  162. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  163. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  164. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  165. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  166. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  167. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  168. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  169. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  170. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  171. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  172. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  173. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  174. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  175. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  176. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  177. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  178. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  179. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  180. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  181. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  182. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  183. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  184. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  185. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  186. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  187. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  188. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  189. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  190. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  191. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  192. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  193. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  194. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  195. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  196. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  197. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  198. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  199. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  200. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  201. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  202. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  203. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  204. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  205. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  206. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  207. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/migrations.d/README.md +0 -0
  208. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/src/lib.rs +0 -0
  209. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/testing-conventions.toml +0 -0
  210. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/__init__.py +0 -0
  211. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/conftest.py +0 -0
  212. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/e2e/__init__.py +0 -0
  213. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  214. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  215. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/e2e/speed_of_light.py +0 -0
  216. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/integration/__init__.py +0 -0
  217. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/integration/binding/__init__.py +0 -0
  218. {dirsql-0.4.66 → dirsql-0.4.67}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  219. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/CHANGELOG.md +0 -0
  220. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/MIGRATIONS.md +0 -0
  221. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/README.md +0 -0
  222. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/benches/db_bench.rs +0 -0
  223. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/benches/differ_bench.rs +0 -0
  224. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/benches/matcher_bench.rs +0 -0
  225. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/benches/scanner_bench.rs +0 -0
  226. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/explanation.md +0 -0
  227. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/getting-started.md +0 -0
  228. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  229. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/define-tables.md +0 -0
  230. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/embed.md +0 -0
  231. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  232. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/load-extension.md +0 -0
  233. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  234. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/persist.md +0 -0
  235. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/query-json.md +0 -0
  236. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/query-without-config.md +0 -0
  237. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/react-to-changes.md +0 -0
  238. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  239. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/search-indexes.md +0 -0
  240. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  241. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/index.md +0 -0
  242. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/plugins.md +0 -0
  243. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/reference/columns.md +0 -0
  244. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/reference/config.md +0 -0
  245. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/reference/hooks.md +0 -0
  246. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/reference/http-api.md +0 -0
  247. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/docs/reference/sdk.md +0 -0
  248. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/bin/dirsql.rs +0 -0
  249. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/execute.rs +0 -0
  250. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/init.rs +0 -0
  251. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/mod.rs +0 -0
  252. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/repl.rs +0 -0
  253. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/router.rs +0 -0
  254. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/run.rs +0 -0
  255. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/serialize.rs +0 -0
  256. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/server.rs +0 -0
  257. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/cli/table.rs +0 -0
  258. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/command.rs +0 -0
  259. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/config.rs +0 -0
  260. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/db.rs +0 -0
  261. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/default_config.toml +0 -0
  262. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/differ.rs +0 -0
  263. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/extension_resolution.rs +0 -0
  264. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/functions.rs +0 -0
  265. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/infer.rs +0 -0
  266. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/launcher.rs +0 -0
  267. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/lib.rs +0 -0
  268. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/matcher.rs +0 -0
  269. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/on_file.rs +0 -0
  270. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/parsed_vtab.rs +0 -0
  271. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/path_table.rs +0 -0
  272. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/persist.rs +0 -0
  273. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/progress.rs +0 -0
  274. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/row_event_flat.rs +0 -0
  275. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/sql_literal.rs +0 -0
  276. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/vtab.rs +0 -0
  277. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/vtab_scaffold.rs +0 -0
  278. {dirsql-0.4.66 → dirsql-0.4.67}/packages/rust/src/watcher.rs +0 -0
  279. {dirsql-0.4.66 → dirsql-0.4.67}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.66"
555
+ version = "0.4.67"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -600,7 +600,7 @@ dependencies = [
600
600
 
601
601
  [[package]]
602
602
  name = "dirsql-py-ext"
603
- version = "0.4.66"
603
+ version = "0.4.67"
604
604
  dependencies = [
605
605
  "dirsql",
606
606
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.66
3
+ Version: 0.4.67
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
@@ -47,8 +47,10 @@ dirsql query "SELECT basename FROM notes ORDER BY basename" -c ./.dirsql.toml
47
47
  ## Notes
48
48
 
49
49
  - `ignore` lives in a config file, so it needs one:
50
- [configless mode](../reference/cli.md#configless-mode) indexes
51
- everything with no ignores.
50
+ [configless mode](../reference/cli.md#configless-mode) has no `ignore`
51
+ list, though its path-tables still apply the built-in
52
+ [skip rules](../reference/path-tables.md#skip-rules) and respect
53
+ `.gitignore`.
52
54
  - The top-level `.dirsql/` directory is always excluded, ignore list or
53
55
  not — it is reserved for `dirsql`'s own metadata
54
56
  ([config reference](../reference/config.md#dirsql-keys)).
@@ -269,8 +269,10 @@ defines **no named tables**. Filesystem queries go through
269
269
  scanned live. A `./.dirsql.toml` sitting in the current directory is **not**
270
270
  auto-loaded (pass it with `-c ./.dirsql.toml` to use it).
271
271
 
272
- `'./'` is the whole root — every file at any depth, one row per file, with
273
- all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
272
+ `'./'` lists the files directly inside the root, one level, like `ls`;
273
+ `'./**'` reaches every depth. Both scans apply the path-table
274
+ [skip rules](./path-tables.md#skip-rules), and each returns one row per file
275
+ with all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
274
276
  `size`, `mtime`, `ctime`.
275
277
 
276
278
  ```bash
@@ -287,10 +287,25 @@ beneath it; one above it is never read.
287
287
 
288
288
  ### Hidden files
289
289
 
290
- Dotfiles are ordinary files: `'./'` and `'./*'` include them, with or without
291
- `--no-ignore`. This is a deliberate divergence from fd/ripgrep — querying
292
- dotfile directories (`.claude/`, …) is a first-class `dirsql` use case. Add an
293
- `ignore` pattern if you would rather not see them.
290
+ A path component starting with `.` is skipped unless the path spells it, the
291
+ rule `ls` and `fd` use. `'./'` and `'./**'` skip `.gitignore`, `.env` and
292
+ everything under `.claude/`; naming the component lists it:
293
+
294
+ | You write | dirsql scans |
295
+ | --- | --- |
296
+ | `'./**'` | every file, skipping dot-named files and directories at any depth |
297
+ | `'./.claude'`, `'./.claude/**'` | the files under `.claude/` |
298
+ | `'./.env'` | that one file |
299
+ | `'./**/.env'` | every `.env` whose parent directories are not themselves dot-named |
300
+ | `'~/.claude/projects/*/*.jsonl'` | the walk starts inside `.claude/`, so nothing there is hidden |
301
+
302
+ A spelled component may be a glob of its own: `'./.env*'` lists `.env.local`,
303
+ and `'./.*'` lists every dot-named entry one level down. A dot component the
304
+ path does not spell stays hidden however deep the scan goes, so
305
+ `'./.claude/**'` lists `.claude/sub/notes.md` but not `.claude/sub/.cache/x`.
306
+
307
+ This is independent of `.gitignore`: [`--no-ignore`](./cli.md#flags) restores
308
+ gitignored files and leaves dot-named entries hidden.
294
309
 
295
310
  ## Joining against declared tables
296
311
 
@@ -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.66"
7
+ version = "0.4.67"
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,6 @@
1
+ **Changed** A path-table hides dot-named files and directories unless the
2
+ path spells them, the rule `ls` and `fd` use. `'./'` and `'./**'` skip
3
+ `.gitignore`, `.env` and everything under `.claude/`; `'./.claude/**'`,
4
+ `'./.env'` and `'./**/.env'` list them. A spelled component may be a glob
5
+ (`'./.env*'`, `'./.*'`). The rule is independent of `--no-ignore`, which
6
+ still governs `.gitignore` only. Declared `[[table]]` globs are unchanged.
@@ -47,8 +47,10 @@ dirsql query "SELECT basename FROM notes ORDER BY basename" -c ./.dirsql.toml
47
47
  ## Notes
48
48
 
49
49
  - `ignore` lives in a config file, so it needs one:
50
- [configless mode](../reference/cli.md#configless-mode) indexes
51
- everything with no ignores.
50
+ [configless mode](../reference/cli.md#configless-mode) has no `ignore`
51
+ list, though its path-tables still apply the built-in
52
+ [skip rules](../reference/path-tables.md#skip-rules) and respect
53
+ `.gitignore`.
52
54
  - The top-level `.dirsql/` directory is always excluded, ignore list or
53
55
  not — it is reserved for `dirsql`'s own metadata
54
56
  ([config reference](../reference/config.md#dirsql-keys)).
@@ -269,8 +269,10 @@ defines **no named tables**. Filesystem queries go through
269
269
  scanned live. A `./.dirsql.toml` sitting in the current directory is **not**
270
270
  auto-loaded (pass it with `-c ./.dirsql.toml` to use it).
271
271
 
272
- `'./'` is the whole root — every file at any depth, one row per file, with
273
- all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
272
+ `'./'` lists the files directly inside the root, one level, like `ls`;
273
+ `'./**'` reaches every depth. Both scans apply the path-table
274
+ [skip rules](./path-tables.md#skip-rules), and each returns one row per file
275
+ with all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
274
276
  `size`, `mtime`, `ctime`.
275
277
 
276
278
  ```bash
@@ -287,10 +287,25 @@ beneath it; one above it is never read.
287
287
 
288
288
  ### Hidden files
289
289
 
290
- Dotfiles are ordinary files: `'./'` and `'./*'` include them, with or without
291
- `--no-ignore`. This is a deliberate divergence from fd/ripgrep — querying
292
- dotfile directories (`.claude/`, …) is a first-class `dirsql` use case. Add an
293
- `ignore` pattern if you would rather not see them.
290
+ A path component starting with `.` is skipped unless the path spells it, the
291
+ rule `ls` and `fd` use. `'./'` and `'./**'` skip `.gitignore`, `.env` and
292
+ everything under `.claude/`; naming the component lists it:
293
+
294
+ | You write | dirsql scans |
295
+ | --- | --- |
296
+ | `'./**'` | every file, skipping dot-named files and directories at any depth |
297
+ | `'./.claude'`, `'./.claude/**'` | the files under `.claude/` |
298
+ | `'./.env'` | that one file |
299
+ | `'./**/.env'` | every `.env` whose parent directories are not themselves dot-named |
300
+ | `'~/.claude/projects/*/*.jsonl'` | the walk starts inside `.claude/`, so nothing there is hidden |
301
+
302
+ A spelled component may be a glob of its own: `'./.env*'` lists `.env.local`,
303
+ and `'./.*'` lists every dot-named entry one level down. A dot component the
304
+ path does not spell stays hidden however deep the scan goes, so
305
+ `'./.claude/**'` lists `.claude/sub/notes.md` but not `.claude/sub/.cache/x`.
306
+
307
+ This is independent of `.gitignore`: [`--no-ignore`](./cli.md#flags) restores
308
+ gitignored files and leaves dot-named entries hidden.
294
309
 
295
310
  ## Joining against declared tables
296
311
 
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1791166584,
4
+ "exit_code": 0,
5
+ "commit": "009125bdab94f7f845df78b251328aa590fe75d9",
6
+ "branch": "claude/1249-dotfiles"
7
+ }
@@ -0,0 +1,45 @@
1
+ ### Core: path-tables hide dot-named entries unless the path spells them
2
+
3
+ #### Summary
4
+
5
+ A path-table scan now skips any file or directory whose name starts with `.`
6
+ unless that component is spelled in the table's path -- the rule `ls` and
7
+ `fd` use. It used to list dotfiles like any other file. Every surface that
8
+ resolves a path-table is affected: the CLI, the REPL, the HTTP server, the
9
+ SDKs, and the `--on-file` form. A query that relied on `'./'` or `'./**'`
10
+ reaching `.gitignore`, `.env` or a `.claude/` tree must name the dot
11
+ component. Declared `[[table]]` globs in `.dirsql.toml` are unchanged.
12
+
13
+ #### Required changes
14
+
15
+ | Surface | Before | After |
16
+ | ------- | ------ | ----- |
17
+ | A dot directory's files | `SELECT * FROM './**'` (rows under `.claude/` included) | `SELECT * FROM './.claude/**'` |
18
+ | One dotfile | `SELECT * FROM './*'` (`.env` included) | `SELECT * FROM './.env'` |
19
+ | Dotfiles at any depth | `SELECT * FROM './**'` | `SELECT * FROM './**/.env'` |
20
+ | Every dot-named entry, one level | `SELECT * FROM './*'` | `SELECT * FROM './.*'` |
21
+ | Spelled dot prefix (unchanged) | `SELECT * FROM '~/.claude/projects/*/*.jsonl'` | `SELECT * FROM '~/.claude/projects/*/*.jsonl'` |
22
+
23
+ #### Deprecations removed
24
+
25
+ _None._
26
+
27
+ #### Behavior changes without code changes
28
+
29
+ - `'./'`, `'./*'`, `'./**'` and every other path-table whose path spells no
30
+ dot component return no dot-named files and do not walk dot-named
31
+ directories, at any depth.
32
+ - `--no-ignore` (`no_ignore` / `noIgnore` in the SDKs) restores gitignored
33
+ files only; dot-named entries stay hidden under it.
34
+
35
+ #### Verification
36
+
37
+ ```python
38
+ # root holds top.md, .env and .claude/notes.md
39
+ rows = await DirSQL(root).query("SELECT path FROM './**' ORDER BY path")
40
+ # expected: [{"path": "top.md"}]
41
+ rows = await DirSQL(root).query("SELECT path FROM './.claude/**'")
42
+ # expected: [{"path": ".claude/notes.md"}]
43
+ rows = await DirSQL(root).query("SELECT path FROM './.env'")
44
+ # expected: [{"path": ".env"}]
45
+ ```
@@ -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.66"
9
+ version = "0.4.67"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -47,8 +47,10 @@ dirsql query "SELECT basename FROM notes ORDER BY basename" -c ./.dirsql.toml
47
47
  ## Notes
48
48
 
49
49
  - `ignore` lives in a config file, so it needs one:
50
- [configless mode](../reference/cli.md#configless-mode) indexes
51
- everything with no ignores.
50
+ [configless mode](../reference/cli.md#configless-mode) has no `ignore`
51
+ list, though its path-tables still apply the built-in
52
+ [skip rules](../reference/path-tables.md#skip-rules) and respect
53
+ `.gitignore`.
52
54
  - The top-level `.dirsql/` directory is always excluded, ignore list or
53
55
  not — it is reserved for `dirsql`'s own metadata
54
56
  ([config reference](../reference/config.md#dirsql-keys)).
@@ -269,8 +269,10 @@ defines **no named tables**. Filesystem queries go through
269
269
  scanned live. A `./.dirsql.toml` sitting in the current directory is **not**
270
270
  auto-loaded (pass it with `-c ./.dirsql.toml` to use it).
271
271
 
272
- `'./'` is the whole root — every file at any depth, one row per file, with
273
- all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
272
+ `'./'` lists the files directly inside the root, one level, like `ls`;
273
+ `'./**'` reaches every depth. Both scans apply the path-table
274
+ [skip rules](./path-tables.md#skip-rules), and each returns one row per file
275
+ with all seven [stat columns](./columns.md): `path`, `basename`, `dir`, `ext`,
274
276
  `size`, `mtime`, `ctime`.
275
277
 
276
278
  ```bash
@@ -287,10 +287,25 @@ beneath it; one above it is never read.
287
287
 
288
288
  ### Hidden files
289
289
 
290
- Dotfiles are ordinary files: `'./'` and `'./*'` include them, with or without
291
- `--no-ignore`. This is a deliberate divergence from fd/ripgrep — querying
292
- dotfile directories (`.claude/`, …) is a first-class `dirsql` use case. Add an
293
- `ignore` pattern if you would rather not see them.
290
+ A path component starting with `.` is skipped unless the path spells it, the
291
+ rule `ls` and `fd` use. `'./'` and `'./**'` skip `.gitignore`, `.env` and
292
+ everything under `.claude/`; naming the component lists it:
293
+
294
+ | You write | dirsql scans |
295
+ | --- | --- |
296
+ | `'./**'` | every file, skipping dot-named files and directories at any depth |
297
+ | `'./.claude'`, `'./.claude/**'` | the files under `.claude/` |
298
+ | `'./.env'` | that one file |
299
+ | `'./**/.env'` | every `.env` whose parent directories are not themselves dot-named |
300
+ | `'~/.claude/projects/*/*.jsonl'` | the walk starts inside `.claude/`, so nothing there is hidden |
301
+
302
+ A spelled component may be a glob of its own: `'./.env*'` lists `.env.local`,
303
+ and `'./.*'` lists every dot-named entry one level down. A dot component the
304
+ path does not spell stays hidden however deep the scan goes, so
305
+ `'./.claude/**'` lists `.claude/sub/notes.md` but not `.claude/sub/.cache/x`.
306
+
307
+ This is independent of `.gitignore`: [`--no-ignore`](./cli.md#flags) restores
308
+ gitignored files and leaves dot-named entries hidden.
294
309
 
295
310
  ## Joining against declared tables
296
311
 
@@ -103,13 +103,15 @@ fn scan_below(
103
103
  /// Skip rules are judged on paths relative to `root`, so a table rooted at a
104
104
  /// directory the rules would otherwise skip still scans it.
105
105
  ///
106
- /// Symlinks are followed as `bash -O globstar` follows them (see
107
- /// [`PathGlob`]).
106
+ /// A dot-named entry is skipped unless `glob` spells it, and symlinks are
107
+ /// followed as `bash -O globstar` follows them (see [`PathGlob`]); the walk
108
+ /// starts at the path's literal prefix, so a dot directory named there is
109
+ /// already inside.
108
110
  ///
109
111
  /// With `gitignore` set, `.gitignore` files apply hierarchically (each one
110
- /// below its own directory) and prune traversal, like fd/ripgrep — except
111
- /// that hidden files are still scanned, and no `.git` directory is required.
112
- /// Only files at or below `root` are read; one above it has no say.
112
+ /// below its own directory) and prune traversal, like fd/ripgrep, and no
113
+ /// `.git` directory is required. Only files at or below `root` are read; one
114
+ /// above it has no say.
113
115
  pub fn scan_glob(
114
116
  root: &Path,
115
117
  glob: &PathGlob,
@@ -139,17 +141,24 @@ fn is_wanted(glob: &PathGlob, ignore: &TableMatcher, rel_path: &Path) -> bool {
139
141
  }
140
142
 
141
143
  /// A path-table's glob as [`scan_glob`] reads it: the files it matches, and
142
- /// the same pattern split into `/`-separated components, which decide where
143
- /// the walk may follow a symlink.
144
+ /// the dot-named entries it spells out and so lets the walk into, and the
145
+ /// same pattern split into `/`-separated components, which decide where the
146
+ /// walk may follow a symlink.
144
147
  ///
145
- /// The rule is bash's (`globstar`, 4.3 and later). A symlinked file is a file.
146
- /// A symlinked directory is entered by any component except `**`, which never
147
- /// traverses one, though it may stop on one for the next component to enter.
148
- /// Each link crossed spends a component, so a cycle cannot recurse without
149
- /// bound.
148
+ /// A component beginning with `.` is spelled; `.claude` and `.env` admit
149
+ /// exactly those names, `.*` any dot-named entry, as in the shell. Every
150
+ /// other dot-named file or directory is skipped, the rule `ls` and `fd` use.
151
+ /// A dot-named symlink is a dot-named entry like any other.
152
+ ///
153
+ /// The symlink rule is bash's (`globstar`, 4.3 and later). A symlinked file
154
+ /// is a file. A symlinked directory is entered by any component except `**`,
155
+ /// which never traverses one, though it may stop on one for the next
156
+ /// component to enter. Each link crossed spends a component, so a cycle
157
+ /// cannot recurse without bound.
150
158
  #[derive(Debug)]
151
159
  pub struct PathGlob {
152
160
  files: GlobSet,
161
+ spelled_dot_names: GlobSet,
153
162
  components: Vec<Component>,
154
163
  }
155
164
 
@@ -225,8 +234,13 @@ impl PathGlob {
225
234
  pub fn compile_glob(pattern: &str) -> Result<PathGlob, globset::Error> {
226
235
  let mut files = GlobSetBuilder::new();
227
236
  files.add(compile_component(pattern)?);
237
+ let mut spelled = GlobSetBuilder::new();
238
+ for component in pattern.split('/').filter(|c| is_dot_named(OsStr::new(c))) {
239
+ spelled.add(compile_component(component)?);
240
+ }
228
241
  Ok(PathGlob {
229
242
  files: files.build()?,
243
+ spelled_dot_names: spelled.build()?,
230
244
  components: compile_components(pattern),
231
245
  })
232
246
  }
@@ -235,6 +249,10 @@ fn compile_component(pattern: &str) -> Result<globset::Glob, globset::Error> {
235
249
  GlobBuilder::new(pattern).literal_separator(true).build()
236
250
  }
237
251
 
252
+ fn is_dot_named(name: &OsStr) -> bool {
253
+ name.as_encoded_bytes().first() == Some(&b'.')
254
+ }
255
+
238
256
  /// A pattern whose components do not compile on their own (an alternation
239
257
  /// spanning a `/`) gets none, so the walk follows no symlinked directory.
240
258
  fn compile_components(pattern: &str) -> Vec<Component> {
@@ -271,10 +289,11 @@ pub(crate) fn parse_gitignore_arg(arg: &str) -> Result<bool, String> {
271
289
  /// `root`-relative path, siblings in name order, so the whole walk comes out
272
290
  /// in path order without a sort at the end. Prunes the reserved top-level
273
291
  /// `.dirsql/` subtree and any directory the skip rules ignore wholesale, so an
274
- /// ignored tree is never read at all. With `gitignore` set, entries a
275
- /// `.gitignore` in force ignores are pruned/skipped too. Symlinks are followed
276
- /// only as `glob` allows, and not at all without one; a broken link or an
277
- /// unreadable directory contributes nothing.
292
+ /// ignored tree is never read at all. With `glob` given, a dot-named entry it
293
+ /// does not spell is skipped; `None` admits them all. With `gitignore` set,
294
+ /// entries a `.gitignore` in force ignores are pruned/skipped too. Symlinks
295
+ /// are followed only as `glob` allows, and not at all without one; a broken
296
+ /// link or an unreadable directory contributes nothing.
278
297
  fn walk(
279
298
  root: &Path,
280
299
  start: &Path,
@@ -349,12 +368,21 @@ impl Walk<'_> {
349
368
  }
350
369
 
351
370
  /// Whether the walk takes an entry at `depth`: the skip rules and the
352
- /// reserved-directory rule first, then the `.gitignore` files in force.
371
+ /// reserved-directory rule first, then the dot-name rule, then the
372
+ /// `.gitignore` files in force.
353
373
  fn admits(&self, depth: usize, is_dir: bool, name: &OsStr, path: &Path, rel: &Path) -> bool {
354
374
  should_descend(depth, is_dir, name, rel, self.ignore)
375
+ && self.admits_name(name)
355
376
  && (self.frames.is_empty() || !is_gitignored(&self.frames, path, is_dir))
356
377
  }
357
378
 
379
+ fn admits_name(&self, name: &OsStr) -> bool {
380
+ match self.glob {
381
+ Some(glob) => !is_dot_named(name) || glob.spelled_dot_names.is_match(name),
382
+ None => true,
383
+ }
384
+ }
385
+
358
386
  fn next_states(&self, states: &[usize], name: &OsStr, kind: Kind) -> Vec<usize> {
359
387
  self.glob
360
388
  .map_or_else(Vec::new, |glob| glob.step(states, name, kind))
@@ -625,10 +653,14 @@ mod tests {
625
653
  assert!(!is_wanted(&glob, &ignore, Path::new("drafts/a.md")));
626
654
  }
627
655
 
628
- fn walk_with<'a>(ignore: &'a TableMatcher, frames: Vec<Gitignore>) -> Walk<'a> {
656
+ fn walk_with<'a>(
657
+ ignore: &'a TableMatcher,
658
+ glob: Option<&'a PathGlob>,
659
+ frames: Vec<Gitignore>,
660
+ ) -> Walk<'a> {
629
661
  Walk {
630
662
  ignore,
631
- glob: None,
663
+ glob,
632
664
  gitignore: !frames.is_empty(),
633
665
  frames,
634
666
  }
@@ -637,7 +669,8 @@ mod tests {
637
669
  #[test]
638
670
  fn admits_an_ordinary_file_under_no_gitignore() {
639
671
  let ignore = TableMatcher::new(&[], &[]).unwrap();
640
- let walk = walk_with(&ignore, Vec::new());
672
+ let glob = compile_glob("**").unwrap();
673
+ let walk = walk_with(&ignore, Some(&glob), Vec::new());
641
674
  assert!(walk.admits(
642
675
  1,
643
676
  false,
@@ -650,7 +683,8 @@ mod tests {
650
683
  #[test]
651
684
  fn admits_nothing_the_skip_rules_prune() {
652
685
  let ignore = TableMatcher::new(&[], &["**/node_modules/**"]).unwrap();
653
- let walk = walk_with(&ignore, vec![frame("", &["*.log"])]);
686
+ let glob = compile_glob("**").unwrap();
687
+ let walk = walk_with(&ignore, Some(&glob), vec![frame("", &["*.log"])]);
654
688
  assert!(!walk.admits(
655
689
  2,
656
690
  true,
@@ -660,10 +694,95 @@ mod tests {
660
694
  ));
661
695
  }
662
696
 
697
+ #[test]
698
+ fn admits_no_dot_named_entry_the_glob_does_not_spell() {
699
+ let ignore = TableMatcher::new(&[], &[]).unwrap();
700
+ let glob = compile_glob("**").unwrap();
701
+ let walk = walk_with(&ignore, Some(&glob), Vec::new());
702
+ assert!(!walk.admits(
703
+ 1,
704
+ false,
705
+ OsStr::new(".env"),
706
+ Path::new("/r/.env"),
707
+ Path::new(".env")
708
+ ));
709
+ assert!(!walk.admits(
710
+ 1,
711
+ true,
712
+ OsStr::new(".hidden"),
713
+ Path::new("/r/.hidden"),
714
+ Path::new(".hidden")
715
+ ));
716
+ }
717
+
718
+ #[test]
719
+ fn admits_a_dot_named_entry_the_glob_spells() {
720
+ let ignore = TableMatcher::new(&[], &[]).unwrap();
721
+ let glob = compile_glob("**/.env").unwrap();
722
+ let walk = walk_with(&ignore, Some(&glob), Vec::new());
723
+ assert!(walk.admits(
724
+ 2,
725
+ false,
726
+ OsStr::new(".env"),
727
+ Path::new("/r/sub/.env"),
728
+ Path::new("sub/.env")
729
+ ));
730
+ assert!(!walk.admits(
731
+ 1,
732
+ true,
733
+ OsStr::new(".hidden"),
734
+ Path::new("/r/.hidden"),
735
+ Path::new(".hidden")
736
+ ));
737
+ }
738
+
739
+ #[test]
740
+ fn admits_every_dot_named_entry_when_no_glob_governs_the_walk() {
741
+ let ignore = TableMatcher::new(&[], &[]).unwrap();
742
+ let walk = walk_with(&ignore, None, Vec::new());
743
+ assert!(walk.admits(
744
+ 1,
745
+ false,
746
+ OsStr::new(".env"),
747
+ Path::new("/r/.env"),
748
+ Path::new(".env")
749
+ ));
750
+ }
751
+
752
+ #[test]
753
+ fn a_spelled_dot_component_may_itself_be_a_glob() {
754
+ let glob = compile_glob(".env*").unwrap();
755
+ assert!(glob.spelled_dot_names.is_match(".env.local"));
756
+ assert!(!glob.spelled_dot_names.is_match(".git"));
757
+ }
758
+
759
+ #[test]
760
+ fn a_dot_component_is_spelled_wherever_it_sits_in_the_glob() {
761
+ let glob = compile_glob("*/.cache/*").unwrap();
762
+ assert!(glob.spelled_dot_names.is_match(".cache"));
763
+ assert!(!glob.spelled_dot_names.is_match(".config"));
764
+ }
765
+
766
+ #[test]
767
+ fn a_glob_without_a_dot_component_spells_no_dot_name() {
768
+ let glob = compile_glob("docs/**/*.md").unwrap();
769
+ assert!(!glob.spelled_dot_names.is_match(".md"));
770
+ assert!(!glob.spelled_dot_names.is_match(".docs"));
771
+ }
772
+
773
+ #[test]
774
+ fn is_dot_named_looks_at_the_first_byte_only() {
775
+ assert!(is_dot_named(OsStr::new(".env")));
776
+ assert!(is_dot_named(OsStr::new(".")));
777
+ assert!(!is_dot_named(OsStr::new("a.md")));
778
+ assert!(!is_dot_named(OsStr::new("")));
779
+ }
780
+
663
781
  #[test]
664
782
  fn admits_nothing_a_gitignore_in_force_ignores() {
665
783
  let ignore = TableMatcher::new(&[], &[]).unwrap();
666
- let walk = walk_with(&ignore, vec![frame("", &["*.log"])]);
784
+ let glob = compile_glob("**").unwrap();
785
+ let walk = walk_with(&ignore, Some(&glob), vec![frame("", &["*.log"])]);
667
786
  assert!(!walk.admits(
668
787
  1,
669
788
  false,
@@ -768,7 +887,7 @@ mod tests {
768
887
  #[test]
769
888
  fn follows_everything_off_a_link() {
770
889
  let ignore = TableMatcher::new(&[], &[]).unwrap();
771
- let walk = walk_with(&ignore, Vec::new());
890
+ let walk = walk_with(&ignore, None, Vec::new());
772
891
  assert!(walk.follows(false, &[], Kind::File));
773
892
  assert!(!walk.follows(true, &[0], Kind::Dir));
774
893
  }
@@ -791,7 +910,7 @@ mod tests {
791
910
  #[test]
792
911
  fn next_states_are_empty_without_a_glob() {
793
912
  let ignore = TableMatcher::new(&[], &[]).unwrap();
794
- let walk = walk_with(&ignore, Vec::new());
913
+ let walk = walk_with(&ignore, None, Vec::new());
795
914
  assert!(
796
915
  walk.next_states(&[0], OsStr::new("a"), Kind::Dir)
797
916
  .is_empty()
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