dirsql 0.4.110__tar.gz → 0.4.111__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 (436) hide show
  1. {dirsql-0.4.110 → dirsql-0.4.111}/Cargo.lock +2 -2
  2. {dirsql-0.4.110 → dirsql-0.4.111}/PKG-INFO +1 -1
  3. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/cli.md +17 -0
  4. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/Cargo.toml +1 -1
  5. {dirsql-0.4.110/packages/rust → dirsql-0.4.111/packages/python}/docs/reference/cli.md +17 -0
  6. dirsql-0.4.111/packages/python/e2e-attestations/bot-1469-ci-speed-sanity-1009.json +7 -0
  7. dirsql-0.4.111/packages/python/e2e-attestations/bot-1503-bench-watch-1011.json +7 -0
  8. dirsql-0.4.111/packages/python/e2e-attestations/bot-issue-1486-frontend-20261009.json +7 -0
  9. dirsql-0.4.111/packages/python/e2e-attestations/bot-speed-parse-paths-1009.json +7 -0
  10. dirsql-0.4.111/packages/python/e2e-attestations/bot-speed-walk-sched-1009.json +7 -0
  11. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/e2e/speed_of_light.py +53 -0
  12. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/Cargo.toml +1 -1
  13. {dirsql-0.4.110/packages/python → dirsql-0.4.111/packages/rust}/docs/reference/cli.md +17 -0
  14. dirsql-0.4.111/packages/rust/src/cli/frontend.html +60 -0
  15. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/mod.rs +16 -0
  16. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/router.rs +37 -4
  17. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/run.rs +33 -0
  18. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/server.rs +1 -1
  19. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/lib.rs +89 -4
  20. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/scanner.rs +10 -1
  21. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/tree_walk.rs +3 -8
  22. {dirsql-0.4.110 → dirsql-0.4.111}/Cargo.toml +0 -0
  23. {dirsql-0.4.110 → dirsql-0.4.111}/README.md +0 -0
  24. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/__init__.py +0 -0
  25. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/_async.py +0 -0
  26. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/_dirsql.pyi +0 -0
  27. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/__init__.py +0 -0
  28. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/discover_plugins/__init__.py +0 -0
  29. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  30. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  31. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  32. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  33. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/main.py +0 -0
  34. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/cli/resolve_config_extensions.py +0 -0
  35. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/plan_entry_path.py +0 -0
  36. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/py.typed +0 -0
  37. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/read_config.py +0 -0
  38. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/resolve_configs_extension_specs.py +0 -0
  39. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/resolve_extension.py +0 -0
  40. {dirsql-0.4.110 → dirsql-0.4.111}/dirsql/resolve_package.py +0 -0
  41. {dirsql-0.4.110 → dirsql-0.4.111}/docs/.claude/CLAUDE.md +0 -0
  42. {dirsql-0.4.110 → dirsql-0.4.111}/docs/.vitepress/config.ts +0 -0
  43. {dirsql-0.4.110 → dirsql-0.4.111}/docs/.vitepress/theme/index.ts +0 -0
  44. {dirsql-0.4.110 → dirsql-0.4.111}/docs/.vitepress/theme/lang.ts +0 -0
  45. {dirsql-0.4.110 → dirsql-0.4.111}/docs/AGENTS.md +0 -0
  46. {dirsql-0.4.110 → dirsql-0.4.111}/docs/context/.gitattributes +0 -0
  47. {dirsql-0.4.110 → dirsql-0.4.111}/docs/context/recipes.md +0 -0
  48. {dirsql-0.4.110 → dirsql-0.4.111}/docs/context/troubleshooting.md +0 -0
  49. {dirsql-0.4.110 → dirsql-0.4.111}/docs/context/usage.md +0 -0
  50. {dirsql-0.4.110 → dirsql-0.4.111}/docs/explanation.md +0 -0
  51. {dirsql-0.4.110 → dirsql-0.4.111}/docs/getting-started.md +0 -0
  52. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/agent-skill.md +0 -0
  53. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/columns-from-paths.md +0 -0
  54. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/define-tables.md +0 -0
  55. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/embed.md +0 -0
  56. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/extract-from-contents.md +0 -0
  57. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/load-extension.md +0 -0
  58. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/parse-files-into-columns.md +0 -0
  59. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/persist.md +0 -0
  60. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/query-json.md +0 -0
  61. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/query-without-config.md +0 -0
  62. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/react-to-changes.md +0 -0
  63. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/search-by-meaning.md +0 -0
  64. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/search-indexes.md +0 -0
  65. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/skip-files.md +0 -0
  66. {dirsql-0.4.110 → dirsql-0.4.111}/docs/howto/write-a-plugin.md +0 -0
  67. {dirsql-0.4.110 → dirsql-0.4.111}/docs/index.md +0 -0
  68. {dirsql-0.4.110 → dirsql-0.4.111}/docs/package.json +0 -0
  69. {dirsql-0.4.110 → dirsql-0.4.111}/docs/plugins.md +0 -0
  70. {dirsql-0.4.110 → dirsql-0.4.111}/docs/pnpm-lock.yaml +0 -0
  71. {dirsql-0.4.110 → dirsql-0.4.111}/docs/pnpm-workspace.yaml +0 -0
  72. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/columns.md +0 -0
  73. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/config.md +0 -0
  74. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/glob.md +0 -0
  75. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/hooks.md +0 -0
  76. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/http-api.md +0 -0
  77. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/path-tables.md +0 -0
  78. {dirsql-0.4.110 → dirsql-0.4.111}/docs/reference/sdk.md +0 -0
  79. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/CHANGELOG.md +0 -0
  80. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/MIGRATIONS.md +0 -0
  81. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/README.md +0 -0
  82. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  83. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  84. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  85. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  86. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  87. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  88. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  89. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  90. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  91. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  92. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  93. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  94. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  95. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  96. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  97. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  98. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  99. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  100. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  101. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  102. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  103. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  104. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  105. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  106. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  107. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  108. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  109. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  110. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  111. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  112. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  113. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  114. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  115. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  116. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  117. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  118. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
  119. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
  120. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  121. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  122. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  123. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
  124. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
  125. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
  126. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
  127. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  128. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
  129. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
  130. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
  131. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
  132. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  133. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
  134. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  135. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
  136. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
  137. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
  138. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
  139. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
  140. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
  141. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
  142. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
  143. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
  144. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +0 -0
  145. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/changelog.d/README.md +0 -0
  146. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/conftest.py +0 -0
  147. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/.claude/CLAUDE.md +0 -0
  148. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/.vitepress/config.ts +0 -0
  149. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  150. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  151. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/AGENTS.md +0 -0
  152. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/context/.gitattributes +0 -0
  153. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/context/recipes.md +0 -0
  154. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/context/troubleshooting.md +0 -0
  155. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/context/usage.md +0 -0
  156. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/explanation.md +0 -0
  157. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/getting-started.md +0 -0
  158. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/agent-skill.md +0 -0
  159. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/columns-from-paths.md +0 -0
  160. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/define-tables.md +0 -0
  161. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/embed.md +0 -0
  162. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/extract-from-contents.md +0 -0
  163. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/load-extension.md +0 -0
  164. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  165. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/persist.md +0 -0
  166. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/query-json.md +0 -0
  167. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/query-without-config.md +0 -0
  168. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/react-to-changes.md +0 -0
  169. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/search-by-meaning.md +0 -0
  170. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/search-indexes.md +0 -0
  171. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/skip-files.md +0 -0
  172. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/howto/write-a-plugin.md +0 -0
  173. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/index.md +0 -0
  174. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/package.json +0 -0
  175. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/plugins.md +0 -0
  176. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/pnpm-lock.yaml +0 -0
  177. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/pnpm-workspace.yaml +0 -0
  178. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/reference/columns.md +0 -0
  179. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/reference/config.md +0 -0
  180. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/reference/glob.md +0 -0
  181. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/reference/hooks.md +0 -0
  182. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/reference/http-api.md +0 -0
  183. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/reference/path-tables.md +0 -0
  184. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/docs/reference/sdk.md +0 -0
  185. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
  186. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
  187. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
  188. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
  189. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
  190. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +0 -0
  191. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
  192. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
  193. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
  194. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1416-watch-speed-1008.json +0 -0
  195. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
  196. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
  197. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
  198. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
  199. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
  200. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
  201. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
  202. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
  203. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
  204. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
  205. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
  206. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
  207. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
  208. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
  209. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
  210. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
  211. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
  212. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1461-row-footprint-1008.json +0 -0
  213. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1462-paired-speed-harness-1008.json +0 -0
  214. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1464-fastest-native-1008.json +0 -0
  215. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-1470-perf-suite-1009.json +0 -0
  216. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
  217. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  218. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  219. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  220. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  221. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  222. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  223. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  224. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  225. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  226. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  227. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  228. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  229. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  230. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  231. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  232. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  233. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  234. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  235. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  236. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  237. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  238. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  239. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  240. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  241. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  242. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  243. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  244. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  245. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  246. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  247. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  248. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  249. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  250. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  251. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
  252. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  253. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
  254. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
  255. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
  256. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
  257. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  258. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  259. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  260. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  261. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  262. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  263. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
  264. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
  265. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
  266. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
  267. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
  268. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
  269. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
  270. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  271. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
  272. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
  273. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
  274. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
  275. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
  276. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
  277. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
  278. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
  279. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
  280. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
  281. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
  282. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
  283. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
  284. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
  285. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
  286. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
  287. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
  288. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
  289. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
  290. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
  291. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
  292. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
  293. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
  294. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
  295. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
  296. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  297. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  298. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  299. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  300. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  301. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  302. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  303. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  304. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  305. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  306. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  307. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  308. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  309. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  310. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  311. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  312. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  313. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  314. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  315. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  316. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  317. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  318. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  319. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  320. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  321. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  322. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  323. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  324. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  325. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  326. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  327. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  328. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  329. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
  330. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
  331. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  332. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  333. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  334. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
  335. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
  336. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
  337. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
  338. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  339. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
  340. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
  341. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
  342. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
  343. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  344. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
  345. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  346. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
  347. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
  348. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
  349. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
  350. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
  351. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
  352. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
  353. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
  354. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
  355. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +0 -0
  356. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/migrations.d/README.md +0 -0
  357. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/src/lib.rs +0 -0
  358. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/testing-conventions.toml +0 -0
  359. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/__init__.py +0 -0
  360. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/conftest.py +0 -0
  361. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/e2e/__init__.py +0 -0
  362. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/e2e/bench_report.py +0 -0
  363. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/e2e/bench_suite.py +0 -0
  364. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  365. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  366. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/integration/__init__.py +0 -0
  367. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/integration/binding/__init__.py +0 -0
  368. {dirsql-0.4.110 → dirsql-0.4.111}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  369. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/CHANGELOG.md +0 -0
  370. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/MIGRATIONS.md +0 -0
  371. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/README.md +0 -0
  372. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/benches/db_bench.rs +0 -0
  373. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/benches/differ_bench.rs +0 -0
  374. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/benches/matcher_bench.rs +0 -0
  375. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/benches/scanner_bench.rs +0 -0
  376. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/context/.gitattributes +0 -0
  377. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/context/recipes.md +0 -0
  378. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/context/troubleshooting.md +0 -0
  379. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/context/usage.md +0 -0
  380. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/explanation.md +0 -0
  381. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/getting-started.md +0 -0
  382. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/agent-skill.md +0 -0
  383. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  384. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/define-tables.md +0 -0
  385. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/embed.md +0 -0
  386. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  387. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/load-extension.md +0 -0
  388. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  389. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/persist.md +0 -0
  390. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/query-json.md +0 -0
  391. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/query-without-config.md +0 -0
  392. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/react-to-changes.md +0 -0
  393. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  394. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/search-indexes.md +0 -0
  395. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/skip-files.md +0 -0
  396. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  397. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/index.md +0 -0
  398. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/plugins.md +0 -0
  399. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/reference/columns.md +0 -0
  400. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/reference/config.md +0 -0
  401. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/reference/glob.md +0 -0
  402. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/reference/hooks.md +0 -0
  403. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/reference/http-api.md +0 -0
  404. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/reference/path-tables.md +0 -0
  405. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/docs/reference/sdk.md +0 -0
  406. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/bin/dirsql.rs +0 -0
  407. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/brace.rs +0 -0
  408. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/context.rs +0 -0
  409. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/execute.rs +0 -0
  410. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/init.rs +0 -0
  411. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/repl.rs +0 -0
  412. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/serialize.rs +0 -0
  413. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/cli/table.rs +0 -0
  414. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/command.rs +0 -0
  415. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/config.rs +0 -0
  416. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/db.rs +0 -0
  417. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/default_config.toml +0 -0
  418. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/differ.rs +0 -0
  419. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/extension_resolution.rs +0 -0
  420. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/functions.rs +0 -0
  421. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/infer.rs +0 -0
  422. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/launcher.rs +0 -0
  423. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/listing.rs +0 -0
  424. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/matcher.rs +0 -0
  425. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/on_file.rs +0 -0
  426. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/parsed_vtab.rs +0 -0
  427. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/path_table.rs +0 -0
  428. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/persist.rs +0 -0
  429. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/posix_class.rs +0 -0
  430. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/progress.rs +0 -0
  431. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/row_event_flat.rs +0 -0
  432. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/sql_literal.rs +0 -0
  433. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/vtab.rs +0 -0
  434. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/vtab_scaffold.rs +0 -0
  435. {dirsql-0.4.110 → dirsql-0.4.111}/packages/rust/src/watcher.rs +0 -0
  436. {dirsql-0.4.110 → dirsql-0.4.111}/pyproject.toml +0 -0
@@ -573,7 +573,7 @@ dependencies = [
573
573
 
574
574
  [[package]]
575
575
  name = "dirsql"
576
- version = "0.4.110"
576
+ version = "0.4.111"
577
577
  dependencies = [
578
578
  "assert_cmd",
579
579
  "axum",
@@ -625,7 +625,7 @@ dependencies = [
625
625
 
626
626
  [[package]]
627
627
  name = "dirsql-py-ext"
628
- version = "0.4.110"
628
+ version = "0.4.111"
629
629
  dependencies = [
630
630
  "dirsql",
631
631
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.110
3
+ Version: 0.4.111
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
@@ -237,6 +237,22 @@ On startup the server prints `Running at <host>:<port>` to stdout. It runs
237
237
  until it receives `SIGINT` (Ctrl-C) or `SIGTERM`, then drains in-flight
238
238
  requests, closes open `/events` streams, and exits.
239
239
 
240
+ Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
241
+ the same origin as the HTTP API. It works offline and prints `Frontend at
242
+ http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
243
+ printed URL uses the assigned port. The initial shell shows server status;
244
+ query controls are coming in a subsequent update.
245
+
246
+ ```bash
247
+ dirsql server --frontend
248
+ dirsql server --frontend -c .dirsql.toml
249
+ ```
250
+
251
+ The shell reads `GET /frontend/state`: `{"error":null}` when the index is
252
+ ready, or HTTP `503` with `{"error":"<diagnostic>"}` when config loading
253
+ fails. Fix the config and restart the server. Without `--frontend`, the `/`
254
+ and `/frontend/state` routes return `404`.
255
+
240
256
  ### Flags
241
257
 
242
258
  Config flags are subcommand-local: pass them after `server`
@@ -247,6 +263,7 @@ Config flags are subcommand-local: pass them after `server`
247
263
  | `-c, --config <path>` | none | Path to a [config file](./config.md). **Repeatable** (`-c a -c b`): the configs load and merge in argv order — see [Composing multiple configs](./config.md#composing-multiple-configs). The index root is the **invocation directory** (the current working directory) and governs path-tables; a config's `[[table]]` globs anchor at **that config's own directory** (see [glob anchor](./config.md#glob-anchor)), so `--config /elsewhere/.dirsql.toml` indexes `/elsewhere`, from any working directory. With none given, **no named tables are defined** — query the filesystem with a [path-table](./path-tables.md) (`FROM './'`). A `./.dirsql.toml` on disk is **not** auto-loaded; pass it explicitly. A `-c` naming a file that does not exist is an [error](#degraded-mode). |
248
264
  | `--host <addr>` | `localhost` | Bind address. |
249
265
  | `--port <n>` | `7117` | TCP port to bind. |
266
+ | `--frontend` | off | Serve the bundled SQL explorer shell and print its URL. |
250
267
  | `--cors-origin <origin>` | off | Let browser pages on `<origin>` (an exact origin such as `http://localhost:3202`, or `*` for any) call `/query` and open `/events`. See [Cross-origin requests](#cross-origin-requests). |
251
268
  | `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches under the platform cache directory (`$XDG_CACHE_HOME/dirsql/<root hash>/cache.db` on Linux), outside the root; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
252
269
  | `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in `.git` skip and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
@@ -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.110"
7
+ version = "0.4.111"
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
@@ -237,6 +237,22 @@ On startup the server prints `Running at <host>:<port>` to stdout. It runs
237
237
  until it receives `SIGINT` (Ctrl-C) or `SIGTERM`, then drains in-flight
238
238
  requests, closes open `/events` streams, and exits.
239
239
 
240
+ Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
241
+ the same origin as the HTTP API. It works offline and prints `Frontend at
242
+ http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
243
+ printed URL uses the assigned port. The initial shell shows server status;
244
+ query controls are coming in a subsequent update.
245
+
246
+ ```bash
247
+ dirsql server --frontend
248
+ dirsql server --frontend -c .dirsql.toml
249
+ ```
250
+
251
+ The shell reads `GET /frontend/state`: `{"error":null}` when the index is
252
+ ready, or HTTP `503` with `{"error":"<diagnostic>"}` when config loading
253
+ fails. Fix the config and restart the server. Without `--frontend`, the `/`
254
+ and `/frontend/state` routes return `404`.
255
+
240
256
  ### Flags
241
257
 
242
258
  Config flags are subcommand-local: pass them after `server`
@@ -247,6 +263,7 @@ Config flags are subcommand-local: pass them after `server`
247
263
  | `-c, --config <path>` | none | Path to a [config file](./config.md). **Repeatable** (`-c a -c b`): the configs load and merge in argv order — see [Composing multiple configs](./config.md#composing-multiple-configs). The index root is the **invocation directory** (the current working directory) and governs path-tables; a config's `[[table]]` globs anchor at **that config's own directory** (see [glob anchor](./config.md#glob-anchor)), so `--config /elsewhere/.dirsql.toml` indexes `/elsewhere`, from any working directory. With none given, **no named tables are defined** — query the filesystem with a [path-table](./path-tables.md) (`FROM './'`). A `./.dirsql.toml` on disk is **not** auto-loaded; pass it explicitly. A `-c` naming a file that does not exist is an [error](#degraded-mode). |
248
264
  | `--host <addr>` | `localhost` | Bind address. |
249
265
  | `--port <n>` | `7117` | TCP port to bind. |
266
+ | `--frontend` | off | Serve the bundled SQL explorer shell and print its URL. |
250
267
  | `--cors-origin <origin>` | off | Let browser pages on `<origin>` (an exact origin such as `http://localhost:3202`, or `*` for any) call `/query` and open `/events`. See [Cross-origin requests](#cross-origin-requests). |
251
268
  | `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches under the platform cache directory (`$XDG_CACHE_HOME/dirsql/<root hash>/cache.db` on Linux), outside the root; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
252
269
  | `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in `.git` skip and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/release_speed_test.py -x -q",
3
+ "ran_at": 1791556899,
4
+ "exit_code": 0,
5
+ "commit": "f4ef45b80656a68f454aafdcacc9b56cd555b917",
6
+ "branch": "bot/1469-ci-speed-sanity-1009"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m tests.e2e.bench_suite --pairs 5 --out /tmp/bench-1503 -k watch",
3
+ "ran_at": 1791769095,
4
+ "exit_code": 0,
5
+ "commit": "409ebb5a7e1da55d1516983fcd936cae7fdc952c",
6
+ "branch": "bot/1503-bench-watch-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py tests/e2e/fanout_test.py tests/e2e/extension_package_test.py -x -q",
3
+ "ran_at": 1791556016,
4
+ "exit_code": 0,
5
+ "commit": "fc84f87effcd648162d3c143d308bc0c24222dcb",
6
+ "branch": "bot/issue-1486-frontend-20261009"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/frontmatter_parse_speed_test.py tests/e2e/jsonl_parse_speed_test.py tests/e2e/on_file_query_test.py tests/e2e/query_contract_test.py tests/e2e/fanout_test.py tests/e2e/declared_table_name_test.py tests/e2e/use_case_dossier_test.py tests/e2e/use_case_join_test.py tests/e2e/use_case_notebook_test.py tests/e2e/use_case_transcripts_test.py -x -q -s",
3
+ "ran_at": 1791560842,
4
+ "exit_code": 0,
5
+ "commit": "d5ea2e249e40f6b64e6eb1f799fc47d8290b795e",
6
+ "branch": "bot/speed-parse-paths-1009"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py -x -q",
3
+ "ran_at": 1791561608,
4
+ "exit_code": 0,
5
+ "commit": "d4ace79bbd16978ba199811907976d240ca55507",
6
+ "branch": "bot/speed-walk-sched-1009"
7
+ }
@@ -415,3 +415,56 @@ def assert_speed_of_light(name, result, startup):
415
415
  assert median <= TOLERANCE, (
416
416
  f"bar native {result.bar}: {line}; median is over {TOLERANCE}x"
417
417
  )
418
+
419
+
420
+ SLOWDOWN = 1.5
421
+ RELEASE_PAIRS = 10
422
+ ATTEMPTS = 3
423
+
424
+
425
+ def release_ratios(pr, release, startup, pairs=RELEASE_PAIRS):
426
+ """Per-pair PR/release time ratios, each side net of its own startup.
427
+
428
+ `startup.dirsql` is the PR build's, `startup.native` the release's. One
429
+ discarded warm-up pair, then pairs alternate which build runs first.
430
+ """
431
+ release()
432
+ pr()
433
+ series = run_pairs({"release": release}, pr, pairs)
434
+ return pair_ratios(series.native_seconds["release"], series.dirsql_seconds, startup)
435
+
436
+
437
+ def assert_no_slowdown(name, measure, threshold=SLOWDOWN, attempts=ATTEMPTS):
438
+ """Pass on the first attempt whose median ratio is within `threshold`.
439
+
440
+ Fails only when every attempt is over, so one noisy window on a shared
441
+ runner does not fail the check.
442
+ """
443
+ medians = []
444
+ for attempt in range(1, attempts + 1):
445
+ ratios = measure()
446
+ low, median, high, spread = summarize(ratios)
447
+ print(
448
+ f"SPEED {name} vs release: attempt {attempt}, {len(ratios)} pairs,"
449
+ f" ratio min {low:.3f} median {median:.3f} max {high:.3f}"
450
+ f" spread {spread:.0%}"
451
+ )
452
+ if median <= threshold:
453
+ return
454
+ medians.append(median)
455
+ shown = ", ".join(f"{median:.3f}" for median in medians)
456
+ raise AssertionError(
457
+ f"{name}: PR build is over {threshold}x the previous release on every"
458
+ f" attempt (median ratios {shown})"
459
+ )
460
+
461
+
462
+ def install_release(dest):
463
+ """Install the latest published dirsql into a fresh venv at `dest`."""
464
+ subprocess.run(["uv", "venv", str(dest)], check=True, capture_output=True)
465
+ subprocess.run(
466
+ ["uv", "pip", "install", "--python", str(dest), "dirsql"],
467
+ check=True,
468
+ capture_output=True,
469
+ )
470
+ return dest / "bin" / "dirsql"
@@ -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.110"
9
+ version = "0.4.111"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -237,6 +237,22 @@ On startup the server prints `Running at <host>:<port>` to stdout. It runs
237
237
  until it receives `SIGINT` (Ctrl-C) or `SIGTERM`, then drains in-flight
238
238
  requests, closes open `/events` streams, and exits.
239
239
 
240
+ Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
241
+ the same origin as the HTTP API. It works offline and prints `Frontend at
242
+ http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
243
+ printed URL uses the assigned port. The initial shell shows server status;
244
+ query controls are coming in a subsequent update.
245
+
246
+ ```bash
247
+ dirsql server --frontend
248
+ dirsql server --frontend -c .dirsql.toml
249
+ ```
250
+
251
+ The shell reads `GET /frontend/state`: `{"error":null}` when the index is
252
+ ready, or HTTP `503` with `{"error":"<diagnostic>"}` when config loading
253
+ fails. Fix the config and restart the server. Without `--frontend`, the `/`
254
+ and `/frontend/state` routes return `404`.
255
+
240
256
  ### Flags
241
257
 
242
258
  Config flags are subcommand-local: pass them after `server`
@@ -247,6 +263,7 @@ Config flags are subcommand-local: pass them after `server`
247
263
  | `-c, --config <path>` | none | Path to a [config file](./config.md). **Repeatable** (`-c a -c b`): the configs load and merge in argv order — see [Composing multiple configs](./config.md#composing-multiple-configs). The index root is the **invocation directory** (the current working directory) and governs path-tables; a config's `[[table]]` globs anchor at **that config's own directory** (see [glob anchor](./config.md#glob-anchor)), so `--config /elsewhere/.dirsql.toml` indexes `/elsewhere`, from any working directory. With none given, **no named tables are defined** — query the filesystem with a [path-table](./path-tables.md) (`FROM './'`). A `./.dirsql.toml` on disk is **not** auto-loaded; pass it explicitly. A `-c` naming a file that does not exist is an [error](#degraded-mode). |
248
264
  | `--host <addr>` | `localhost` | Bind address. |
249
265
  | `--port <n>` | `7117` | TCP port to bind. |
266
+ | `--frontend` | off | Serve the bundled SQL explorer shell and print its URL. |
250
267
  | `--cors-origin <origin>` | off | Let browser pages on `<origin>` (an exact origin such as `http://localhost:3202`, or `*` for any) call `/query` and open `/events`. See [Cross-origin requests](#cross-origin-requests). |
251
268
  | `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches under the platform cache directory (`$XDG_CACHE_HOME/dirsql/<root hash>/cache.db` on Linux), outside the root; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
252
269
  | `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in `.git` skip and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
@@ -0,0 +1,60 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>dirsql SQL explorer</title>
7
+ <style>
8
+ :root { color-scheme: light; font-family: ui-sans-serif, system-ui, sans-serif; background: #f4f6f4; color: #173026; }
9
+ * { box-sizing: border-box; }
10
+ body { margin: 0; min-height: 100vh; }
11
+ header { border-bottom: 1px solid #d9e1da; background: #fff; padding: 1.1rem max(1.5rem, calc((100vw - 56rem) / 2)); }
12
+ header strong { font-size: 1.15rem; letter-spacing: -.03em; }
13
+ main { max-width: 56rem; margin: 0 auto; padding: clamp(2rem, 7vw, 5rem) 1.5rem; }
14
+ h1 { font-size: clamp(2rem, 5vw, 3.4rem); line-height: 1.1; letter-spacing: -.055em; margin: 0 0 1rem; }
15
+ p { line-height: 1.6; color: #4a5d51; max-width: 42rem; }
16
+ .panel { margin-top: 2.5rem; padding: 1.5rem; border: 1px solid #d9e1da; border-radius: 12px; background: #fff; box-shadow: 0 3px 12px #17302609; }
17
+ .panel h2 { margin: 0 0 .5rem; font-size: 1rem; }
18
+ .panel p { margin: 0; }
19
+ .error { border-color: #d7a7a1; background: #fff8f7; }
20
+ .error h2 { color: #a0362a; }
21
+ .error pre { white-space: pre-wrap; overflow-wrap: anywhere; font: .9rem/1.5 ui-monospace, monospace; margin: .8rem 0; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+ <header><strong>dirsql</strong></header>
26
+ <main>
27
+ <h1>dirsql SQL explorer</h1>
28
+ <p>Explore the files and tables in this directory with SQL.</p>
29
+ <section class="panel" id="state" aria-live="polite">
30
+ <h2 id="state-title">Connecting to dirsql…</h2>
31
+ <p id="state-message">Checking the server state.</p>
32
+ </section>
33
+ </main>
34
+ <script>
35
+ (async () => {
36
+ const panel = document.getElementById('state');
37
+ const title = document.getElementById('state-title');
38
+ const message = document.getElementById('state-message');
39
+ try {
40
+ const response = await fetch('/frontend/state');
41
+ const state = await response.json();
42
+ if (state.error) {
43
+ panel.classList.add('error');
44
+ title.textContent = 'Configuration could not load';
45
+ message.textContent = state.error + ' Fix the configuration and restart dirsql server.';
46
+ } else if (response.ok) {
47
+ title.textContent = 'Ready to explore';
48
+ message.textContent = 'The SQL explorer is connected to this directory.';
49
+ } else {
50
+ throw new Error('Unexpected server response');
51
+ }
52
+ } catch (error) {
53
+ panel.classList.add('error');
54
+ title.textContent = 'Could not connect';
55
+ message.textContent = error.message;
56
+ }
57
+ })();
58
+ </script>
59
+ </body>
60
+ </html>
@@ -62,6 +62,8 @@ pub struct ServerConfig {
62
62
  /// The `Access-Control-Allow-Origin` value sent on every response, or
63
63
  /// `None` to send no CORS headers (browsers then block cross-origin reads).
64
64
  pub cors_origin: Option<HeaderValue>,
65
+ /// Serve the bundled SQL explorer at `/` and its state at `/frontend/state`.
66
+ pub frontend: bool,
65
67
  }
66
68
 
67
69
  impl ServerConfig {
@@ -73,6 +75,7 @@ impl ServerConfig {
73
75
  port: 0,
74
76
  query_timeout: Duration::from_secs(30),
75
77
  cors_origin: None,
78
+ frontend: false,
76
79
  }
77
80
  }
78
81
 
@@ -83,6 +86,7 @@ impl ServerConfig {
83
86
  port,
84
87
  query_timeout: Duration::from_secs(30),
85
88
  cors_origin: None,
89
+ frontend: false,
86
90
  }
87
91
  }
88
92
 
@@ -99,6 +103,12 @@ impl ServerConfig {
99
103
  self.cors_origin = Some(origin);
100
104
  self
101
105
  }
106
+
107
+ /// Enable the bundled, same-origin SQL explorer.
108
+ pub fn with_frontend(mut self) -> Self {
109
+ self.frontend = true;
110
+ self
111
+ }
102
112
  }
103
113
 
104
114
  impl Default for ServerConfig {
@@ -212,6 +222,12 @@ mod tests {
212
222
  assert_eq!(cfg.cors_origin, Some(HeaderValue::from_static("*")));
213
223
  }
214
224
 
225
+ #[test]
226
+ fn frontend_is_opt_in() {
227
+ assert!(!ServerConfig::ephemeral().frontend);
228
+ assert!(ServerConfig::ephemeral().with_frontend().frontend);
229
+ }
230
+
215
231
  #[test]
216
232
  fn with_query_timeout_overrides_the_default() {
217
233
  let cfg = ServerConfig::bind("127.0.0.1", 8080).with_query_timeout(Duration::from_secs(5));
@@ -8,13 +8,13 @@
8
8
  use std::sync::Arc;
9
9
  use std::time::Duration;
10
10
 
11
- use axum::Json;
12
11
  use axum::Router;
13
12
  use axum::extract::State;
14
13
  use axum::http::{HeaderValue, StatusCode, header};
15
14
  use axum::response::sse::{Event as SseEvent, KeepAlive, Sse};
16
15
  use axum::response::{IntoResponse, Response};
17
16
  use axum::routing::{get, post};
17
+ use axum::{Json, response::Html};
18
18
  use futures::stream::StreamExt;
19
19
  use serde_json::json;
20
20
  use tokio::sync::{broadcast, watch};
@@ -33,8 +33,8 @@ pub(super) struct AppContext {
33
33
 
34
34
  pub(super) type SharedCtx = Arc<AppContext>;
35
35
 
36
- pub(super) fn router(ctx: SharedCtx) -> Router {
37
- Router::new()
36
+ pub(super) fn router(ctx: SharedCtx, frontend: bool) -> Router {
37
+ let mut app = Router::new()
38
38
  .route(
39
39
  "/query",
40
40
  post(handle_query).on(axum::routing::MethodFilter::GET, method_not_allowed),
@@ -42,8 +42,24 @@ pub(super) fn router(ctx: SharedCtx) -> Router {
42
42
  .route(
43
43
  "/events",
44
44
  get(handle_events).on(axum::routing::MethodFilter::POST, method_not_allowed),
45
+ );
46
+ if frontend {
47
+ app = app
48
+ .route("/", get(|| async { Html(include_str!("frontend.html")) }))
49
+ .route("/frontend/state", get(handle_frontend_state));
50
+ }
51
+ app.with_state(ctx)
52
+ }
53
+
54
+ async fn handle_frontend_state(State(ctx): State<SharedCtx>) -> Response {
55
+ match &ctx.state {
56
+ AppState::Ready(_) => Json(json!({ "error": null })).into_response(),
57
+ AppState::Unavailable(reason) => (
58
+ StatusCode::SERVICE_UNAVAILABLE,
59
+ Json(json!({ "error": reason })),
45
60
  )
46
- .with_state(ctx)
61
+ .into_response(),
62
+ }
47
63
  }
48
64
 
49
65
  async fn handle_query(State(ctx): State<SharedCtx>, body: String) -> Response {
@@ -182,6 +198,23 @@ mod tests {
182
198
  assert_eq!(resp.status(), StatusCode::SERVICE_UNAVAILABLE);
183
199
  }
184
200
 
201
+ #[tokio::test]
202
+ async fn frontend_routes_and_state_report_a_config_failure() {
203
+ let (events, _) = broadcast::channel::<String>(1);
204
+ let (_cancel_tx, cancel) = watch::channel(false);
205
+ let ctx = Arc::new(AppContext {
206
+ state: AppState::Unavailable("failed to load config".into()),
207
+ events,
208
+ watch_failure: None,
209
+ cancel,
210
+ query_timeout: Duration::from_secs(1),
211
+ });
212
+
213
+ assert!(router(ctx.clone(), true).has_routes());
214
+ let resp = handle_frontend_state(State(ctx)).await;
215
+ assert_eq!(resp.status(), StatusCode::SERVICE_UNAVAILABLE);
216
+ }
217
+
185
218
  #[test]
186
219
  fn error_response_sets_json_content_type() {
187
220
  let resp = error_response(StatusCode::BAD_REQUEST, "boom");
@@ -177,6 +177,10 @@ enum Command {
177
177
 
178
178
  #[derive(Debug, Args)]
179
179
  struct ServerArgs {
180
+ /// Serve the bundled SQL explorer at the server URL (no browser opens).
181
+ #[arg(long)]
182
+ frontend: bool,
183
+
180
184
  /// Bind address.
181
185
  #[arg(long, default_value = "localhost")]
182
186
  host: String,
@@ -480,6 +484,9 @@ async fn run_server(
480
484
  if let Some(origin) = args.cors_origin {
481
485
  server_config = server_config.with_cors_origin(origin);
482
486
  }
487
+ if args.frontend {
488
+ server_config = server_config.with_frontend();
489
+ }
483
490
 
484
491
  let host = args.host.clone();
485
492
  let handle = match serve_with_state(server_config, state).await {
@@ -491,6 +498,12 @@ async fn run_server(
491
498
  };
492
499
 
493
500
  // Echo back the user-facing hostname (not the resolved IP SocketAddr).
501
+ if args.frontend {
502
+ println!(
503
+ "Frontend at {}",
504
+ frontend_url(&host, handle.local_addr().port())
505
+ );
506
+ }
494
507
  println!("Running at {host}:{}", handle.local_addr().port());
495
508
 
496
509
  if let Err(err) = shutdown.await {
@@ -504,6 +517,16 @@ async fn run_server(
504
517
  0
505
518
  }
506
519
 
520
+ fn frontend_url(host: &str, port: u16) -> String {
521
+ let url_host = match host {
522
+ "0.0.0.0" => "localhost".to_string(),
523
+ "::" | "[::]" => "[::1]".to_string(),
524
+ _ if host.contains(':') && !host.starts_with('[') => format!("[{host}]"),
525
+ _ => host.to_string(),
526
+ };
527
+ format!("http://{url_host}:{port}/")
528
+ }
529
+
507
530
  fn load_state(cfg: &ConfigArgs, path_table_parser: Option<String>) -> AppState {
508
531
  // No `-c` -> index the invocation directory with no named tables. A
509
532
  // `./.dirsql.toml` on disk is NOT consulted (#602); pass it explicitly
@@ -870,6 +893,16 @@ mod tests {
870
893
  }
871
894
  }
872
895
 
896
+ #[test]
897
+ fn frontend_url_uses_a_reachable_and_valid_host() {
898
+ assert_eq!(frontend_url("localhost", 7117), "http://localhost:7117/");
899
+ assert_eq!(frontend_url("0.0.0.0", 7117), "http://localhost:7117/");
900
+ assert_eq!(frontend_url("::", 7117), "http://[::1]:7117/");
901
+ assert_eq!(frontend_url("[::]", 7117), "http://[::1]:7117/");
902
+ assert_eq!(frontend_url("::1", 7117), "http://[::1]:7117/");
903
+ assert_eq!(frontend_url("[::1]", 7117), "http://[::1]:7117/");
904
+ }
905
+
873
906
  fn server_args(argv: &[&str]) -> ServerArgs {
874
907
  match Cli::parse_from(argv).command {
875
908
  Some(Command::Server(args)) => args,
@@ -53,7 +53,7 @@ pub async fn serve_with_state(
53
53
  cancel: cancel_rx,
54
54
  query_timeout: config.query_timeout,
55
55
  });
56
- let mut app = router(shared);
56
+ let mut app = router(shared, config.frontend);
57
57
  if let Some(origin) = config.cors_origin {
58
58
  app = app.layer(
59
59
  CorsLayer::new()