dirsql 0.4.61__tar.gz → 0.4.62__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 (260) hide show
  1. {dirsql-0.4.61 → dirsql-0.4.62}/Cargo.lock +2 -2
  2. {dirsql-0.4.61 → dirsql-0.4.62}/PKG-INFO +1 -1
  3. {dirsql-0.4.61 → dirsql-0.4.62}/docs/getting-started.md +9 -4
  4. {dirsql-0.4.61/packages/rust → dirsql-0.4.62}/docs/howto/write-a-plugin.md +6 -5
  5. {dirsql-0.4.61/packages/rust → dirsql-0.4.62}/docs/plugins.md +7 -6
  6. {dirsql-0.4.61 → dirsql-0.4.62}/docs/reference/cli.md +10 -7
  7. {dirsql-0.4.61 → dirsql-0.4.62}/docs/reference/sdk.md +7 -0
  8. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/Cargo.toml +1 -1
  9. {dirsql-0.4.61/packages/rust → dirsql-0.4.62/packages/python}/docs/getting-started.md +9 -4
  10. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/write-a-plugin.md +6 -5
  11. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/plugins.md +7 -6
  12. {dirsql-0.4.61/packages/rust → dirsql-0.4.62/packages/python}/docs/reference/cli.md +10 -7
  13. {dirsql-0.4.61/packages/rust → dirsql-0.4.62/packages/python}/docs/reference/sdk.md +7 -0
  14. dirsql-0.4.62/packages/python/e2e-attestations/claude-1196-join-index.json +7 -0
  15. dirsql-0.4.62/packages/python/e2e-attestations/claude-1226-stale-docs.json +7 -0
  16. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/Cargo.toml +1 -1
  17. {dirsql-0.4.61/packages/python → dirsql-0.4.62/packages/rust}/docs/getting-started.md +9 -4
  18. {dirsql-0.4.61 → dirsql-0.4.62/packages/rust}/docs/howto/write-a-plugin.md +6 -5
  19. {dirsql-0.4.61 → dirsql-0.4.62/packages/rust}/docs/plugins.md +7 -6
  20. {dirsql-0.4.61/packages/python → dirsql-0.4.62/packages/rust}/docs/reference/cli.md +10 -7
  21. {dirsql-0.4.61/packages/python → dirsql-0.4.62/packages/rust}/docs/reference/sdk.md +7 -0
  22. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/run.rs +11 -8
  23. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/vtab.rs +38 -0
  24. dirsql-0.4.62/packages/rust/src/vtab_scaffold.rs +1138 -0
  25. dirsql-0.4.61/packages/rust/src/vtab_scaffold.rs +0 -562
  26. {dirsql-0.4.61 → dirsql-0.4.62}/Cargo.toml +0 -0
  27. {dirsql-0.4.61 → dirsql-0.4.62}/README.md +0 -0
  28. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/__init__.py +0 -0
  29. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/_async.py +0 -0
  30. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/_dirsql.pyi +0 -0
  31. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/__init__.py +0 -0
  32. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/discover_plugins/__init__.py +0 -0
  33. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  34. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  35. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  36. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  37. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  38. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/main.py +0 -0
  39. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/cli/resolve_config_extensions.py +0 -0
  40. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/plan_entry_path.py +0 -0
  41. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/py.typed +0 -0
  42. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/read_config.py +0 -0
  43. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/resolve_configs_extension_specs.py +0 -0
  44. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/resolve_extension.py +0 -0
  45. {dirsql-0.4.61 → dirsql-0.4.62}/dirsql/resolve_package.py +0 -0
  46. {dirsql-0.4.61 → dirsql-0.4.62}/docs/.claude/CLAUDE.md +0 -0
  47. {dirsql-0.4.61 → dirsql-0.4.62}/docs/.vitepress/config.ts +0 -0
  48. {dirsql-0.4.61 → dirsql-0.4.62}/docs/.vitepress/theme/index.ts +0 -0
  49. {dirsql-0.4.61 → dirsql-0.4.62}/docs/.vitepress/theme/lang.ts +0 -0
  50. {dirsql-0.4.61 → dirsql-0.4.62}/docs/AGENTS.md +0 -0
  51. {dirsql-0.4.61 → dirsql-0.4.62}/docs/explanation.md +0 -0
  52. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/columns-from-paths.md +0 -0
  53. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/define-tables.md +0 -0
  54. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/embed.md +0 -0
  55. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/extract-from-contents.md +0 -0
  56. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/load-extension.md +0 -0
  57. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/parse-files-into-columns.md +0 -0
  58. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/persist.md +0 -0
  59. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/query-json.md +0 -0
  60. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/query-without-config.md +0 -0
  61. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/react-to-changes.md +0 -0
  62. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/search-by-meaning.md +0 -0
  63. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/search-indexes.md +0 -0
  64. {dirsql-0.4.61 → dirsql-0.4.62}/docs/howto/skip-files.md +0 -0
  65. {dirsql-0.4.61 → dirsql-0.4.62}/docs/index.md +0 -0
  66. {dirsql-0.4.61 → dirsql-0.4.62}/docs/package.json +0 -0
  67. {dirsql-0.4.61 → dirsql-0.4.62}/docs/pnpm-lock.yaml +0 -0
  68. {dirsql-0.4.61 → dirsql-0.4.62}/docs/pnpm-workspace.yaml +0 -0
  69. {dirsql-0.4.61 → dirsql-0.4.62}/docs/reference/columns.md +0 -0
  70. {dirsql-0.4.61 → dirsql-0.4.62}/docs/reference/config.md +0 -0
  71. {dirsql-0.4.61 → dirsql-0.4.62}/docs/reference/hooks.md +0 -0
  72. {dirsql-0.4.61 → dirsql-0.4.62}/docs/reference/http-api.md +0 -0
  73. {dirsql-0.4.61 → dirsql-0.4.62}/docs/reference/path-tables.md +0 -0
  74. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/CHANGELOG.md +0 -0
  75. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/MIGRATIONS.md +0 -0
  76. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/README.md +0 -0
  77. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  78. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  79. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  80. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  81. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  82. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  83. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  84. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  85. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  86. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  87. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  88. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  89. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  90. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  91. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  92. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  93. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  94. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  95. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  96. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  97. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  98. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  99. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  100. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  101. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  102. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  103. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  104. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  105. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  106. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  107. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/changelog.d/README.md +0 -0
  108. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/conftest.py +0 -0
  109. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/.claude/CLAUDE.md +0 -0
  110. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/.vitepress/config.ts +0 -0
  111. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  112. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  113. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/AGENTS.md +0 -0
  114. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/explanation.md +0 -0
  115. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/columns-from-paths.md +0 -0
  116. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/define-tables.md +0 -0
  117. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/embed.md +0 -0
  118. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/extract-from-contents.md +0 -0
  119. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/load-extension.md +0 -0
  120. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  121. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/persist.md +0 -0
  122. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/query-json.md +0 -0
  123. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/query-without-config.md +0 -0
  124. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/react-to-changes.md +0 -0
  125. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/search-by-meaning.md +0 -0
  126. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/search-indexes.md +0 -0
  127. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/howto/skip-files.md +0 -0
  128. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/index.md +0 -0
  129. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/package.json +0 -0
  130. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/pnpm-lock.yaml +0 -0
  131. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/pnpm-workspace.yaml +0 -0
  132. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/reference/columns.md +0 -0
  133. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/reference/config.md +0 -0
  134. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/reference/hooks.md +0 -0
  135. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/reference/http-api.md +0 -0
  136. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/docs/reference/path-tables.md +0 -0
  137. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  138. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  139. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  140. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  141. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  142. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  143. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  144. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  145. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  146. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  147. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  148. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  149. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  150. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  151. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  152. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  153. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  154. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  155. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  156. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  157. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  158. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  159. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  160. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  161. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  162. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  163. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  164. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  165. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  166. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  167. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  168. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  169. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  170. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  171. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  172. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  173. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  174. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  175. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  176. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  177. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  178. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  179. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  180. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  181. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  182. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  183. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  184. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  185. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  186. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  187. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  188. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  189. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  190. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  191. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  192. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/migrations.d/README.md +0 -0
  193. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/src/lib.rs +0 -0
  194. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/testing-conventions.toml +0 -0
  195. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/__init__.py +0 -0
  196. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/conftest.py +0 -0
  197. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/e2e/__init__.py +0 -0
  198. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  199. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  200. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/e2e/speed_of_light.py +0 -0
  201. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/integration/__init__.py +0 -0
  202. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/integration/binding/__init__.py +0 -0
  203. {dirsql-0.4.61 → dirsql-0.4.62}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  204. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/CHANGELOG.md +0 -0
  205. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/MIGRATIONS.md +0 -0
  206. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/README.md +0 -0
  207. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/benches/db_bench.rs +0 -0
  208. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/benches/differ_bench.rs +0 -0
  209. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/benches/matcher_bench.rs +0 -0
  210. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/benches/scanner_bench.rs +0 -0
  211. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/explanation.md +0 -0
  212. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  213. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/define-tables.md +0 -0
  214. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/embed.md +0 -0
  215. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  216. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/load-extension.md +0 -0
  217. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  218. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/persist.md +0 -0
  219. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/query-json.md +0 -0
  220. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/query-without-config.md +0 -0
  221. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/react-to-changes.md +0 -0
  222. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  223. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/search-indexes.md +0 -0
  224. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/howto/skip-files.md +0 -0
  225. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/index.md +0 -0
  226. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/reference/columns.md +0 -0
  227. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/reference/config.md +0 -0
  228. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/reference/hooks.md +0 -0
  229. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/reference/http-api.md +0 -0
  230. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/docs/reference/path-tables.md +0 -0
  231. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/bin/dirsql.rs +0 -0
  232. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/execute.rs +0 -0
  233. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/init.rs +0 -0
  234. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/mod.rs +0 -0
  235. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/repl.rs +0 -0
  236. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/router.rs +0 -0
  237. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/serialize.rs +0 -0
  238. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/server.rs +0 -0
  239. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/cli/table.rs +0 -0
  240. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/command.rs +0 -0
  241. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/config.rs +0 -0
  242. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/db.rs +0 -0
  243. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/default_config.toml +0 -0
  244. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/differ.rs +0 -0
  245. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/extension_resolution.rs +0 -0
  246. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/functions.rs +0 -0
  247. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/infer.rs +0 -0
  248. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/launcher.rs +0 -0
  249. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/lib.rs +0 -0
  250. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/matcher.rs +0 -0
  251. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/parsed_cache.rs +0 -0
  252. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/parsed_vtab.rs +0 -0
  253. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/path_table.rs +0 -0
  254. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/persist.rs +0 -0
  255. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/progress.rs +0 -0
  256. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/row_event_flat.rs +0 -0
  257. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/scanner.rs +0 -0
  258. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/sql_literal.rs +0 -0
  259. {dirsql-0.4.61 → dirsql-0.4.62}/packages/rust/src/watcher.rs +0 -0
  260. {dirsql-0.4.61 → dirsql-0.4.62}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.61"
555
+ version = "0.4.62"
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.61"
603
+ version = "0.4.62"
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.61
3
+ Version: 0.4.62
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
@@ -81,11 +81,15 @@ The first run downloads the package (`npx` asks for confirmation — answer
81
81
  `y`; `uvx` prints download progress), then prints the result:
82
82
 
83
83
  ```
84
- [{"files":3}]
84
+ files
85
+ -----
86
+ 3
87
+
88
+ 1 row
85
89
  ```
86
90
 
87
91
  Three files, three rows. That one command scanned the directory, handed
88
- SQLite one row per file, ran your SQL, and printed the answer as JSON.
92
+ SQLite one row per file, ran your SQL, and printed the answer.
89
93
 
90
94
  There is no named table here — you never declared one. `'./'` is a
91
95
  [path-table](./reference/path-tables.md): a quoted path written where a table
@@ -94,8 +98,9 @@ in. The path *is* the query.
94
98
 
95
99
  ## 3. Select some columns
96
100
 
97
- The response is always a JSON array of row objects, so from here on we pipe
98
- it through `jq` to pretty-print. Ask for two columns instead of a count:
101
+ At a terminal `dirsql` prints a table; when its output is piped, it prints a
102
+ JSON array of row objects instead. From here on we pipe it through `jq` to
103
+ pretty-print. Ask for two columns instead of a count:
99
104
 
100
105
  ::: code-group
101
106
 
@@ -60,11 +60,12 @@ its `embed()` SQL function),
60
60
  and [`ignore`](../reference/config.md#dirsql-keys).
61
61
 
62
62
  There are **no plugin-specific keys and no plugin-specific restrictions**. The
63
- config schema is content-only: the index `root` and `--persist` are
64
- [runner-owned flags](../reference/config.md#dirsql-keys) (`--root`, `--persist
65
- [PATH]`), decided by whoever runs `dirsql`, never by a config file — so a
66
- plugin has nothing to say about them. Whatever you can put in your own
67
- `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
63
+ config schema is content-only: the index root and persistence are
64
+ [runner-owned](../reference/config.md#dirsql-keys) — the root is the directory
65
+ `dirsql` is run from (or an SDK's explicit `root`), persistence is the
66
+ `--persist [PATH]` flag — decided by whoever runs `dirsql`, never by a config
67
+ file, so a plugin has nothing to say about them. Whatever you can put in your
68
+ own `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
68
69
 
69
70
  ## Hook commands
70
71
 
@@ -93,9 +93,10 @@ scope.
93
93
  ### Vector cache
94
94
 
95
95
  Computed vectors are cached at `~/.cache/dirsql/embeddings/` (respecting
96
- `XDG_CACHE_HOME`), keyed on the SHA-256 of the value bytes plus the model
97
- identifier. Changing either recomputes — switching models never serves stale
98
- vectors — and re-running a query over unchanged files is cache hits all the
99
- way. There is no eviction: the directory is **safe to wipe at any time**; the
100
- only cost is re-embedding. The cache never lives inside a queried tree — the
101
- worker writes nothing into the directories you query.
96
+ `XDG_CACHE_HOME`): one SQLite database per model identifier, each row keyed
97
+ on the SHA-256 of the value bytes. Changing the value or the model recomputes
98
+ — switching models never serves stale vectors — and re-running a query over
99
+ unchanged files is cache hits all the way, a whole batch answered by one
100
+ query. There is no eviction: the directory is **safe to wipe at any time**;
101
+ the only cost is re-embedding. The cache never lives inside a queried tree —
102
+ the worker writes nothing into the directories you query.
@@ -1,11 +1,13 @@
1
1
  # CLI
2
2
 
3
- Query is the default: `dirsql "<sql>"` runs one query and prints JSON rows.
3
+ Query is the default: `dirsql "<sql>"` runs one query and prints the rows —
4
+ a table at a terminal, a JSON array when piped (see
5
+ [Output format](#output-format)).
4
6
  The `dirsql` binary has these modes:
5
7
 
6
8
  | Invocation | Behavior |
7
9
  |---|---|
8
- | `dirsql "<sql>"` | Run one query over the directory and print the rows as JSON. The default; identical to `dirsql query "<sql>"`. |
10
+ | `dirsql "<sql>"` | Run one query over the directory and print the rows. The default; identical to `dirsql query "<sql>"`. |
9
11
  | `dirsql query "<sql>"` | Explicit synonym for the default one-shot query. |
10
12
  | `dirsql server` | Start a long-lived HTTP server exposing a SQL view of a directory. See [HTTP API](./http-api.md). |
11
13
  | `dirsql init` | Generate a `.dirsql.toml`. |
@@ -53,7 +55,7 @@ pipeline, same flags, same output. See that section for config discovery,
53
55
 
54
56
  ```bash
55
57
  dirsql
56
- # dirsql 0.2.7 — this directory is a database.
58
+ # dirsql <version> — this directory is a database.
57
59
  #
58
60
  # SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5;
59
61
  # SELECT path FROM './**/*.md' WHERE content LIKE '%TODO%';
@@ -331,9 +333,10 @@ is a hard error — `error: the subcommand 'query' cannot be used with
331
333
  for the server they follow the subcommand: `dirsql server -c <cfg>`.)
332
334
  :::
333
335
 
334
- The subcommand builds the index, runs the SQL, prints the result rows as a
335
- JSON array on stdout (byte-identical to the [`POST /query`](./http-api.md)
336
- response body), and exits `0`.
336
+ The subcommand builds the index, runs the SQL, prints the result rows on
337
+ stdout — a table at a terminal, otherwise a JSON array byte-identical to the
338
+ [`POST /query`](./http-api.md) response body (see
339
+ [Output format](#output-format)) — and exits `0`.
337
340
 
338
341
  `dirsql query` is a thin adapter over the **same query pipeline the server
339
342
  uses**, so behavior is identical to `POST /query` by construction:
@@ -413,7 +416,7 @@ The output does **not** auto-load. Once you've tweaked it, pass it explicitly
413
416
  to run against it:
414
417
 
415
418
  ```bash
416
- dirsql "SELECT * FROM files" -c ./.dirsql.toml
419
+ dirsql "SELECT * FROM records" -c ./.dirsql.toml
417
420
  ```
418
421
 
419
422
  ### Flags
@@ -54,6 +54,7 @@ DirSQL(
54
54
  *,
55
55
  tables: list[Table] | None = None,
56
56
  ignore: list[str] | None = None,
57
+ no_ignore: bool = False,
57
58
  config: str | list[str] | None = None,
58
59
  persist: bool = False,
59
60
  persist_path: str | None = None,
@@ -68,6 +69,7 @@ new DirSQL({
68
69
  root?: string,
69
70
  tables?: TableDef[],
70
71
  ignore?: string[],
72
+ noIgnore?: boolean,
71
73
  config?: string | string[],
72
74
  persist?: boolean,
73
75
  persistPath?: string,
@@ -80,6 +82,7 @@ DirSQL::builder()
80
82
  .root(root) // optional
81
83
  .tables(tables) // optional; append one with .table(t)
82
84
  .ignore(patterns) // optional
85
+ .no_ignore(true) // optional; default false
83
86
  .config(config_toml_path) // optional; repeatable — call again to
84
87
  // merge another config in call order
85
88
  .persist(cache_path) // optional; Some(path), or None for the
@@ -115,6 +118,10 @@ shortcut was removed in #603 — use
115
118
  - `tables` — Programmatic [`Table`](#table) definitions.
116
119
  - `ignore` — Glob patterns matched against root-relative paths; matched
117
120
  files are skipped entirely (scan and watch).
121
+ - `no_ignore` / `noIgnore` — Scan files a `.gitignore` would hide.
122
+ [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by
123
+ default; the built-in `node_modules`/`.git` skips and any `ignore` patterns
124
+ still apply. The CLI's [`--no-ignore`](./cli.md#flags).
118
125
  - `config` — Path to a [`.dirsql.toml`](./config.md). Its `[[table]]`
119
126
  entries are appended after any programmatic `tables`; its `ignore`
120
127
  patterns and `[[dirsql.extension]]` entries are appended likewise. The
@@ -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.61"
7
+ version = "0.4.62"
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
@@ -81,11 +81,15 @@ The first run downloads the package (`npx` asks for confirmation — answer
81
81
  `y`; `uvx` prints download progress), then prints the result:
82
82
 
83
83
  ```
84
- [{"files":3}]
84
+ files
85
+ -----
86
+ 3
87
+
88
+ 1 row
85
89
  ```
86
90
 
87
91
  Three files, three rows. That one command scanned the directory, handed
88
- SQLite one row per file, ran your SQL, and printed the answer as JSON.
92
+ SQLite one row per file, ran your SQL, and printed the answer.
89
93
 
90
94
  There is no named table here — you never declared one. `'./'` is a
91
95
  [path-table](./reference/path-tables.md): a quoted path written where a table
@@ -94,8 +98,9 @@ in. The path *is* the query.
94
98
 
95
99
  ## 3. Select some columns
96
100
 
97
- The response is always a JSON array of row objects, so from here on we pipe
98
- it through `jq` to pretty-print. Ask for two columns instead of a count:
101
+ At a terminal `dirsql` prints a table; when its output is piped, it prints a
102
+ JSON array of row objects instead. From here on we pipe it through `jq` to
103
+ pretty-print. Ask for two columns instead of a count:
99
104
 
100
105
  ::: code-group
101
106
 
@@ -60,11 +60,12 @@ its `embed()` SQL function),
60
60
  and [`ignore`](../reference/config.md#dirsql-keys).
61
61
 
62
62
  There are **no plugin-specific keys and no plugin-specific restrictions**. The
63
- config schema is content-only: the index `root` and `--persist` are
64
- [runner-owned flags](../reference/config.md#dirsql-keys) (`--root`, `--persist
65
- [PATH]`), decided by whoever runs `dirsql`, never by a config file — so a
66
- plugin has nothing to say about them. Whatever you can put in your own
67
- `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
63
+ config schema is content-only: the index root and persistence are
64
+ [runner-owned](../reference/config.md#dirsql-keys) — the root is the directory
65
+ `dirsql` is run from (or an SDK's explicit `root`), persistence is the
66
+ `--persist [PATH]` flag — decided by whoever runs `dirsql`, never by a config
67
+ file, so a plugin has nothing to say about them. Whatever you can put in your
68
+ own `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
68
69
 
69
70
  ## Hook commands
70
71
 
@@ -93,9 +93,10 @@ scope.
93
93
  ### Vector cache
94
94
 
95
95
  Computed vectors are cached at `~/.cache/dirsql/embeddings/` (respecting
96
- `XDG_CACHE_HOME`), keyed on the SHA-256 of the value bytes plus the model
97
- identifier. Changing either recomputes — switching models never serves stale
98
- vectors — and re-running a query over unchanged files is cache hits all the
99
- way. There is no eviction: the directory is **safe to wipe at any time**; the
100
- only cost is re-embedding. The cache never lives inside a queried tree — the
101
- worker writes nothing into the directories you query.
96
+ `XDG_CACHE_HOME`): one SQLite database per model identifier, each row keyed
97
+ on the SHA-256 of the value bytes. Changing the value or the model recomputes
98
+ — switching models never serves stale vectors — and re-running a query over
99
+ unchanged files is cache hits all the way, a whole batch answered by one
100
+ query. There is no eviction: the directory is **safe to wipe at any time**;
101
+ the only cost is re-embedding. The cache never lives inside a queried tree —
102
+ the worker writes nothing into the directories you query.
@@ -1,11 +1,13 @@
1
1
  # CLI
2
2
 
3
- Query is the default: `dirsql "<sql>"` runs one query and prints JSON rows.
3
+ Query is the default: `dirsql "<sql>"` runs one query and prints the rows —
4
+ a table at a terminal, a JSON array when piped (see
5
+ [Output format](#output-format)).
4
6
  The `dirsql` binary has these modes:
5
7
 
6
8
  | Invocation | Behavior |
7
9
  |---|---|
8
- | `dirsql "<sql>"` | Run one query over the directory and print the rows as JSON. The default; identical to `dirsql query "<sql>"`. |
10
+ | `dirsql "<sql>"` | Run one query over the directory and print the rows. The default; identical to `dirsql query "<sql>"`. |
9
11
  | `dirsql query "<sql>"` | Explicit synonym for the default one-shot query. |
10
12
  | `dirsql server` | Start a long-lived HTTP server exposing a SQL view of a directory. See [HTTP API](./http-api.md). |
11
13
  | `dirsql init` | Generate a `.dirsql.toml`. |
@@ -53,7 +55,7 @@ pipeline, same flags, same output. See that section for config discovery,
53
55
 
54
56
  ```bash
55
57
  dirsql
56
- # dirsql 0.2.7 — this directory is a database.
58
+ # dirsql <version> — this directory is a database.
57
59
  #
58
60
  # SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5;
59
61
  # SELECT path FROM './**/*.md' WHERE content LIKE '%TODO%';
@@ -331,9 +333,10 @@ is a hard error — `error: the subcommand 'query' cannot be used with
331
333
  for the server they follow the subcommand: `dirsql server -c <cfg>`.)
332
334
  :::
333
335
 
334
- The subcommand builds the index, runs the SQL, prints the result rows as a
335
- JSON array on stdout (byte-identical to the [`POST /query`](./http-api.md)
336
- response body), and exits `0`.
336
+ The subcommand builds the index, runs the SQL, prints the result rows on
337
+ stdout — a table at a terminal, otherwise a JSON array byte-identical to the
338
+ [`POST /query`](./http-api.md) response body (see
339
+ [Output format](#output-format)) — and exits `0`.
337
340
 
338
341
  `dirsql query` is a thin adapter over the **same query pipeline the server
339
342
  uses**, so behavior is identical to `POST /query` by construction:
@@ -413,7 +416,7 @@ The output does **not** auto-load. Once you've tweaked it, pass it explicitly
413
416
  to run against it:
414
417
 
415
418
  ```bash
416
- dirsql "SELECT * FROM files" -c ./.dirsql.toml
419
+ dirsql "SELECT * FROM records" -c ./.dirsql.toml
417
420
  ```
418
421
 
419
422
  ### Flags
@@ -54,6 +54,7 @@ DirSQL(
54
54
  *,
55
55
  tables: list[Table] | None = None,
56
56
  ignore: list[str] | None = None,
57
+ no_ignore: bool = False,
57
58
  config: str | list[str] | None = None,
58
59
  persist: bool = False,
59
60
  persist_path: str | None = None,
@@ -68,6 +69,7 @@ new DirSQL({
68
69
  root?: string,
69
70
  tables?: TableDef[],
70
71
  ignore?: string[],
72
+ noIgnore?: boolean,
71
73
  config?: string | string[],
72
74
  persist?: boolean,
73
75
  persistPath?: string,
@@ -80,6 +82,7 @@ DirSQL::builder()
80
82
  .root(root) // optional
81
83
  .tables(tables) // optional; append one with .table(t)
82
84
  .ignore(patterns) // optional
85
+ .no_ignore(true) // optional; default false
83
86
  .config(config_toml_path) // optional; repeatable — call again to
84
87
  // merge another config in call order
85
88
  .persist(cache_path) // optional; Some(path), or None for the
@@ -115,6 +118,10 @@ shortcut was removed in #603 — use
115
118
  - `tables` — Programmatic [`Table`](#table) definitions.
116
119
  - `ignore` — Glob patterns matched against root-relative paths; matched
117
120
  files are skipped entirely (scan and watch).
121
+ - `no_ignore` / `noIgnore` — Scan files a `.gitignore` would hide.
122
+ [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by
123
+ default; the built-in `node_modules`/`.git` skips and any `ignore` patterns
124
+ still apply. The CLI's [`--no-ignore`](./cli.md#flags).
118
125
  - `config` — Path to a [`.dirsql.toml`](./config.md). Its `[[table]]`
119
126
  entries are appended after any programmatic `tables`; its `ignore`
120
127
  patterns and `[[dirsql.extension]]` entries are appended likewise. The
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1790959572,
4
+ "exit_code": 0,
5
+ "commit": "16f02f05e5f6ca5fc06ad5ce716fae9d1ce78bc5",
6
+ "branch": "claude/1196-join-index"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1790960011,
4
+ "exit_code": 0,
5
+ "commit": "b36c8055c086002c81314daa2d7e34cded58b561",
6
+ "branch": "claude/1226-stale-docs"
7
+ }
@@ -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.61"
9
+ version = "0.4.62"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -81,11 +81,15 @@ The first run downloads the package (`npx` asks for confirmation — answer
81
81
  `y`; `uvx` prints download progress), then prints the result:
82
82
 
83
83
  ```
84
- [{"files":3}]
84
+ files
85
+ -----
86
+ 3
87
+
88
+ 1 row
85
89
  ```
86
90
 
87
91
  Three files, three rows. That one command scanned the directory, handed
88
- SQLite one row per file, ran your SQL, and printed the answer as JSON.
92
+ SQLite one row per file, ran your SQL, and printed the answer.
89
93
 
90
94
  There is no named table here — you never declared one. `'./'` is a
91
95
  [path-table](./reference/path-tables.md): a quoted path written where a table
@@ -94,8 +98,9 @@ in. The path *is* the query.
94
98
 
95
99
  ## 3. Select some columns
96
100
 
97
- The response is always a JSON array of row objects, so from here on we pipe
98
- it through `jq` to pretty-print. Ask for two columns instead of a count:
101
+ At a terminal `dirsql` prints a table; when its output is piped, it prints a
102
+ JSON array of row objects instead. From here on we pipe it through `jq` to
103
+ pretty-print. Ask for two columns instead of a count:
99
104
 
100
105
  ::: code-group
101
106
 
@@ -60,11 +60,12 @@ its `embed()` SQL function),
60
60
  and [`ignore`](../reference/config.md#dirsql-keys).
61
61
 
62
62
  There are **no plugin-specific keys and no plugin-specific restrictions**. The
63
- config schema is content-only: the index `root` and `--persist` are
64
- [runner-owned flags](../reference/config.md#dirsql-keys) (`--root`, `--persist
65
- [PATH]`), decided by whoever runs `dirsql`, never by a config file — so a
66
- plugin has nothing to say about them. Whatever you can put in your own
67
- `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
63
+ config schema is content-only: the index root and persistence are
64
+ [runner-owned](../reference/config.md#dirsql-keys) — the root is the directory
65
+ `dirsql` is run from (or an SDK's explicit `root`), persistence is the
66
+ `--persist [PATH]` flag — decided by whoever runs `dirsql`, never by a config
67
+ file, so a plugin has nothing to say about them. Whatever you can put in your
68
+ own `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
68
69
 
69
70
  ## Hook commands
70
71
 
@@ -93,9 +93,10 @@ scope.
93
93
  ### Vector cache
94
94
 
95
95
  Computed vectors are cached at `~/.cache/dirsql/embeddings/` (respecting
96
- `XDG_CACHE_HOME`), keyed on the SHA-256 of the value bytes plus the model
97
- identifier. Changing either recomputes — switching models never serves stale
98
- vectors — and re-running a query over unchanged files is cache hits all the
99
- way. There is no eviction: the directory is **safe to wipe at any time**; the
100
- only cost is re-embedding. The cache never lives inside a queried tree — the
101
- worker writes nothing into the directories you query.
96
+ `XDG_CACHE_HOME`): one SQLite database per model identifier, each row keyed
97
+ on the SHA-256 of the value bytes. Changing the value or the model recomputes
98
+ — switching models never serves stale vectors — and re-running a query over
99
+ unchanged files is cache hits all the way, a whole batch answered by one
100
+ query. There is no eviction: the directory is **safe to wipe at any time**;
101
+ the only cost is re-embedding. The cache never lives inside a queried tree —
102
+ the worker writes nothing into the directories you query.
@@ -1,11 +1,13 @@
1
1
  # CLI
2
2
 
3
- Query is the default: `dirsql "<sql>"` runs one query and prints JSON rows.
3
+ Query is the default: `dirsql "<sql>"` runs one query and prints the rows —
4
+ a table at a terminal, a JSON array when piped (see
5
+ [Output format](#output-format)).
4
6
  The `dirsql` binary has these modes:
5
7
 
6
8
  | Invocation | Behavior |
7
9
  |---|---|
8
- | `dirsql "<sql>"` | Run one query over the directory and print the rows as JSON. The default; identical to `dirsql query "<sql>"`. |
10
+ | `dirsql "<sql>"` | Run one query over the directory and print the rows. The default; identical to `dirsql query "<sql>"`. |
9
11
  | `dirsql query "<sql>"` | Explicit synonym for the default one-shot query. |
10
12
  | `dirsql server` | Start a long-lived HTTP server exposing a SQL view of a directory. See [HTTP API](./http-api.md). |
11
13
  | `dirsql init` | Generate a `.dirsql.toml`. |
@@ -53,7 +55,7 @@ pipeline, same flags, same output. See that section for config discovery,
53
55
 
54
56
  ```bash
55
57
  dirsql
56
- # dirsql 0.2.7 — this directory is a database.
58
+ # dirsql <version> — this directory is a database.
57
59
  #
58
60
  # SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5;
59
61
  # SELECT path FROM './**/*.md' WHERE content LIKE '%TODO%';
@@ -331,9 +333,10 @@ is a hard error — `error: the subcommand 'query' cannot be used with
331
333
  for the server they follow the subcommand: `dirsql server -c <cfg>`.)
332
334
  :::
333
335
 
334
- The subcommand builds the index, runs the SQL, prints the result rows as a
335
- JSON array on stdout (byte-identical to the [`POST /query`](./http-api.md)
336
- response body), and exits `0`.
336
+ The subcommand builds the index, runs the SQL, prints the result rows on
337
+ stdout — a table at a terminal, otherwise a JSON array byte-identical to the
338
+ [`POST /query`](./http-api.md) response body (see
339
+ [Output format](#output-format)) — and exits `0`.
337
340
 
338
341
  `dirsql query` is a thin adapter over the **same query pipeline the server
339
342
  uses**, so behavior is identical to `POST /query` by construction:
@@ -413,7 +416,7 @@ The output does **not** auto-load. Once you've tweaked it, pass it explicitly
413
416
  to run against it:
414
417
 
415
418
  ```bash
416
- dirsql "SELECT * FROM files" -c ./.dirsql.toml
419
+ dirsql "SELECT * FROM records" -c ./.dirsql.toml
417
420
  ```
418
421
 
419
422
  ### Flags
@@ -54,6 +54,7 @@ DirSQL(
54
54
  *,
55
55
  tables: list[Table] | None = None,
56
56
  ignore: list[str] | None = None,
57
+ no_ignore: bool = False,
57
58
  config: str | list[str] | None = None,
58
59
  persist: bool = False,
59
60
  persist_path: str | None = None,
@@ -68,6 +69,7 @@ new DirSQL({
68
69
  root?: string,
69
70
  tables?: TableDef[],
70
71
  ignore?: string[],
72
+ noIgnore?: boolean,
71
73
  config?: string | string[],
72
74
  persist?: boolean,
73
75
  persistPath?: string,
@@ -80,6 +82,7 @@ DirSQL::builder()
80
82
  .root(root) // optional
81
83
  .tables(tables) // optional; append one with .table(t)
82
84
  .ignore(patterns) // optional
85
+ .no_ignore(true) // optional; default false
83
86
  .config(config_toml_path) // optional; repeatable — call again to
84
87
  // merge another config in call order
85
88
  .persist(cache_path) // optional; Some(path), or None for the
@@ -115,6 +118,10 @@ shortcut was removed in #603 — use
115
118
  - `tables` — Programmatic [`Table`](#table) definitions.
116
119
  - `ignore` — Glob patterns matched against root-relative paths; matched
117
120
  files are skipped entirely (scan and watch).
121
+ - `no_ignore` / `noIgnore` — Scan files a `.gitignore` would hide.
122
+ [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by
123
+ default; the built-in `node_modules`/`.git` skips and any `ignore` patterns
124
+ still apply. The CLI's [`--no-ignore`](./cli.md#flags).
118
125
  - `config` — Path to a [`.dirsql.toml`](./config.md). Its `[[table]]`
119
126
  entries are appended after any programmatic `tables`; its `ignore`
120
127
  patterns and `[[dirsql.extension]]` entries are appended likewise. The
@@ -33,7 +33,8 @@ use serde_json::Value;
33
33
  bare `dirsql` opens a REPL; `dirsql server` starts the HTTP \
34
34
  server.",
35
35
  long_about = "Runs one SQL query over a local directory and prints the \
36
- result rows as JSON. `dirsql \"SELECT * FROM './'\"` is the \
36
+ result rows: a table on a terminal, a JSON array when \
37
+ piped. `dirsql \"SELECT * FROM './'\"` is the \
37
38
  default; `dirsql query \"<sql>\"` is an explicit synonym. \
38
39
  With no subcommand and no SQL, dirsql reads statements until \
39
40
  EOF instead: a prompted REPL on a terminal, one statement \
@@ -47,8 +48,9 @@ use serde_json::Value;
47
48
  subcommand-local: for `query`/`server` pass them AFTER the \
48
49
  subcommand (`dirsql query <sql> -c <cfg>`); a flag before a \
49
50
  subcommand is a hard error. The `init` subcommand writes a \
50
- starter `.dirsql.toml` defining a `files` table — no \
51
- target-directory inspection, no network, deterministic.",
51
+ starter `.dirsql.toml` defining a `records` table over \
52
+ `**/*.json` — no target-directory inspection, no network, \
53
+ deterministic.",
52
54
  args_conflicts_with_subcommands = true
53
55
  )]
54
56
  struct Cli {
@@ -151,14 +153,15 @@ impl ConfigArgs {
151
153
 
152
154
  #[derive(Debug, Subcommand)]
153
155
  enum Command {
154
- /// Write the fixed starter `.dirsql.toml` — a `files` table over every
155
- /// file in the directory. The output does not auto-load; pass it with
156
- /// `dirsql query <sql> -c ./.dirsql.toml`. No target-directory
157
- /// inspection.
156
+ /// Write the fixed starter `.dirsql.toml` — a `records` table over
157
+ /// `**/*.json`, parsed by an `on-file` hook. The output does not
158
+ /// auto-load; pass it with `dirsql query <sql> -c ./.dirsql.toml`. No
159
+ /// target-directory inspection.
158
160
  Init(InitArgs),
159
161
 
160
162
  /// Run one SQL query against the indexed directory, print the result
161
- /// rows as JSON on stdout, and exit. No server, no watch. This is the
163
+ /// rows on stdout (a table on a terminal, a JSON array when piped), and
164
+ /// exit. No server, no watch. This is the
162
165
  /// explicit synonym for the default `dirsql "<sql>"`. Shares the
163
166
  /// server's query pipeline, so config loading, hooks, the read-only
164
167
  /// rule, and error classification are identical to `POST /query`.
@@ -39,6 +39,10 @@ const CTIME_COLUMN: usize = 6;
39
39
  /// Column index of the lazily-read `content`, which follows the stat columns.
40
40
  const CONTENT_COLUMN: usize = STAT_COLUMNS.len();
41
41
 
42
+ /// `path`, `basename` and `dir`: the columns a join between two path-tables
43
+ /// is written on, answered by lookup rather than a rescan of the inner glob.
44
+ const LOOKUP_COLUMNS: [usize; 3] = [PATH_COLUMN, BASENAME_COLUMN, DIR_COLUMN];
45
+
42
46
  /// Schema a path-table declares to SQLite.
43
47
  ///
44
48
  /// `content` is declared last and `HIDDEN` so SQLite excludes it from
@@ -278,6 +282,8 @@ impl TableSource for ScanSpec {
278
282
 
279
283
  const NAME: &'static str = MODULE_NAME;
280
284
 
285
+ const LOOKUP_COLUMNS: &'static [usize] = &LOOKUP_COLUMNS;
286
+
281
287
  fn connect(args: &[&[u8]]) -> Result<(String, Self)> {
282
288
  Ok((declared_schema(), parse_module_args(args)?))
283
289
  }
@@ -309,6 +315,15 @@ impl TableSource for ScanSpec {
309
315
  None => ctx.set_result(&read_text(&self.root.join(&row.rel))),
310
316
  }
311
317
  }
318
+
319
+ fn lookup_key<'r>(&self, row: &'r FileRow, column: usize) -> Option<&'r str> {
320
+ match column {
321
+ PATH_COLUMN => Some(&row.path),
322
+ BASENAME_COLUMN => row.basename(),
323
+ DIR_COLUMN => row.dir(),
324
+ _ => None,
325
+ }
326
+ }
312
327
  }
313
328
 
314
329
  /// Register the path-table module on `conn`. Its tables hold the rows of the
@@ -571,6 +586,29 @@ mod tests {
571
586
  assert_eq!(cell(&row, -1), Some(ValueRef::Null));
572
587
  }
573
588
 
589
+ #[test]
590
+ fn lookup_columns_are_path_basename_and_dir_in_that_order() {
591
+ let names: Vec<&str> = LOOKUP_COLUMNS.iter().map(|c| STAT_COLUMNS[*c]).collect();
592
+ assert_eq!(names, ["path", "basename", "dir"]);
593
+ }
594
+
595
+ #[test]
596
+ fn a_scan_spec_keys_a_row_by_the_text_of_the_lookup_column() {
597
+ let args = args_with(&[b"'/tmp/notes'", b"'**/*.md'", b"''", b"'gitignore'"]);
598
+ let spec = parse_module_args(&args).unwrap();
599
+ let mut row = row_for("", "docs/a.md");
600
+ row.facts = facts(3);
601
+
602
+ assert_eq!(spec.lookup_key(&row, 0), Some("docs/a.md"));
603
+ assert_eq!(spec.lookup_key(&row, 1), Some("a.md"));
604
+ assert_eq!(spec.lookup_key(&row, 2), Some("docs"));
605
+ assert_eq!(
606
+ spec.lookup_key(&row, 4),
607
+ None,
608
+ "size is not a lookup column"
609
+ );
610
+ }
611
+
574
612
  #[test]
575
613
  fn chunks_cut_in_order_with_the_remainder_last() {
576
614
  assert_eq!(