dirsql 0.4.81__tar.gz → 0.4.83__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.81 → dirsql-0.4.83}/Cargo.lock +2 -2
- {dirsql-0.4.81 → dirsql-0.4.83}/PKG-INFO +1 -1
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/_async.py +4 -1
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/discover_plugins/with_discovered_plugins.py +3 -8
- {dirsql-0.4.81/packages/rust → dirsql-0.4.83}/docs/howto/write-a-plugin.md +10 -10
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/reference/cli.md +3 -2
- {dirsql-0.4.81/packages/rust → dirsql-0.4.83}/docs/reference/config.md +28 -9
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/reference/hooks.md +3 -2
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/reference/sdk.md +6 -2
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/Cargo.toml +1 -1
- dirsql-0.4.83/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +3 -0
- dirsql-0.4.83/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +1 -0
- {dirsql-0.4.81 → dirsql-0.4.83/packages/python}/docs/howto/write-a-plugin.md +10 -10
- {dirsql-0.4.81/packages/rust → dirsql-0.4.83/packages/python}/docs/reference/cli.md +3 -2
- {dirsql-0.4.81 → dirsql-0.4.83/packages/python}/docs/reference/config.md +28 -9
- {dirsql-0.4.81/packages/rust → dirsql-0.4.83/packages/python}/docs/reference/hooks.md +3 -2
- {dirsql-0.4.81/packages/rust → dirsql-0.4.83/packages/python}/docs/reference/sdk.md +6 -2
- dirsql-0.4.83/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +7 -0
- dirsql-0.4.83/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +7 -0
- dirsql-0.4.83/packages/python/e2e-attestations/claude-1232-config-anchor.json +7 -0
- dirsql-0.4.83/packages/python/e2e-attestations/claude-1232-multi-watch.json +7 -0
- dirsql-0.4.83/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +7 -0
- dirsql-0.4.83/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +7 -0
- dirsql-0.4.83/packages/python/e2e-attestations/claude-1330-vtab-read.json +7 -0
- dirsql-0.4.83/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +33 -0
- dirsql-0.4.83/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +30 -0
- dirsql-0.4.83/packages/python/testing-conventions.toml +15 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.81/packages/python → dirsql-0.4.83/packages/rust}/docs/howto/write-a-plugin.md +10 -10
- {dirsql-0.4.81/packages/python → dirsql-0.4.83/packages/rust}/docs/reference/cli.md +3 -2
- {dirsql-0.4.81/packages/python → dirsql-0.4.83/packages/rust}/docs/reference/config.md +28 -9
- {dirsql-0.4.81/packages/python → dirsql-0.4.83/packages/rust}/docs/reference/hooks.md +3 -2
- {dirsql-0.4.81/packages/python → dirsql-0.4.83/packages/rust}/docs/reference/sdk.md +6 -2
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/init.rs +2 -4
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/run.rs +8 -75
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/db.rs +2 -2
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/launcher.rs +1 -7
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/lib.rs +502 -121
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/path_table.rs +95 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/persist.rs +40 -3
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/vtab.rs +68 -2
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/watcher.rs +9 -1
- {dirsql-0.4.81 → dirsql-0.4.83}/pyproject.toml +0 -3
- dirsql-0.4.81/dirsql/cli/discover_plugins/user_passed_config.py +0 -15
- dirsql-0.4.81/packages/python/testing-conventions.toml +0 -31
- {dirsql-0.4.81 → dirsql-0.4.83}/Cargo.toml +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/README.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/py.typed +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/read_config.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/AGENTS.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/context/recipes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/context/usage.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/explanation.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/getting-started.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/embed.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/persist.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/index.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/package.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/plugins.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/reference/columns.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/reference/http-api.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/README.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/conftest.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/reference/http-api.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/README.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/reference/http-api.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/router.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/server.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/matcher.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/on_file.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/scanner.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/tree_walk.rs +0 -0
- {dirsql-0.4.81 → dirsql-0.4.83}/packages/rust/src/vtab_scaffold.rs +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.83"
|
|
556
556
|
dependencies = [
|
|
557
557
|
"assert_cmd",
|
|
558
558
|
"axum",
|
|
@@ -602,7 +602,7 @@ dependencies = [
|
|
|
602
602
|
|
|
603
603
|
[[package]]
|
|
604
604
|
name = "dirsql-py-ext"
|
|
605
|
-
version = "0.4.
|
|
605
|
+
version = "0.4.83"
|
|
606
606
|
dependencies = [
|
|
607
607
|
"dirsql",
|
|
608
608
|
"pyo3",
|
|
@@ -137,7 +137,7 @@ class DirSQL:
|
|
|
137
137
|
if config_extensions is not None:
|
|
138
138
|
extensions = [*(extensions or []), *config_extensions]
|
|
139
139
|
suppress = True
|
|
140
|
-
return
|
|
140
|
+
return self._new_core(
|
|
141
141
|
self._root,
|
|
142
142
|
tables=self._tables,
|
|
143
143
|
ignore=self._ignore,
|
|
@@ -149,6 +149,9 @@ class DirSQL:
|
|
|
149
149
|
suppress_config_extensions=suppress,
|
|
150
150
|
)
|
|
151
151
|
|
|
152
|
+
def _new_core(self, root, **kwargs):
|
|
153
|
+
return _RustDirSQL(root, **kwargs)
|
|
154
|
+
|
|
152
155
|
def _resolved_extensions(self):
|
|
153
156
|
"""Resolve each programmatic extension's ``path`` to a loadable file.
|
|
154
157
|
|
|
@@ -4,24 +4,21 @@ This is the public entry point of the ``discover_plugins`` package (installed =
|
|
|
4
4
|
active, CLI only; #363/#529). A plugin is an ordinary Python package that
|
|
5
5
|
declares ``[project.entry-points.dirsql]`` naming its top-level module and ships
|
|
6
6
|
a ``dirsql.toml`` fragment there; when installed alongside ``dirsql``, the
|
|
7
|
-
``pip``/``uvx`` launcher discovers it and injects the fragment as a ``-c`` flag
|
|
8
|
-
plus the hidden ``--include-default`` (#604) when the user gave no ``-c``.
|
|
7
|
+
``pip``/``uvx`` launcher discovers it and injects the fragment as a ``-c`` flag.
|
|
9
8
|
Opt out via ``--no-plugin`` / ``DIRSQL_NO_PLUGIN=1``. The compiled binary knows
|
|
10
9
|
nothing about plugins, and the SDK never discovers -- only this CLI launcher.
|
|
11
|
-
The helpers each live in their own module (``
|
|
12
|
-
``discovery_disabled``, ``fragment_path``, ``discovered_fragments``).
|
|
10
|
+
The helpers each live in their own module (``discovery_disabled``, ``fragment_path``, ``discovered_fragments``).
|
|
13
11
|
"""
|
|
14
12
|
|
|
15
13
|
from __future__ import annotations
|
|
16
14
|
|
|
17
15
|
from .discovered_fragments import discovered_fragments
|
|
18
16
|
from .discovery_disabled import NO_PLUGIN_FLAG, discovery_disabled
|
|
19
|
-
from .user_passed_config import user_passed_config
|
|
20
17
|
|
|
21
18
|
|
|
22
19
|
def with_discovered_plugins(argv: list[str]) -> list[str]:
|
|
23
20
|
"""Return ``argv`` with each installed plugin's fragment appended as ``-c``
|
|
24
|
-
|
|
21
|
+
``--no-plugin``
|
|
25
22
|
/ ``DIRSQL_NO_PLUGIN`` skip discovery, consuming the flag. ``init`` and ``context`` take no
|
|
26
23
|
config, so they are left untouched. Raises if a declared plugin is missing its
|
|
27
24
|
module or fragment (the launcher surfaces a clean error).
|
|
@@ -40,8 +37,6 @@ def with_discovered_plugins(argv: list[str]) -> list[str]:
|
|
|
40
37
|
if not fragments:
|
|
41
38
|
return argv
|
|
42
39
|
injected: list[str] = []
|
|
43
|
-
if not user_passed_config(argv):
|
|
44
|
-
injected.append("--include-default")
|
|
45
40
|
for fragment in fragments:
|
|
46
41
|
injected.append("-c")
|
|
47
42
|
injected.append(fragment)
|
|
@@ -62,7 +62,9 @@ and [`ignore`](../reference/config.md#dirsql-keys).
|
|
|
62
62
|
There are **no plugin-specific keys and no plugin-specific restrictions**. The
|
|
63
63
|
config schema is content-only: the index root and persistence are
|
|
64
64
|
[runner-owned](../reference/config.md#dirsql-keys) — the root is the directory
|
|
65
|
-
`dirsql` is run from (or an SDK's explicit `root`)
|
|
65
|
+
`dirsql` is run from (or an SDK's explicit `root`) and governs path-tables,
|
|
66
|
+
while a fragment's own `[[table]]` globs anchor at the fragment's directory
|
|
67
|
+
(see [glob anchor](../reference/config.md#glob-anchor)); persistence is the
|
|
66
68
|
`--persist [PATH]` flag — decided by whoever runs `dirsql`, never by a config
|
|
67
69
|
file, so a plugin has nothing to say about them. Whatever you can put in your
|
|
68
70
|
own `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
|
|
@@ -86,11 +88,10 @@ matter most for a published plugin:
|
|
|
86
88
|
- **A hook runs in its declaring config's directory.** For a plugin that is
|
|
87
89
|
the installed fragment's directory — inside **site-packages**. That is a
|
|
88
90
|
read-only, shared location: **run from it, never write to it.** Read the
|
|
89
|
-
matched files from the absolute paths the hook appends as arguments,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
- **The paths are absolute and `{root}` is the index root**, so a command is
|
|
91
|
+
matched files from the absolute paths the hook appends as arguments. Write any cache to a real cache dir, never next to
|
|
92
|
+
the fragment.
|
|
93
|
+
- **The paths are absolute and `{root}` is the table's glob anchor** (the
|
|
94
|
+
fragment's directory, or the literal prefix of an absolute / `~/` glob), so a command is
|
|
94
95
|
self-sufficient from any working directory — it works whether the plugin
|
|
95
96
|
lives in the project or in site-packages.
|
|
96
97
|
|
|
@@ -195,10 +196,9 @@ Discovery is deliberately narrow. Know exactly who does what:
|
|
|
195
196
|
- **The `uvx`/`pip` launcher injects `-c <fragment>` per installed plugin.**
|
|
196
197
|
Each discovered plugin's fragment is appended after your own `-c` configs, so
|
|
197
198
|
your config still takes ordering precedence
|
|
198
|
-
([composing configs](../reference/config.md#composing-multiple-configs)).
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
**add** tables rather than standing alone. Discovery is **pip/uvx only** for now — the `npx`
|
|
199
|
+
([composing configs](../reference/config.md#composing-multiple-configs)). The
|
|
200
|
+
launcher adds only the plugin's tables and functions; it seeds no `records`
|
|
201
|
+
table. Discovery is **pip/uvx only** for now — the `npx`
|
|
202
202
|
launcher does not yet discover — and is switched off per invocation with
|
|
203
203
|
[`--no-plugin` or `DIRSQL_NO_PLUGIN=1`](../reference/cli.md#plugins).
|
|
204
204
|
- **The SDK never auto-discovers.** Pass a plugin's config explicitly (the
|
|
@@ -244,7 +244,7 @@ Config flags are subcommand-local: pass them after `server`
|
|
|
244
244
|
|
|
245
245
|
| Flag | Default | Description |
|
|
246
246
|
|---|---|---|
|
|
247
|
-
| `-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 is
|
|
247
|
+
| `-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
248
|
| `--host <addr>` | `localhost` | Bind address. |
|
|
249
249
|
| `--port <n>` | `7117` | TCP port to bind. |
|
|
250
250
|
| `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches at `<root>/.dirsql/cache.db`; `--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). |
|
|
@@ -465,7 +465,8 @@ installed in the same environment as `dirsql` (`pip install …`, or
|
|
|
465
465
|
loads its fragment — its tables are queryable with zero config edits.
|
|
466
466
|
Installed = active: there is no enable step and no naming convention. The
|
|
467
467
|
fragment is composed *after* your own `-c` configs (so your config takes
|
|
468
|
-
precedence in ordering)
|
|
468
|
+
precedence in ordering). A plugin adds its own tables and nothing else: no
|
|
469
|
+
`records` table is seeded.
|
|
469
470
|
|
|
470
471
|
Discovery is **launcher-only** — the standalone `cargo`-installed binary does no
|
|
471
472
|
discovery, and the SDKs never auto-discover (pass a plugin's config explicitly
|
|
@@ -14,17 +14,19 @@ with none given [no named tables](./cli.md#configless-mode) are defined (a
|
|
|
14
14
|
`./.dirsql.toml` on disk is **not** auto-loaded). The [SDKs](./sdk.md) load a
|
|
15
15
|
config via the `config` constructor parameter.
|
|
16
16
|
|
|
17
|
-
**Path resolution.**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
the
|
|
17
|
+
**Path resolution.** A path written in a config resolves against the config
|
|
18
|
+
file's parent directory: a `[[table]]` `glob` (see [anchoring](#glob-anchor)),
|
|
19
|
+
`ignore`, and `[[dirsql.extension]]` `path`. A config therefore works from any
|
|
20
|
+
working directory. The **index root is not a config concern** — it is decided
|
|
21
|
+
by the runner (the CLI's invocation directory, or an SDK's explicit root) and
|
|
22
|
+
governs only path-tables and programmatic tables. See
|
|
23
|
+
[`--config`](./cli.md#flags).
|
|
22
24
|
|
|
23
25
|
## `[dirsql]` keys
|
|
24
26
|
|
|
25
27
|
| Key | Type | Default | Description |
|
|
26
28
|
|---|---|---|---|
|
|
27
|
-
| `ignore` | array of strings | `[]` | Glob patterns matched against
|
|
29
|
+
| `ignore` | array of strings | `[]` | Glob patterns matched against paths relative to the config file's directory, under the [one glob rule](#glob-rule): `*` matches one level, `**` any depth. They apply only to this config's `[[table]]` entries (not to path-tables, and not to another config's tables). Matched files are skipped entirely — excluded from the initial scan and from watch events. |
|
|
28
30
|
|
|
29
31
|
There is no timeout key. `on-file` hook runs are unbounded; to bound one, wrap
|
|
30
32
|
its command in `timeout(1)` (see [Command hooks](./hooks.md#bounding-a-hook)).
|
|
@@ -230,7 +232,7 @@ what its required `on-file` command emits — dirsql injects nothing (see
|
|
|
230
232
|
|---|---|---|
|
|
231
233
|
| `name` | yes | The table's SQL name — the name you query it by. Declared, never derived from `ddl`: dirsql does not read the DDL text. The `ddl` must create a table by this name; if it doesn't, loading fails. |
|
|
232
234
|
| `ddl` | yes | A SQL batch, run verbatim — any number of statements. It must create a table called `name`; that table holds the file rows, and only the columns it declares are kept (keys the `on-file` command emits that are not declared are dropped). The rest of the batch is yours: indexes, virtual tables, triggers. See [Batch `ddl`](#batch-ddl). |
|
|
233
|
-
| `glob` | yes | Glob pattern
|
|
235
|
+
| `glob` | yes | Glob pattern, [anchored](#glob-anchor) at the config file's directory, under the [one glob rule](#glob-rule): `*` matches one level, `**` any depth. Every table whose glob matches a file receives that file's rows — a file can populate multiple tables. A `{name}` segment is rewritten to `*` (it matches one path segment but captures nothing). |
|
|
234
236
|
| `on-file` | **yes** | A command run once per table, with every matched file's absolute path appended as a trailing argument; its stdout (one JSON array of row objects) is the table's rows. Must be non-empty. A `[[table]]` with no `on-file` is a load error (see [parse errors](#parse-errors)). See [Command hooks](./hooks.md#on-file). |
|
|
235
237
|
| `strict` | no (default `false`) | When `true`, rows whose keys do not exactly match the declared columns are rejected with an error: extra keys error, and every declared column must be supplied by the `on-file` output. When `false`, extra keys are dropped and missing columns become `NULL`. |
|
|
236
238
|
|
|
@@ -256,6 +258,22 @@ on-file = "uv run python extract_papers.py"
|
|
|
256
258
|
strict = true
|
|
257
259
|
```
|
|
258
260
|
|
|
261
|
+
### Glob anchor
|
|
262
|
+
|
|
263
|
+
A table's `glob` is matched beneath its **anchor**, never the index root:
|
|
264
|
+
|
|
265
|
+
| `glob` starts with | Anchor |
|
|
266
|
+
|---|---|
|
|
267
|
+
| nothing special, or `./` | the config file's directory |
|
|
268
|
+
| `/` (or a drive / UNC root) | the literal directory chain before the first glob character |
|
|
269
|
+
| `~/` | your home directory, then the literal chain |
|
|
270
|
+
| `../` | resolved against the config file's directory, then the literal chain |
|
|
271
|
+
|
|
272
|
+
So `glob = "projects/*/*.jsonl"` in `~/.claude/.dirsql.toml` indexes
|
|
273
|
+
`~/.claude/projects` from any working directory, and a shared config elsewhere
|
|
274
|
+
writes `glob = "~/.claude/projects/*/*.jsonl"`. A table's `path` and `dir`
|
|
275
|
+
columns, `{root}`, and `ignore` are all relative to its anchor.
|
|
276
|
+
|
|
259
277
|
### Batch `ddl`
|
|
260
278
|
|
|
261
279
|
`ddl` is handed to SQLite whole, so a table declaration is not limited to one
|
|
@@ -346,7 +364,7 @@ dirsql -c ./.dirsql.toml -c ~/team/embeddings.toml -c ./local.toml
|
|
|
346
364
|
|
|
347
365
|
The configs load and merge in **argv order**:
|
|
348
366
|
|
|
349
|
-
- **`[[table]]`, `
|
|
367
|
+
- **`[[table]]`, `[[dirsql.extension]]`, and `[[dirsql.function]]`
|
|
350
368
|
entries accumulate** across all configs, in order.
|
|
351
369
|
- **Each config's `on-file` hooks and `[[dirsql.function]]` workers run from
|
|
352
370
|
that config file's own directory** — so a relative command like
|
|
@@ -360,7 +378,8 @@ The configs load and merge in **argv order**:
|
|
|
360
378
|
silent last-writer-wins.
|
|
361
379
|
|
|
362
380
|
The index [root](./cli.md#flags) is the invocation directory regardless of where
|
|
363
|
-
any config lives
|
|
381
|
+
any config lives; each config's `[[table]]` globs anchor at that config's own
|
|
382
|
+
directory, and its `ignore` applies to its own tables only. With no `-c`, [no named tables](./cli.md#configless-mode) are
|
|
364
383
|
defined (no `./.dirsql.toml` auto-discovery); a single `-c` behaves exactly as
|
|
365
384
|
before.
|
|
366
385
|
|
|
@@ -42,7 +42,8 @@ relative paths in the command resolve predictably regardless of where
|
|
|
42
42
|
`dirsql` was launched. A command named by the `--on-file` flag has no config
|
|
43
43
|
file: it runs in the **index root**, the directory `dirsql query` was run in,
|
|
44
44
|
which is also the directory a `./` path-table is relative to. In both forms
|
|
45
|
-
`{root}` is the
|
|
45
|
+
`{root}` is where the table's glob is anchored: the index root for `--on-file`,
|
|
46
|
+
the [glob anchor](./config.md#glob-anchor) for a `[[table]]`. The command inherits `dirsql`'s environment, so
|
|
46
47
|
tools like `uvx --with …` / `npx …` resolve their dependencies as usual.
|
|
47
48
|
|
|
48
49
|
### stdout protocol
|
|
@@ -143,7 +144,7 @@ the path or stat metadata emits it (it has the paths).
|
|
|
143
144
|
|
|
144
145
|
| Placeholder | Value |
|
|
145
146
|
|---|---|
|
|
146
|
-
| `{root}` | The index root directory. Derive
|
|
147
|
+
| `{root}` | The directory the table's glob is anchored at (the index root for `--on-file`; the config file's directory, or the literal prefix of an absolute / `~/` glob, for a `[[table]]`). Derive an anchor-relative path with `relpath(path, {root})`. |
|
|
147
148
|
|
|
148
149
|
The matched files' **absolute** paths are not placeholders: they are appended
|
|
149
150
|
to the command as trailing arguments, after everything written in the
|
|
@@ -98,7 +98,9 @@ DirSQL::builder()
|
|
|
98
98
|
|
|
99
99
|
Creates a SQLite index over a directory. The index root is the explicit
|
|
100
100
|
`root` when given, else the **process cwd** — the `config` file's location
|
|
101
|
-
never sets the root.
|
|
101
|
+
never sets the root. A config's `[[table]]` globs anchor at the config file's
|
|
102
|
+
own directory instead (see [glob anchor](./config.md#glob-anchor)); `root`
|
|
103
|
+
governs programmatic tables and path-tables.
|
|
102
104
|
|
|
103
105
|
Constructing with **neither a `config` nor programmatic `tables`** defines
|
|
104
106
|
**no named tables** — the same as the CLI with no
|
|
@@ -127,7 +129,9 @@ shortcut was removed in #603 — use
|
|
|
127
129
|
entries are appended after any programmatic `tables`; its `ignore`
|
|
128
130
|
patterns and `[[dirsql.extension]]` entries are appended likewise. The
|
|
129
131
|
config file does **not** set the index root: with no explicit `root`, the
|
|
130
|
-
index roots at the process cwd.
|
|
132
|
+
index roots at the process cwd. Its `[[table]]` globs anchor at the config
|
|
133
|
+
file's directory (or at the literal prefix of an absolute / `~/` glob), not
|
|
134
|
+
at `root`; its `ignore` applies to its own tables only. **Multiple configs merge in order** on
|
|
131
135
|
every SDK — **Python** `config` accepts a `str` or a `list[str]`, the
|
|
132
136
|
**Rust** builder's `.config()` is repeatable (call it once per file), and
|
|
133
137
|
**TypeScript** `config` accepts a `string` or a `string[]`; the configs
|
|
@@ -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.83"
|
|
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,3 @@
|
|
|
1
|
+
**Changed**
|
|
2
|
+
|
|
3
|
+
- **A config `[[table]]` `glob` now anchors at its config file's directory, not the index root.** `glob = "projects/*/*.jsonl"` in `~/.claude/.dirsql.toml` indexes `~/.claude/projects` from any working directory. A glob may also start with `/`, `~/` or `../` (the path-table prefix grammar): it anchors at the literal directory chain before its first glob character. `{root}` in an `on-file` command, a table's `path`/`dir` columns, and `ignore` are all relative to the table's anchor. A config's `ignore` now applies to that config's tables only, no longer to path-tables or to other configs' tables. The index root (cwd, or `root=`) is unchanged and still governs path-tables and programmatic tables. (#1232)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
**Removed** — an installed plugin no longer seeds a phantom `records` table. The `uvx`/`pip` launcher used to append the hidden `--include-default` whenever it discovered a plugin and the user passed no `-c`, so `SELECT * FROM records` returned one all-NULL row per `**/*.json` file and every query paid a full walk of those files first. A plugin now adds its own tables and functions and nothing else; the internal `--include-default` flag is gone.
|
|
@@ -62,7 +62,9 @@ and [`ignore`](../reference/config.md#dirsql-keys).
|
|
|
62
62
|
There are **no plugin-specific keys and no plugin-specific restrictions**. The
|
|
63
63
|
config schema is content-only: the index root and persistence are
|
|
64
64
|
[runner-owned](../reference/config.md#dirsql-keys) — the root is the directory
|
|
65
|
-
`dirsql` is run from (or an SDK's explicit `root`)
|
|
65
|
+
`dirsql` is run from (or an SDK's explicit `root`) and governs path-tables,
|
|
66
|
+
while a fragment's own `[[table]]` globs anchor at the fragment's directory
|
|
67
|
+
(see [glob anchor](../reference/config.md#glob-anchor)); persistence is the
|
|
66
68
|
`--persist [PATH]` flag — decided by whoever runs `dirsql`, never by a config
|
|
67
69
|
file, so a plugin has nothing to say about them. Whatever you can put in your
|
|
68
70
|
own `.dirsql.toml`, a plugin can put in its fragment, and vice-versa.
|
|
@@ -86,11 +88,10 @@ matter most for a published plugin:
|
|
|
86
88
|
- **A hook runs in its declaring config's directory.** For a plugin that is
|
|
87
89
|
the installed fragment's directory — inside **site-packages**. That is a
|
|
88
90
|
read-only, shared location: **run from it, never write to it.** Read the
|
|
89
|
-
matched files from the absolute paths the hook appends as arguments,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
- **The paths are absolute and `{root}` is the index root**, so a command is
|
|
91
|
+
matched files from the absolute paths the hook appends as arguments. Write any cache to a real cache dir, never next to
|
|
92
|
+
the fragment.
|
|
93
|
+
- **The paths are absolute and `{root}` is the table's glob anchor** (the
|
|
94
|
+
fragment's directory, or the literal prefix of an absolute / `~/` glob), so a command is
|
|
94
95
|
self-sufficient from any working directory — it works whether the plugin
|
|
95
96
|
lives in the project or in site-packages.
|
|
96
97
|
|
|
@@ -195,10 +196,9 @@ Discovery is deliberately narrow. Know exactly who does what:
|
|
|
195
196
|
- **The `uvx`/`pip` launcher injects `-c <fragment>` per installed plugin.**
|
|
196
197
|
Each discovered plugin's fragment is appended after your own `-c` configs, so
|
|
197
198
|
your config still takes ordering precedence
|
|
198
|
-
([composing configs](../reference/config.md#composing-multiple-configs)).
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
**add** tables rather than standing alone. Discovery is **pip/uvx only** for now — the `npx`
|
|
199
|
+
([composing configs](../reference/config.md#composing-multiple-configs)). The
|
|
200
|
+
launcher adds only the plugin's tables and functions; it seeds no `records`
|
|
201
|
+
table. Discovery is **pip/uvx only** for now — the `npx`
|
|
202
202
|
launcher does not yet discover — and is switched off per invocation with
|
|
203
203
|
[`--no-plugin` or `DIRSQL_NO_PLUGIN=1`](../reference/cli.md#plugins).
|
|
204
204
|
- **The SDK never auto-discovers.** Pass a plugin's config explicitly (the
|
|
@@ -244,7 +244,7 @@ Config flags are subcommand-local: pass them after `server`
|
|
|
244
244
|
|
|
245
245
|
| Flag | Default | Description |
|
|
246
246
|
|---|---|---|
|
|
247
|
-
| `-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 is
|
|
247
|
+
| `-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
248
|
| `--host <addr>` | `localhost` | Bind address. |
|
|
249
249
|
| `--port <n>` | `7117` | TCP port to bind. |
|
|
250
250
|
| `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches at `<root>/.dirsql/cache.db`; `--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). |
|
|
@@ -465,7 +465,8 @@ installed in the same environment as `dirsql` (`pip install …`, or
|
|
|
465
465
|
loads its fragment — its tables are queryable with zero config edits.
|
|
466
466
|
Installed = active: there is no enable step and no naming convention. The
|
|
467
467
|
fragment is composed *after* your own `-c` configs (so your config takes
|
|
468
|
-
precedence in ordering)
|
|
468
|
+
precedence in ordering). A plugin adds its own tables and nothing else: no
|
|
469
|
+
`records` table is seeded.
|
|
469
470
|
|
|
470
471
|
Discovery is **launcher-only** — the standalone `cargo`-installed binary does no
|
|
471
472
|
discovery, and the SDKs never auto-discover (pass a plugin's config explicitly
|
|
@@ -14,17 +14,19 @@ with none given [no named tables](./cli.md#configless-mode) are defined (a
|
|
|
14
14
|
`./.dirsql.toml` on disk is **not** auto-loaded). The [SDKs](./sdk.md) load a
|
|
15
15
|
config via the `config` constructor parameter.
|
|
16
16
|
|
|
17
|
-
**Path resolution.**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
the
|
|
17
|
+
**Path resolution.** A path written in a config resolves against the config
|
|
18
|
+
file's parent directory: a `[[table]]` `glob` (see [anchoring](#glob-anchor)),
|
|
19
|
+
`ignore`, and `[[dirsql.extension]]` `path`. A config therefore works from any
|
|
20
|
+
working directory. The **index root is not a config concern** — it is decided
|
|
21
|
+
by the runner (the CLI's invocation directory, or an SDK's explicit root) and
|
|
22
|
+
governs only path-tables and programmatic tables. See
|
|
23
|
+
[`--config`](./cli.md#flags).
|
|
22
24
|
|
|
23
25
|
## `[dirsql]` keys
|
|
24
26
|
|
|
25
27
|
| Key | Type | Default | Description |
|
|
26
28
|
|---|---|---|---|
|
|
27
|
-
| `ignore` | array of strings | `[]` | Glob patterns matched against
|
|
29
|
+
| `ignore` | array of strings | `[]` | Glob patterns matched against paths relative to the config file's directory, under the [one glob rule](#glob-rule): `*` matches one level, `**` any depth. They apply only to this config's `[[table]]` entries (not to path-tables, and not to another config's tables). Matched files are skipped entirely — excluded from the initial scan and from watch events. |
|
|
28
30
|
|
|
29
31
|
There is no timeout key. `on-file` hook runs are unbounded; to bound one, wrap
|
|
30
32
|
its command in `timeout(1)` (see [Command hooks](./hooks.md#bounding-a-hook)).
|
|
@@ -230,7 +232,7 @@ what its required `on-file` command emits — dirsql injects nothing (see
|
|
|
230
232
|
|---|---|---|
|
|
231
233
|
| `name` | yes | The table's SQL name — the name you query it by. Declared, never derived from `ddl`: dirsql does not read the DDL text. The `ddl` must create a table by this name; if it doesn't, loading fails. |
|
|
232
234
|
| `ddl` | yes | A SQL batch, run verbatim — any number of statements. It must create a table called `name`; that table holds the file rows, and only the columns it declares are kept (keys the `on-file` command emits that are not declared are dropped). The rest of the batch is yours: indexes, virtual tables, triggers. See [Batch `ddl`](#batch-ddl). |
|
|
233
|
-
| `glob` | yes | Glob pattern
|
|
235
|
+
| `glob` | yes | Glob pattern, [anchored](#glob-anchor) at the config file's directory, under the [one glob rule](#glob-rule): `*` matches one level, `**` any depth. Every table whose glob matches a file receives that file's rows — a file can populate multiple tables. A `{name}` segment is rewritten to `*` (it matches one path segment but captures nothing). |
|
|
234
236
|
| `on-file` | **yes** | A command run once per table, with every matched file's absolute path appended as a trailing argument; its stdout (one JSON array of row objects) is the table's rows. Must be non-empty. A `[[table]]` with no `on-file` is a load error (see [parse errors](#parse-errors)). See [Command hooks](./hooks.md#on-file). |
|
|
235
237
|
| `strict` | no (default `false`) | When `true`, rows whose keys do not exactly match the declared columns are rejected with an error: extra keys error, and every declared column must be supplied by the `on-file` output. When `false`, extra keys are dropped and missing columns become `NULL`. |
|
|
236
238
|
|
|
@@ -256,6 +258,22 @@ on-file = "uv run python extract_papers.py"
|
|
|
256
258
|
strict = true
|
|
257
259
|
```
|
|
258
260
|
|
|
261
|
+
### Glob anchor
|
|
262
|
+
|
|
263
|
+
A table's `glob` is matched beneath its **anchor**, never the index root:
|
|
264
|
+
|
|
265
|
+
| `glob` starts with | Anchor |
|
|
266
|
+
|---|---|
|
|
267
|
+
| nothing special, or `./` | the config file's directory |
|
|
268
|
+
| `/` (or a drive / UNC root) | the literal directory chain before the first glob character |
|
|
269
|
+
| `~/` | your home directory, then the literal chain |
|
|
270
|
+
| `../` | resolved against the config file's directory, then the literal chain |
|
|
271
|
+
|
|
272
|
+
So `glob = "projects/*/*.jsonl"` in `~/.claude/.dirsql.toml` indexes
|
|
273
|
+
`~/.claude/projects` from any working directory, and a shared config elsewhere
|
|
274
|
+
writes `glob = "~/.claude/projects/*/*.jsonl"`. A table's `path` and `dir`
|
|
275
|
+
columns, `{root}`, and `ignore` are all relative to its anchor.
|
|
276
|
+
|
|
259
277
|
### Batch `ddl`
|
|
260
278
|
|
|
261
279
|
`ddl` is handed to SQLite whole, so a table declaration is not limited to one
|
|
@@ -346,7 +364,7 @@ dirsql -c ./.dirsql.toml -c ~/team/embeddings.toml -c ./local.toml
|
|
|
346
364
|
|
|
347
365
|
The configs load and merge in **argv order**:
|
|
348
366
|
|
|
349
|
-
- **`[[table]]`, `
|
|
367
|
+
- **`[[table]]`, `[[dirsql.extension]]`, and `[[dirsql.function]]`
|
|
350
368
|
entries accumulate** across all configs, in order.
|
|
351
369
|
- **Each config's `on-file` hooks and `[[dirsql.function]]` workers run from
|
|
352
370
|
that config file's own directory** — so a relative command like
|
|
@@ -360,7 +378,8 @@ The configs load and merge in **argv order**:
|
|
|
360
378
|
silent last-writer-wins.
|
|
361
379
|
|
|
362
380
|
The index [root](./cli.md#flags) is the invocation directory regardless of where
|
|
363
|
-
any config lives
|
|
381
|
+
any config lives; each config's `[[table]]` globs anchor at that config's own
|
|
382
|
+
directory, and its `ignore` applies to its own tables only. With no `-c`, [no named tables](./cli.md#configless-mode) are
|
|
364
383
|
defined (no `./.dirsql.toml` auto-discovery); a single `-c` behaves exactly as
|
|
365
384
|
before.
|
|
366
385
|
|
|
@@ -42,7 +42,8 @@ relative paths in the command resolve predictably regardless of where
|
|
|
42
42
|
`dirsql` was launched. A command named by the `--on-file` flag has no config
|
|
43
43
|
file: it runs in the **index root**, the directory `dirsql query` was run in,
|
|
44
44
|
which is also the directory a `./` path-table is relative to. In both forms
|
|
45
|
-
`{root}` is the
|
|
45
|
+
`{root}` is where the table's glob is anchored: the index root for `--on-file`,
|
|
46
|
+
the [glob anchor](./config.md#glob-anchor) for a `[[table]]`. The command inherits `dirsql`'s environment, so
|
|
46
47
|
tools like `uvx --with …` / `npx …` resolve their dependencies as usual.
|
|
47
48
|
|
|
48
49
|
### stdout protocol
|
|
@@ -143,7 +144,7 @@ the path or stat metadata emits it (it has the paths).
|
|
|
143
144
|
|
|
144
145
|
| Placeholder | Value |
|
|
145
146
|
|---|---|
|
|
146
|
-
| `{root}` | The index root directory. Derive
|
|
147
|
+
| `{root}` | The directory the table's glob is anchored at (the index root for `--on-file`; the config file's directory, or the literal prefix of an absolute / `~/` glob, for a `[[table]]`). Derive an anchor-relative path with `relpath(path, {root})`. |
|
|
147
148
|
|
|
148
149
|
The matched files' **absolute** paths are not placeholders: they are appended
|
|
149
150
|
to the command as trailing arguments, after everything written in the
|
|
@@ -98,7 +98,9 @@ DirSQL::builder()
|
|
|
98
98
|
|
|
99
99
|
Creates a SQLite index over a directory. The index root is the explicit
|
|
100
100
|
`root` when given, else the **process cwd** — the `config` file's location
|
|
101
|
-
never sets the root.
|
|
101
|
+
never sets the root. A config's `[[table]]` globs anchor at the config file's
|
|
102
|
+
own directory instead (see [glob anchor](./config.md#glob-anchor)); `root`
|
|
103
|
+
governs programmatic tables and path-tables.
|
|
102
104
|
|
|
103
105
|
Constructing with **neither a `config` nor programmatic `tables`** defines
|
|
104
106
|
**no named tables** — the same as the CLI with no
|
|
@@ -127,7 +129,9 @@ shortcut was removed in #603 — use
|
|
|
127
129
|
entries are appended after any programmatic `tables`; its `ignore`
|
|
128
130
|
patterns and `[[dirsql.extension]]` entries are appended likewise. The
|
|
129
131
|
config file does **not** set the index root: with no explicit `root`, the
|
|
130
|
-
index roots at the process cwd.
|
|
132
|
+
index roots at the process cwd. Its `[[table]]` globs anchor at the config
|
|
133
|
+
file's directory (or at the literal prefix of an absolute / `~/` glob), not
|
|
134
|
+
at `root`; its `ignore` applies to its own tables only. **Multiple configs merge in order** on
|
|
131
135
|
every SDK — **Python** `config` accepts a `str` or a `list[str]`, the
|
|
132
136
|
**Rust** builder's `.config()` is repeatable (call it once per file), and
|
|
133
137
|
**TypeScript** `config` accepts a `string` or a `string[]`; the configs
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/plugin_discovery_test.py tests/e2e/plugin_extension_discovery_test.py tests/e2e/extension_package_test.py tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791301754,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "9a556e333ff2cbcbcba2e6eba31a3e14c7aab008",
|
|
6
|
+
"branch": "claude/1225-plugin-no-default"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/capture_collision_test.py tests/e2e/declared_table_name_test.py tests/e2e/extension_package_test.py tests/e2e/query_contract_test.py tests/e2e/plugin_discovery_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/fanout_test.py tests/e2e/use_case_transcripts_test.py tests/e2e/plugin_extension_discovery_test.py tests/e2e/on_file_query_test.py -x -q",
|
|
3
|
+
"ran_at": 1791302031,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "1746a7286f9b11c9ecb0078ec263e69ecce29d7f",
|
|
6
|
+
"branch": "claude/1232-anchor-plumbing"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/fanout_test.py tests/e2e/capture_collision_test.py tests/e2e/declared_table_name_test.py tests/e2e/extension_package_test.py tests/e2e/plugin_discovery_test.py tests/e2e/use_case_notebook_test.py tests/e2e/on_file_query_test.py tests/e2e/use_case_transcripts_test.py tests/e2e/plugin_extension_discovery_test.py tests/e2e/use_case_join_test.py tests/e2e/use_case_dossier_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791304886,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "f34d689dd854cb17c0daad87be0efebb4a45fdb6",
|
|
6
|
+
"branch": "claude/1232-config-anchor"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/capture_collision_test.py tests/e2e/declared_table_name_test.py tests/e2e/extension_package_test.py tests/e2e/query_contract_test.py tests/e2e/plugin_discovery_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/fanout_test.py tests/e2e/use_case_transcripts_test.py tests/e2e/plugin_extension_discovery_test.py tests/e2e/on_file_query_test.py -x -q",
|
|
3
|
+
"ran_at": 1791304050,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "8618c31f0280a80e7d09550fdb931c6460741db7",
|
|
6
|
+
"branch": "claude/1232-multi-watch"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/capture_collision_test.py tests/e2e/fanout_test.py tests/e2e/cli_version_test.py tests/e2e/extension_package_test.py tests/e2e/on_file_query_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/plugin_extension_discovery_test.py tests/e2e/plugin_discovery_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791302200,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "1553e866cb8da7050a1c444833e269c831f6e0a1",
|
|
6
|
+
"branch": "claude/1330-python-dirsql-patch"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/capture_collision_test.py tests/e2e/fanout_test.py tests/e2e/cli_version_test.py tests/e2e/extension_package_test.py tests/e2e/on_file_query_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/plugin_extension_discovery_test.py tests/e2e/plugin_discovery_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791302302,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "97413988a4b984de31f96d190d2164d61279d7c5",
|
|
6
|
+
"branch": "claude/1330-python-extensions-patch"
|
|
7
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
### Config globs anchor at the config file's directory (#1232)
|
|
2
|
+
|
|
3
|
+
#### Summary
|
|
4
|
+
|
|
5
|
+
A `[[table]]` `glob` is matched beneath the directory of the config file that wrote it (or, for a `/`, `~/` or `../` glob, beneath its literal prefix), no longer beneath the index root. A config that relied on running from the directory it describes still works when that is also the config's directory; a config kept apart from its data, or one given an explicit root, now indexes the config's directory and needs its globs rewritten.
|
|
6
|
+
|
|
7
|
+
#### Required changes
|
|
8
|
+
|
|
9
|
+
| Surface | Before | After |
|
|
10
|
+
| ------- | ------ | ----- |
|
|
11
|
+
| `DirSQL(root="/data", config="/cfg/.dirsql.toml")` with `glob = "**/*.md"` | indexes `/data` | indexes `/cfg`; write `glob = "/data/**/*.md"` to index `/data` |
|
|
12
|
+
| `dirsql -c /cfg/.dirsql.toml` run from `/data` | indexes `/data` | indexes `/cfg` |
|
|
13
|
+
| `ignore` in a config | applied to every table and to path-tables | applies to that config's tables, relative to their anchor |
|
|
14
|
+
| A table over a directory other than the config's | `glob = "docs/*.md"` with the root elsewhere | `glob = "/data/docs/*.md"` or `glob = "~/data/docs/*.md"` |
|
|
15
|
+
| `{root}` in an `on-file` command | the index root | the table's anchor (the config's directory, or the literal prefix of an absolute glob) |
|
|
16
|
+
|
|
17
|
+
#### Deprecations removed
|
|
18
|
+
|
|
19
|
+
_None._
|
|
20
|
+
|
|
21
|
+
#### Behavior changes without code changes
|
|
22
|
+
|
|
23
|
+
- A config table's `path` column is relative to its anchor.
|
|
24
|
+
- A programmatic table and a path-table still use the index root.
|
|
25
|
+
|
|
26
|
+
#### Verification
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
mkdir -p /tmp/cfg/projects/p /tmp/elsewhere
|
|
30
|
+
echo '{}' > /tmp/cfg/projects/p/a.jsonl
|
|
31
|
+
printf '[[table]]\nname = "sessions"\nddl = "CREATE TABLE sessions (n TEXT)"\nglob = "projects/*/*.jsonl"\non-file = "echo [{}]"\n' > /tmp/cfg/.dirsql.toml
|
|
32
|
+
cd /tmp/elsewhere && dirsql query "SELECT COUNT(*) AS n FROM sessions" -c /tmp/cfg/.dirsql.toml # [{"n":1}]
|
|
33
|
+
```
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
### Plugin launcher no longer seeds a `records` table
|
|
2
|
+
|
|
3
|
+
#### Summary
|
|
4
|
+
|
|
5
|
+
With a plugin installed, the `uvx`/`pip` launcher used to add the hidden `--include-default`, which seeded a placeholder `records` table (glob `**/*.json`, every row all-NULL) alongside the plugin's tables. It now injects only `-c <fragment>` per plugin. Queries that never named `records` are unaffected and no longer walk every JSON file first; a query that read the placeholder `records` now fails with `no such table: records`.
|
|
6
|
+
|
|
7
|
+
#### Required changes
|
|
8
|
+
|
|
9
|
+
| Surface | Before | After |
|
|
10
|
+
| ------- | ------ | ----- |
|
|
11
|
+
| `SELECT count(*) FROM records` with a plugin installed | one row per `*.json` file | `no such table: records` |
|
|
12
|
+
| Want a real `records` table | (placeholder) | define it in your own config and pass it with `-c` |
|
|
13
|
+
|
|
14
|
+
#### Deprecations removed
|
|
15
|
+
|
|
16
|
+
The hidden `--include-default` flag (internal, never documented) is removed.
|
|
17
|
+
|
|
18
|
+
#### Behavior changes without code changes
|
|
19
|
+
|
|
20
|
+
- Plugin-enabled queries no longer show a `dirsql: indexing N/M files` progress line for files no plugin table matches.
|
|
21
|
+
|
|
22
|
+
#### Verification
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cd "$(mktemp -d)"
|
|
26
|
+
echo '{"id":1}' > a.json
|
|
27
|
+
uvx --with dirsql-plugin-embeddings dirsql query "SELECT count(*) FROM records"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Expected: `no such table: records`.
|