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