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