precis-cli 0.1.4__tar.gz → 0.1.5__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.
- precis_cli-0.1.5/PKG-INFO +160 -0
- precis_cli-0.1.5/PYPI_README.md +97 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/__init__.py +39 -1
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/chat.py +1 -1
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/executor.py +1 -1
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/switch.py +1 -1
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/help.py +6 -2
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/formatter.py +7 -4
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/openai.py +1 -1
- precis_cli-0.1.5/precis_cli.egg-info/PKG-INFO +160 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/SOURCES.txt +1 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/pyproject.toml +5 -2
- precis_cli-0.1.4/PKG-INFO +0 -180
- precis_cli-0.1.4/precis_cli.egg-info/PKG-INFO +0 -180
- {precis_cli-0.1.4 → precis_cli-0.1.5}/MANIFEST.in +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/README.md +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/dependencies.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/main.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/exception_handler.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/request_logging.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/token_auth.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/connection_rules.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/files.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/full_validation.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/project.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/projects.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/schema.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/v2_responses.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/validation.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/workspace.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/chat.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/generate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/hardware.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/jobs.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/migrate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/models.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/ollama.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/providers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/router.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/stream.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/utils.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/connection_rules.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/data_sources.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/regex.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/reporting.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/files/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/files/ops.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/files/transfer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/content_mode.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/header_row.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/models.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/path_mode.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/router.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/constraint.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/full_config.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/full_config_writer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/helpers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/inspection_fix.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/manifest.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/models.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/pattern.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/regex.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/scanner.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/schema.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/schema_helpers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/settings.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/template.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/validation.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/view.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/workspaces.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/create.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/open.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/scan.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/common.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/content_mode.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/history.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/inline_mode.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/path_mode.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/router.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/services/full_validation_response_builder.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/services/io_error_messages.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/services/preview_service.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/__main__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/config_ops.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/generation_ops.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/project_ops.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/delete.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/diff.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/display.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/executor_utils.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/generate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/interaction.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/migrate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/resolver.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/status.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/utils.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/check.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/edit.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/get.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/init.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/inspect.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/list.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/set.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/show.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/exit.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/infer_schema.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/open.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/project.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/provider.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/system.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/validate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/completer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/config_storage.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/exceptions.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/interactive_menu.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/main.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/parser.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/start.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli_main.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/mcp_server.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/app_version.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/config/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/config/server.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/converter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/csv_loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/excel_loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/extractor.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/json_loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/sql_loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/array_parser.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/lines_parser.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/object_parser.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/schema_info.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/csv_source.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/excel_source.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/file_base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/json_source.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/sql_source.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/encoding.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/io/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/io/yaml.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/manifest_schema/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/manifest_schema/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/manifest_schema/version.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/patterns/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/patterns/loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/patterns/writer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/composite.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/conditional.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/foreign_key.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/scripted.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/single_column.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/unique.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/factory.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/reader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types/constraint_file.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types/refs.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/writer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/config_inspector.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/embedded_constraints.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/file_loaders.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspection_ids.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_helpers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_id_checks.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_reference_checks.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_uniqueness_checks.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/loading_error_messages.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/main.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/path_validation.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/runtime.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/coverage.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/reader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/constants.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/data_source.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/info.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/manifest.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/refs.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings_file_processing.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings_script_security.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings_validation.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/template.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/writer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manual_data/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manual_data/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/regex/reader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/regex/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/regex/writer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/reader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/column.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/column_utils.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/constraint.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/schema_id.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/source.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/source_options.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/table.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/writer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema_ref_check.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/expander.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/reader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/transform/reader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/transform/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/transform/writer.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/pydantic_messages.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/dingtalk_app_reporter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/email_reporter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/feishu_app_reporter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/local_file_reporter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/wecom_app_reporter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/utils/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/utils/path_utils.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/utils/regex_extract.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/allowed_values.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/charset.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/composite.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/condition_registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/conditional.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/date_logic.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/foreign_key.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/key_normalization.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/not_null.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/range.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/regex.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/scripted.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/unique.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_engine.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/composite.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/expression.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/extracted.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/json_types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/scalars.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/sequence.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/dataset_schema.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/eval_sandbox.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/expression_system.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/regex_flags.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/schema/builder.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/schema/models.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/aggregate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/cast_type.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/concat.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/conditional_assign.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/date_format.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/digits.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/drop_duplicates.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/fill_na.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/filter_rows.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/lookup.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/lower_case.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/map_value.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/math_expr.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/modulo.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/regex_extract.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/replace.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/sort_rows.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/string_split.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/strip.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/substring.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/upper_case.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/weighted_sum.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/validation_constraints.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/apply_actions.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/ask_user.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/read_canvas.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/read_project.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/read_table.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/schemas.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/validate_table.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/executor.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/memory.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/planner.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tool_registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/config_generate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/config_refine.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/config_validate.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/merge_results.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/plan_chunks.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/script_parse.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/chat_agent_runner.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/chat_orchestrator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/failure_messages.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/job_storage.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/migrate_service.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/event_journal.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/orchestrator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/pending_interaction_store.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/sse_response.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/utils.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/diff/config_diff.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/hardware.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_canvas_validator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_constraint_validator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_regex_validator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_schema_validator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_settings_validator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_transform_validator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_handlers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_parser.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_processor.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_validator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/diff_compute.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/regex_handlers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/schema_handlers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/settings_handlers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/specs.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/transform_handlers.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/validation_types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/cache/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/cache/response_cache.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/chat/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/chat/chat_system_prompt.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/chat/response_parser.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/crypto.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/models.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/presets.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config_generator.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/constraint_builder.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/constraint_deletion.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/constraint_id.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/frontend_instructions.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/inline_batch.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/discovery/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/discovery/scanner.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/agent_wiring.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/config_builder.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/errors.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/existing_config.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/profiler.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/prompt_builder.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/response_parser.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/service.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/models.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/cached_provider.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/ollama.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/registry.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/schema_resolver.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/suggestion_utils.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/validate_executor.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/yaml_io.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/preview/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/preview/loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/preview/path_validation.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/project_loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/schema_inference.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/schema_runtime_builder.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/chunked_loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/builder.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/executor.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/sorter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/data_loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/engine.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/executor.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/extractors.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/history.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/json_payload.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/loader.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/memory_monitor.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/postprocess.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/progress.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/report_export.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/resolver.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/service.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/types.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/__init__.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/adapter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/base.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/composite.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/date_logic.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/app/start_server.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/dependency_links.txt +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/entry_points.txt +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/requires.txt +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/top_level.txt +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/setup.cfg +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/tests/test_local_file_reporter.py +0 -0
- {precis_cli-0.1.4 → precis_cli-0.1.5}/tests/test_schema_builder.py +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: precis-cli
|
|
3
|
+
Version: 0.1.5
|
|
4
|
+
Summary: Precis - 可配置数据校验工具 CLI(校验 CSV/Excel/JSON 数据质量)
|
|
5
|
+
Author: Precis Team
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/AirSaiga/Precis
|
|
8
|
+
Project-URL: Repository, https://github.com/AirSaiga/Precis
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/AirSaiga/Precis/issues
|
|
10
|
+
Project-URL: Discussions, https://github.com/AirSaiga/Precis/discussions
|
|
11
|
+
Keywords: data-quality,data-validation,csv,excel,json,yaml,cli,mcp
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Classifier: Topic :: Software Development :: Testing
|
|
20
|
+
Requires-Python: <3.14,>=3.12
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Requires-Dist: pydantic>=2.12.0
|
|
23
|
+
Requires-Dist: pandas<3.0,>=2.2.0
|
|
24
|
+
Requires-Dist: openpyxl>=3.1.5
|
|
25
|
+
Requires-Dist: xlrd>=2.0.1
|
|
26
|
+
Requires-Dist: SQLAlchemy>=2.0.48
|
|
27
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
28
|
+
Requires-Dist: ruamel.yaml>=0.19.0
|
|
29
|
+
Requires-Dist: rich>=13.0.0
|
|
30
|
+
Requires-Dist: readchar>=4.2.0
|
|
31
|
+
Requires-Dist: cryptography>=44.0.0
|
|
32
|
+
Requires-Dist: simpleeval>=1.0.0
|
|
33
|
+
Requires-Dist: filelock>=3.12.0
|
|
34
|
+
Provides-Extra: api
|
|
35
|
+
Requires-Dist: fastapi!=0.136.3,>=0.135.0; extra == "api"
|
|
36
|
+
Requires-Dist: uvicorn>=0.42.0; extra == "api"
|
|
37
|
+
Requires-Dist: email-validator>=2.3.0; extra == "api"
|
|
38
|
+
Requires-Dist: uritemplate>=4.2.0; extra == "api"
|
|
39
|
+
Requires-Dist: python-multipart>=0.0.26; extra == "api"
|
|
40
|
+
Requires-Dist: cryptography>=44.0.0; extra == "api"
|
|
41
|
+
Provides-Extra: ai
|
|
42
|
+
Requires-Dist: openai>=1.6.0; extra == "ai"
|
|
43
|
+
Requires-Dist: aiohttp>=3.9.0; extra == "ai"
|
|
44
|
+
Requires-Dist: psutil>=5.9.6; extra == "ai"
|
|
45
|
+
Provides-Extra: mcp
|
|
46
|
+
Requires-Dist: mcp<2,>=1.30.0; extra == "mcp"
|
|
47
|
+
Provides-Extra: completion
|
|
48
|
+
Requires-Dist: pyreadline3>=0.1.8; sys_platform == "win32" and extra == "completion"
|
|
49
|
+
Provides-Extra: full
|
|
50
|
+
Requires-Dist: precis-cli[ai,api,completion,mcp]; extra == "full"
|
|
51
|
+
Provides-Extra: dev
|
|
52
|
+
Requires-Dist: precis-cli[ai,api,mcp]; extra == "dev"
|
|
53
|
+
Requires-Dist: debugpy>=1.8.0; extra == "dev"
|
|
54
|
+
Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
55
|
+
Requires-Dist: mypy>=1.10.0; extra == "dev"
|
|
56
|
+
Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
|
|
57
|
+
Requires-Dist: pytest>=9.0.3; extra == "dev"
|
|
58
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
59
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
60
|
+
Requires-Dist: httpx>=0.27.0; extra == "dev"
|
|
61
|
+
Requires-Dist: build>=1.0.0; extra == "dev"
|
|
62
|
+
Requires-Dist: twine>=5.0.0; extra == "dev"
|
|
63
|
+
|
|
64
|
+
# Precis CLI
|
|
65
|
+
|
|
66
|
+
> Local-first data validation engine — define schemas and constraints in YAML, validate CSV / Excel / JSON with a single command.
|
|
67
|
+
> 本地优先的数据校验引擎:用 YAML 定义表结构与约束规则,一条命令校验 CSV / Excel / JSON。
|
|
68
|
+
|
|
69
|
+
**Alpha** — 核心功能稳定,配置格式有版本保障(V2)。
|
|
70
|
+
|
|
71
|
+
## 安装
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install precis-cli # 需要 Python >= 3.12
|
|
75
|
+
|
|
76
|
+
# 或免安装直接运行(需要 uv)
|
|
77
|
+
uvx --from precis-cli precis --version
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 快速上手
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# 1. 从数据文件推断 schema 草稿
|
|
84
|
+
precis infer-schema orders.csv > schemas/orders.schema.yaml
|
|
85
|
+
|
|
86
|
+
# 2. 在项目清单 project.precis.yaml 中登记 schema 与约束文件
|
|
87
|
+
# (格式见下方示例)
|
|
88
|
+
|
|
89
|
+
# 3. 执行校验
|
|
90
|
+
precis validate --manifest project.precis.yaml --format json
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
退出码契约(CI / AI agent 友好):
|
|
94
|
+
|
|
95
|
+
| 退出码 | 含义 |
|
|
96
|
+
|--------|------|
|
|
97
|
+
| `0` | 校验通过 |
|
|
98
|
+
| `1` | 校验完成,发现数据违规(详情见 JSON 输出的 `errors`) |
|
|
99
|
+
| `2` | 工具自身错误(参数错误、文件不存在、异常崩溃) |
|
|
100
|
+
|
|
101
|
+
## 配置示例(V2 YAML)
|
|
102
|
+
|
|
103
|
+
`project.precis.yaml`:
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
version: 2
|
|
107
|
+
project:
|
|
108
|
+
id: my-project
|
|
109
|
+
name: 订单数据校验
|
|
110
|
+
schemas:
|
|
111
|
+
- id: orders
|
|
112
|
+
path: schemas/orders.schema.yaml
|
|
113
|
+
constraints:
|
|
114
|
+
- id: orders_amount_range
|
|
115
|
+
path: constraints/orders_amount_range.constraint.yaml
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`constraints/orders_amount_range.constraint.yaml`:
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
version: 2
|
|
122
|
+
id: orders_amount_range
|
|
123
|
+
type: Range
|
|
124
|
+
enabled: true
|
|
125
|
+
refs:
|
|
126
|
+
table_id: orders
|
|
127
|
+
column_id: amount
|
|
128
|
+
params:
|
|
129
|
+
min: 0
|
|
130
|
+
max: 1000000
|
|
131
|
+
boundary_mode: inclusive
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 10 种约束类型
|
|
135
|
+
|
|
136
|
+
`NotNull` 非空 · `Unique` 唯一 · `AllowedValues` 枚举 · `Range` 数值区间 ·
|
|
137
|
+
`ForeignKey` 跨表引用 · `Conditional` 条件约束 · `Scripted` 脚本表达式 ·
|
|
138
|
+
`Charset` 字符集 · `DateLogic` 日期逻辑 · `Composite` 组合约束
|
|
139
|
+
|
|
140
|
+
数据类型:`string` / `integer` / `float` / `decimal` / `boolean` / `date`。
|
|
141
|
+
大文件(>500MB)自动分块加载。
|
|
142
|
+
|
|
143
|
+
## 与 AI Agent 集成
|
|
144
|
+
|
|
145
|
+
`--format json` 输出为机器可读契约(含行级错误定位与约束来源文件回溯),
|
|
146
|
+
可直接被 AI 编程助手消费:
|
|
147
|
+
|
|
148
|
+
- **MCP server**:`pip install "precis-cli[mcp]"` 后运行 `precis-mcp`(stdio),
|
|
149
|
+
提供 `validate_data` / `infer_schema` / `check_config` / `describe_constraints` 四个工具
|
|
150
|
+
- **Kimi Code 插件**:`/plugins install https://github.com/AirSaiga/Precis`
|
|
151
|
+
- **CLI 自带 AI 命令**(自然语言生成/修改校验配置,独立于宿主 agent):
|
|
152
|
+
`pip install "precis-cli[ai]"`,然后 `precis ai chat` 或 `precis ai ask "..."`
|
|
153
|
+
|
|
154
|
+
## 链接
|
|
155
|
+
|
|
156
|
+
- 仓库与文档:<https://github.com/AirSaiga/Precis>
|
|
157
|
+
- 问题反馈:<https://github.com/AirSaiga/Precis/issues>
|
|
158
|
+
- 桌面 GUI 版本(画布式可视化编辑)见仓库 releases
|
|
159
|
+
|
|
160
|
+
License: Apache-2.0
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Precis CLI
|
|
2
|
+
|
|
3
|
+
> Local-first data validation engine — define schemas and constraints in YAML, validate CSV / Excel / JSON with a single command.
|
|
4
|
+
> 本地优先的数据校验引擎:用 YAML 定义表结构与约束规则,一条命令校验 CSV / Excel / JSON。
|
|
5
|
+
|
|
6
|
+
**Alpha** — 核心功能稳定,配置格式有版本保障(V2)。
|
|
7
|
+
|
|
8
|
+
## 安装
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pip install precis-cli # 需要 Python >= 3.12
|
|
12
|
+
|
|
13
|
+
# 或免安装直接运行(需要 uv)
|
|
14
|
+
uvx --from precis-cli precis --version
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 快速上手
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 1. 从数据文件推断 schema 草稿
|
|
21
|
+
precis infer-schema orders.csv > schemas/orders.schema.yaml
|
|
22
|
+
|
|
23
|
+
# 2. 在项目清单 project.precis.yaml 中登记 schema 与约束文件
|
|
24
|
+
# (格式见下方示例)
|
|
25
|
+
|
|
26
|
+
# 3. 执行校验
|
|
27
|
+
precis validate --manifest project.precis.yaml --format json
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
退出码契约(CI / AI agent 友好):
|
|
31
|
+
|
|
32
|
+
| 退出码 | 含义 |
|
|
33
|
+
|--------|------|
|
|
34
|
+
| `0` | 校验通过 |
|
|
35
|
+
| `1` | 校验完成,发现数据违规(详情见 JSON 输出的 `errors`) |
|
|
36
|
+
| `2` | 工具自身错误(参数错误、文件不存在、异常崩溃) |
|
|
37
|
+
|
|
38
|
+
## 配置示例(V2 YAML)
|
|
39
|
+
|
|
40
|
+
`project.precis.yaml`:
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
version: 2
|
|
44
|
+
project:
|
|
45
|
+
id: my-project
|
|
46
|
+
name: 订单数据校验
|
|
47
|
+
schemas:
|
|
48
|
+
- id: orders
|
|
49
|
+
path: schemas/orders.schema.yaml
|
|
50
|
+
constraints:
|
|
51
|
+
- id: orders_amount_range
|
|
52
|
+
path: constraints/orders_amount_range.constraint.yaml
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`constraints/orders_amount_range.constraint.yaml`:
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
version: 2
|
|
59
|
+
id: orders_amount_range
|
|
60
|
+
type: Range
|
|
61
|
+
enabled: true
|
|
62
|
+
refs:
|
|
63
|
+
table_id: orders
|
|
64
|
+
column_id: amount
|
|
65
|
+
params:
|
|
66
|
+
min: 0
|
|
67
|
+
max: 1000000
|
|
68
|
+
boundary_mode: inclusive
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 10 种约束类型
|
|
72
|
+
|
|
73
|
+
`NotNull` 非空 · `Unique` 唯一 · `AllowedValues` 枚举 · `Range` 数值区间 ·
|
|
74
|
+
`ForeignKey` 跨表引用 · `Conditional` 条件约束 · `Scripted` 脚本表达式 ·
|
|
75
|
+
`Charset` 字符集 · `DateLogic` 日期逻辑 · `Composite` 组合约束
|
|
76
|
+
|
|
77
|
+
数据类型:`string` / `integer` / `float` / `decimal` / `boolean` / `date`。
|
|
78
|
+
大文件(>500MB)自动分块加载。
|
|
79
|
+
|
|
80
|
+
## 与 AI Agent 集成
|
|
81
|
+
|
|
82
|
+
`--format json` 输出为机器可读契约(含行级错误定位与约束来源文件回溯),
|
|
83
|
+
可直接被 AI 编程助手消费:
|
|
84
|
+
|
|
85
|
+
- **MCP server**:`pip install "precis-cli[mcp]"` 后运行 `precis-mcp`(stdio),
|
|
86
|
+
提供 `validate_data` / `infer_schema` / `check_config` / `describe_constraints` 四个工具
|
|
87
|
+
- **Kimi Code 插件**:`/plugins install https://github.com/AirSaiga/Precis`
|
|
88
|
+
- **CLI 自带 AI 命令**(自然语言生成/修改校验配置,独立于宿主 agent):
|
|
89
|
+
`pip install "precis-cli[ai]"`,然后 `precis ai chat` 或 `precis ai ask "..."`
|
|
90
|
+
|
|
91
|
+
## 链接
|
|
92
|
+
|
|
93
|
+
- 仓库与文档:<https://github.com/AirSaiga/Precis>
|
|
94
|
+
- 问题反馈:<https://github.com/AirSaiga/Precis/issues>
|
|
95
|
+
- 桌面 GUI 版本(画布式可视化编辑)见仓库 releases
|
|
96
|
+
|
|
97
|
+
License: Apache-2.0
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
- 支持直接通过自然语言执行 AI 指令
|
|
24
24
|
|
|
25
25
|
架构设计:
|
|
26
|
-
- AICommand 作为聚合命令,管理 chat、status、switch、delete、
|
|
26
|
+
- AICommand 作为聚合命令,管理 chat、status、switch、delete、provider 等子命令
|
|
27
|
+
- 裸装(无 [ai] extra)时入口门控:help 标注缺依赖,execute 直接给安装指引
|
|
27
28
|
- 无参数时显示交互式菜单(支持方向键导航)
|
|
28
29
|
- 第一个参数如果不是子命令,则将其视为直接询问的消息
|
|
29
30
|
- 使用 execute_ai_chat 统一执行 AI 对话
|
|
@@ -52,6 +53,31 @@ from app.cli.shell.config_storage import get_cli_config
|
|
|
52
53
|
from app.cli.shell.formatter import Formatter
|
|
53
54
|
from app.cli.shell.interactive_menu import InteractiveMenu
|
|
54
55
|
|
|
56
|
+
# [ai] 扩展依赖探测结果缓存(失败导入不会被 import 机制负缓存,help 每次渲染
|
|
57
|
+
# 都会读 description,缓存避免重复文件系统扫描;测试可经 monkeypatch 覆盖)
|
|
58
|
+
_AI_DEPS_AVAILABLE: bool | None = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def ai_dependencies_available() -> bool:
|
|
62
|
+
"""探测 AI 功能的可选依赖是否已安装(裸装 precis-cli 不含 [ai] extra)。
|
|
63
|
+
|
|
64
|
+
openai 是核心门控导入(OpenAI 兼容 provider 全系走它);aiohttp/psutil
|
|
65
|
+
随同一 extra 安装,openai 可导入即视为 extra 已装。
|
|
66
|
+
"""
|
|
67
|
+
global _AI_DEPS_AVAILABLE # noqa: PLW0603
|
|
68
|
+
if _AI_DEPS_AVAILABLE is None:
|
|
69
|
+
try:
|
|
70
|
+
import openai # noqa: F401
|
|
71
|
+
except ImportError:
|
|
72
|
+
_AI_DEPS_AVAILABLE = False
|
|
73
|
+
else:
|
|
74
|
+
_AI_DEPS_AVAILABLE = True
|
|
75
|
+
return _AI_DEPS_AVAILABLE
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# 依赖缺失时 ai 入口的统一提示(help 标注与 execute 门控共用同一安装指引)
|
|
79
|
+
_AI_INSTALL_HINT = 'pip install "precis-cli[ai]"(源码安装用 pip install -e ".[ai]")'
|
|
80
|
+
|
|
55
81
|
|
|
56
82
|
class AICommand(Command):
|
|
57
83
|
"""AI 助手命令。
|
|
@@ -82,6 +108,10 @@ class AICommand(Command):
|
|
|
82
108
|
|
|
83
109
|
@property
|
|
84
110
|
def description(self) -> str:
|
|
111
|
+
# help 列表动态标注:裸装(无 [ai] extra)不伪装成可用功能,
|
|
112
|
+
# 让用户在进菜单之前就知道差什么、怎么补
|
|
113
|
+
if not ai_dependencies_available():
|
|
114
|
+
return f"AI 助手 - 未安装依赖({_AI_INSTALL_HINT})"
|
|
85
115
|
return "AI 助手 - 使用自然语言修改项目配置"
|
|
86
116
|
|
|
87
117
|
@property
|
|
@@ -139,6 +169,14 @@ class AICommand(Command):
|
|
|
139
169
|
Returns:
|
|
140
170
|
子命令执行结果或 AI 对话结果
|
|
141
171
|
"""
|
|
172
|
+
if not ai_dependencies_available():
|
|
173
|
+
# 门控在菜单/子命令分发之前:缺依赖时不进交互菜单(菜单里每个
|
|
174
|
+
# 选项最终都会失败),直接给安装指引;provider 预配置不受影响
|
|
175
|
+
# (顶层 provider 命令不依赖 LLM 库)
|
|
176
|
+
return CommandResult.error(
|
|
177
|
+
f"AI 功能需要可选依赖,当前未安装。安装命令: {_AI_INSTALL_HINT}\n"
|
|
178
|
+
"如仅需预配置 AI Provider,可先运行 'provider add'(无需依赖)。"
|
|
179
|
+
)
|
|
142
180
|
if not args:
|
|
143
181
|
# 无参数时显示交互式菜单
|
|
144
182
|
return self._show_interactive_menu(context)
|
|
@@ -100,7 +100,7 @@ class AIChatCommand(Command):
|
|
|
100
100
|
# 检查 AI 配置(使用 CLI 配置)
|
|
101
101
|
provider = self._cli_config.get_active_provider()
|
|
102
102
|
if not provider:
|
|
103
|
-
return CommandResult.error("没有可用的 LLM Provider 配置\n请先运行 '
|
|
103
|
+
return CommandResult.error("没有可用的 LLM Provider 配置\n请先运行 'provider add' 命令配置 API Key")
|
|
104
104
|
|
|
105
105
|
# 解析命令行参数(--stream/--no-stream 已随 execute_ai_chat 的死参数一并移除)
|
|
106
106
|
agent_mode = True # 默认启用 Agent 深度模式
|
|
@@ -80,7 +80,7 @@ def execute_ai_chat(
|
|
|
80
80
|
# 获取用于显示的 Provider 配置(脱敏,用于日志或展示)
|
|
81
81
|
provider_config_display = _get_provider_display()
|
|
82
82
|
if not provider_config_display:
|
|
83
|
-
return CommandResult.error("没有可用的 LLM Provider 配置,请先运行 '
|
|
83
|
+
return CommandResult.error("没有可用的 LLM Provider 配置,请先运行 'provider add' 命令配置 AI Provider")
|
|
84
84
|
|
|
85
85
|
# 获取包含完整 API Key 的 Provider 配置(用于实际调用 API)
|
|
86
86
|
provider_config = _get_provider_with_key()
|
|
@@ -87,7 +87,7 @@ class AISwitchCommand(Command):
|
|
|
87
87
|
providers = self._cli_config.list_providers()
|
|
88
88
|
|
|
89
89
|
if not providers:
|
|
90
|
-
return CommandResult.error("没有已配置的 Provider\n请先使用 '
|
|
90
|
+
return CommandResult.error("没有已配置的 Provider\n请先使用 'provider add' 命令进行配置")
|
|
91
91
|
|
|
92
92
|
if not args:
|
|
93
93
|
# 无参数时进入交互式选择(支持方向键)
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
38
|
from rich.console import Console
|
|
39
|
+
from rich.markup import escape as markup_escape
|
|
39
40
|
from rich.table import Table
|
|
40
41
|
|
|
41
42
|
from app.cli.shell.commands.base import Command, CommandResult, ProjectContext
|
|
@@ -82,11 +83,14 @@ class HelpCommand(Command):
|
|
|
82
83
|
for cmd in commands:
|
|
83
84
|
# 聚合命令(如 config/project/ai)在描述后追加子命令提示,
|
|
84
85
|
# 让用户无需先输入命令即可发现 inspect 等子命令的存在。
|
|
86
|
+
# description 是动态文案,须 markup 转义——Table 单元格会解析
|
|
87
|
+
# markup,方括号(如安装指引 precis-cli[ai])不转义会被当标签吞掉;
|
|
88
|
+
# [dim] 包裹是我们自己的有意标记,不参与转义
|
|
85
89
|
subs = cmd.list_subcommands()
|
|
86
90
|
if subs:
|
|
87
|
-
desc = f"{cmd.description} [dim](子命令: {', '.join(subs)})[/dim]"
|
|
91
|
+
desc = f"{markup_escape(cmd.description)} [dim](子命令: {', '.join(subs)})[/dim]"
|
|
88
92
|
else:
|
|
89
|
-
desc = cmd.description
|
|
93
|
+
desc = markup_escape(cmd.description)
|
|
90
94
|
table.add_row(cmd.name, desc)
|
|
91
95
|
|
|
92
96
|
_console.print(table)
|
|
@@ -33,6 +33,7 @@ import sys
|
|
|
33
33
|
from typing import Any
|
|
34
34
|
|
|
35
35
|
from rich.console import Console
|
|
36
|
+
from rich.markup import escape as markup_escape
|
|
36
37
|
from rich.panel import Panel
|
|
37
38
|
from rich.progress import Progress, SpinnerColumn, TaskID, TextColumn
|
|
38
39
|
from rich.table import Table
|
|
@@ -190,19 +191,21 @@ class Formatter:
|
|
|
190
191
|
|
|
191
192
|
@staticmethod
|
|
192
193
|
def print_error(message: str) -> None:
|
|
193
|
-
|
|
194
|
+
# 动态消息必须 markup 转义:消息里的方括号(如安装指引
|
|
195
|
+
# precis-cli[ai]、允许值集合 ['a','b'])否则会被 rich 当样式标签吞掉
|
|
196
|
+
_stderr_console.print(f"[bold red]错误:[/bold red] {markup_escape(message)}")
|
|
194
197
|
|
|
195
198
|
@staticmethod
|
|
196
199
|
def print_warning(message: str) -> None:
|
|
197
|
-
_console.print(f"[yellow]警告:[/yellow] {message}")
|
|
200
|
+
_console.print(f"[yellow]警告:[/yellow] {markup_escape(message)}")
|
|
198
201
|
|
|
199
202
|
@staticmethod
|
|
200
203
|
def print_success(message: str) -> None:
|
|
201
|
-
_console.print(f"[green]{message}[/green]")
|
|
204
|
+
_console.print(f"[green]{markup_escape(message)}[/green]")
|
|
202
205
|
|
|
203
206
|
@staticmethod
|
|
204
207
|
def print_info(message: str) -> None:
|
|
205
|
-
_console.print(f"[cyan]{message}[/cyan]")
|
|
208
|
+
_console.print(f"[cyan]{markup_escape(message)}[/cyan]")
|
|
206
209
|
|
|
207
210
|
@staticmethod
|
|
208
211
|
def print_table(headers: list[str], rows: list[list[Any]]) -> None:
|
|
@@ -89,7 +89,7 @@ class OpenAIProvider(BaseProvider):
|
|
|
89
89
|
def __init__(self, config: AIProvider) -> None:
|
|
90
90
|
super().__init__(config)
|
|
91
91
|
if AsyncOpenAI is None:
|
|
92
|
-
raise ImportError(
|
|
92
|
+
raise ImportError('openai 未安装,请运行 pip install "precis-cli[ai]"')
|
|
93
93
|
self.client = AsyncOpenAI(
|
|
94
94
|
base_url=config.base_url,
|
|
95
95
|
api_key=config.api_key or "",
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: precis-cli
|
|
3
|
+
Version: 0.1.5
|
|
4
|
+
Summary: Precis - 可配置数据校验工具 CLI(校验 CSV/Excel/JSON 数据质量)
|
|
5
|
+
Author: Precis Team
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/AirSaiga/Precis
|
|
8
|
+
Project-URL: Repository, https://github.com/AirSaiga/Precis
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/AirSaiga/Precis/issues
|
|
10
|
+
Project-URL: Discussions, https://github.com/AirSaiga/Precis/discussions
|
|
11
|
+
Keywords: data-quality,data-validation,csv,excel,json,yaml,cli,mcp
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Classifier: Topic :: Software Development :: Testing
|
|
20
|
+
Requires-Python: <3.14,>=3.12
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Requires-Dist: pydantic>=2.12.0
|
|
23
|
+
Requires-Dist: pandas<3.0,>=2.2.0
|
|
24
|
+
Requires-Dist: openpyxl>=3.1.5
|
|
25
|
+
Requires-Dist: xlrd>=2.0.1
|
|
26
|
+
Requires-Dist: SQLAlchemy>=2.0.48
|
|
27
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
28
|
+
Requires-Dist: ruamel.yaml>=0.19.0
|
|
29
|
+
Requires-Dist: rich>=13.0.0
|
|
30
|
+
Requires-Dist: readchar>=4.2.0
|
|
31
|
+
Requires-Dist: cryptography>=44.0.0
|
|
32
|
+
Requires-Dist: simpleeval>=1.0.0
|
|
33
|
+
Requires-Dist: filelock>=3.12.0
|
|
34
|
+
Provides-Extra: api
|
|
35
|
+
Requires-Dist: fastapi!=0.136.3,>=0.135.0; extra == "api"
|
|
36
|
+
Requires-Dist: uvicorn>=0.42.0; extra == "api"
|
|
37
|
+
Requires-Dist: email-validator>=2.3.0; extra == "api"
|
|
38
|
+
Requires-Dist: uritemplate>=4.2.0; extra == "api"
|
|
39
|
+
Requires-Dist: python-multipart>=0.0.26; extra == "api"
|
|
40
|
+
Requires-Dist: cryptography>=44.0.0; extra == "api"
|
|
41
|
+
Provides-Extra: ai
|
|
42
|
+
Requires-Dist: openai>=1.6.0; extra == "ai"
|
|
43
|
+
Requires-Dist: aiohttp>=3.9.0; extra == "ai"
|
|
44
|
+
Requires-Dist: psutil>=5.9.6; extra == "ai"
|
|
45
|
+
Provides-Extra: mcp
|
|
46
|
+
Requires-Dist: mcp<2,>=1.30.0; extra == "mcp"
|
|
47
|
+
Provides-Extra: completion
|
|
48
|
+
Requires-Dist: pyreadline3>=0.1.8; sys_platform == "win32" and extra == "completion"
|
|
49
|
+
Provides-Extra: full
|
|
50
|
+
Requires-Dist: precis-cli[ai,api,completion,mcp]; extra == "full"
|
|
51
|
+
Provides-Extra: dev
|
|
52
|
+
Requires-Dist: precis-cli[ai,api,mcp]; extra == "dev"
|
|
53
|
+
Requires-Dist: debugpy>=1.8.0; extra == "dev"
|
|
54
|
+
Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
55
|
+
Requires-Dist: mypy>=1.10.0; extra == "dev"
|
|
56
|
+
Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
|
|
57
|
+
Requires-Dist: pytest>=9.0.3; extra == "dev"
|
|
58
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
59
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
60
|
+
Requires-Dist: httpx>=0.27.0; extra == "dev"
|
|
61
|
+
Requires-Dist: build>=1.0.0; extra == "dev"
|
|
62
|
+
Requires-Dist: twine>=5.0.0; extra == "dev"
|
|
63
|
+
|
|
64
|
+
# Precis CLI
|
|
65
|
+
|
|
66
|
+
> Local-first data validation engine — define schemas and constraints in YAML, validate CSV / Excel / JSON with a single command.
|
|
67
|
+
> 本地优先的数据校验引擎:用 YAML 定义表结构与约束规则,一条命令校验 CSV / Excel / JSON。
|
|
68
|
+
|
|
69
|
+
**Alpha** — 核心功能稳定,配置格式有版本保障(V2)。
|
|
70
|
+
|
|
71
|
+
## 安装
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install precis-cli # 需要 Python >= 3.12
|
|
75
|
+
|
|
76
|
+
# 或免安装直接运行(需要 uv)
|
|
77
|
+
uvx --from precis-cli precis --version
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 快速上手
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# 1. 从数据文件推断 schema 草稿
|
|
84
|
+
precis infer-schema orders.csv > schemas/orders.schema.yaml
|
|
85
|
+
|
|
86
|
+
# 2. 在项目清单 project.precis.yaml 中登记 schema 与约束文件
|
|
87
|
+
# (格式见下方示例)
|
|
88
|
+
|
|
89
|
+
# 3. 执行校验
|
|
90
|
+
precis validate --manifest project.precis.yaml --format json
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
退出码契约(CI / AI agent 友好):
|
|
94
|
+
|
|
95
|
+
| 退出码 | 含义 |
|
|
96
|
+
|--------|------|
|
|
97
|
+
| `0` | 校验通过 |
|
|
98
|
+
| `1` | 校验完成,发现数据违规(详情见 JSON 输出的 `errors`) |
|
|
99
|
+
| `2` | 工具自身错误(参数错误、文件不存在、异常崩溃) |
|
|
100
|
+
|
|
101
|
+
## 配置示例(V2 YAML)
|
|
102
|
+
|
|
103
|
+
`project.precis.yaml`:
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
version: 2
|
|
107
|
+
project:
|
|
108
|
+
id: my-project
|
|
109
|
+
name: 订单数据校验
|
|
110
|
+
schemas:
|
|
111
|
+
- id: orders
|
|
112
|
+
path: schemas/orders.schema.yaml
|
|
113
|
+
constraints:
|
|
114
|
+
- id: orders_amount_range
|
|
115
|
+
path: constraints/orders_amount_range.constraint.yaml
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`constraints/orders_amount_range.constraint.yaml`:
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
version: 2
|
|
122
|
+
id: orders_amount_range
|
|
123
|
+
type: Range
|
|
124
|
+
enabled: true
|
|
125
|
+
refs:
|
|
126
|
+
table_id: orders
|
|
127
|
+
column_id: amount
|
|
128
|
+
params:
|
|
129
|
+
min: 0
|
|
130
|
+
max: 1000000
|
|
131
|
+
boundary_mode: inclusive
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 10 种约束类型
|
|
135
|
+
|
|
136
|
+
`NotNull` 非空 · `Unique` 唯一 · `AllowedValues` 枚举 · `Range` 数值区间 ·
|
|
137
|
+
`ForeignKey` 跨表引用 · `Conditional` 条件约束 · `Scripted` 脚本表达式 ·
|
|
138
|
+
`Charset` 字符集 · `DateLogic` 日期逻辑 · `Composite` 组合约束
|
|
139
|
+
|
|
140
|
+
数据类型:`string` / `integer` / `float` / `decimal` / `boolean` / `date`。
|
|
141
|
+
大文件(>500MB)自动分块加载。
|
|
142
|
+
|
|
143
|
+
## 与 AI Agent 集成
|
|
144
|
+
|
|
145
|
+
`--format json` 输出为机器可读契约(含行级错误定位与约束来源文件回溯),
|
|
146
|
+
可直接被 AI 编程助手消费:
|
|
147
|
+
|
|
148
|
+
- **MCP server**:`pip install "precis-cli[mcp]"` 后运行 `precis-mcp`(stdio),
|
|
149
|
+
提供 `validate_data` / `infer_schema` / `check_config` / `describe_constraints` 四个工具
|
|
150
|
+
- **Kimi Code 插件**:`/plugins install https://github.com/AirSaiga/Precis`
|
|
151
|
+
- **CLI 自带 AI 命令**(自然语言生成/修改校验配置,独立于宿主 agent):
|
|
152
|
+
`pip install "precis-cli[ai]"`,然后 `precis ai chat` 或 `precis ai ask "..."`
|
|
153
|
+
|
|
154
|
+
## 链接
|
|
155
|
+
|
|
156
|
+
- 仓库与文档:<https://github.com/AirSaiga/Precis>
|
|
157
|
+
- 问题反馈:<https://github.com/AirSaiga/Precis/issues>
|
|
158
|
+
- 桌面 GUI 版本(画布式可视化编辑)见仓库 releases
|
|
159
|
+
|
|
160
|
+
License: Apache-2.0
|
|
@@ -6,9 +6,12 @@ build-backend = "setuptools.build_meta"
|
|
|
6
6
|
# 分发名 precis-cli:PyPI 上 "precis" 已被 2014 年的第三方包占用;
|
|
7
7
|
# 命令名保持 `precis`(见 [project.scripts]),仅分发名带 -cli 后缀
|
|
8
8
|
name = "precis-cli"
|
|
9
|
-
version = "0.1.
|
|
9
|
+
version = "0.1.5"
|
|
10
10
|
description = "Precis - 可配置数据校验工具 CLI(校验 CSV/Excel/JSON 数据质量)"
|
|
11
|
-
|
|
11
|
+
# PyPI 页面描述使用面向用户的专用 README(安装 + 快速上手);
|
|
12
|
+
# backend/README.md 保持开发者向(架构与开发命令),两者分开维护
|
|
13
|
+
readme = "PYPI_README.md"
|
|
14
|
+
keywords = ["data-quality", "data-validation", "csv", "excel", "json", "yaml", "cli", "mcp"]
|
|
12
15
|
license = {text = "Apache-2.0"}
|
|
13
16
|
requires-python = ">=3.12,<3.14"
|
|
14
17
|
authors = [
|