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.
Files changed (453) hide show
  1. precis_cli-0.1.5/PKG-INFO +160 -0
  2. precis_cli-0.1.5/PYPI_README.md +97 -0
  3. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/__init__.py +39 -1
  4. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/chat.py +1 -1
  5. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/executor.py +1 -1
  6. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/switch.py +1 -1
  7. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/help.py +6 -2
  8. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/formatter.py +7 -4
  9. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/openai.py +1 -1
  10. precis_cli-0.1.5/precis_cli.egg-info/PKG-INFO +160 -0
  11. {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/SOURCES.txt +1 -0
  12. {precis_cli-0.1.4 → precis_cli-0.1.5}/pyproject.toml +5 -2
  13. precis_cli-0.1.4/PKG-INFO +0 -180
  14. precis_cli-0.1.4/precis_cli.egg-info/PKG-INFO +0 -180
  15. {precis_cli-0.1.4 → precis_cli-0.1.5}/MANIFEST.in +0 -0
  16. {precis_cli-0.1.4 → precis_cli-0.1.5}/README.md +0 -0
  17. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/__init__.py +0 -0
  18. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/__init__.py +0 -0
  19. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/dependencies.py +0 -0
  20. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/main.py +0 -0
  21. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/__init__.py +0 -0
  22. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/exception_handler.py +0 -0
  23. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/request_logging.py +0 -0
  24. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/middleware/token_auth.py +0 -0
  25. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/__init__.py +0 -0
  26. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/connection_rules.py +0 -0
  27. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/files.py +0 -0
  28. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/full_validation.py +0 -0
  29. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/project.py +0 -0
  30. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/projects.py +0 -0
  31. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/schema.py +0 -0
  32. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/v2_responses.py +0 -0
  33. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/validation.py +0 -0
  34. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/models/workspace.py +0 -0
  35. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/__init__.py +0 -0
  36. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/__init__.py +0 -0
  37. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/chat.py +0 -0
  38. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/generate.py +0 -0
  39. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/hardware.py +0 -0
  40. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/jobs.py +0 -0
  41. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/migrate.py +0 -0
  42. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/models.py +0 -0
  43. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/ollama.py +0 -0
  44. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/providers.py +0 -0
  45. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/router.py +0 -0
  46. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/stream.py +0 -0
  47. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/ai/utils.py +0 -0
  48. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/__init__.py +0 -0
  49. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/connection_rules.py +0 -0
  50. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/data_sources.py +0 -0
  51. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/regex.py +0 -0
  52. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/core/reporting.py +0 -0
  53. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/files/__init__.py +0 -0
  54. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/files/ops.py +0 -0
  55. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/files/transfer.py +0 -0
  56. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/__init__.py +0 -0
  57. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/content_mode.py +0 -0
  58. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/header_row.py +0 -0
  59. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/models.py +0 -0
  60. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/path_mode.py +0 -0
  61. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/preview/router.py +0 -0
  62. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/__init__.py +0 -0
  63. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/base.py +0 -0
  64. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/constraint.py +0 -0
  65. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/full_config.py +0 -0
  66. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/full_config_writer.py +0 -0
  67. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/helpers.py +0 -0
  68. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/inspection_fix.py +0 -0
  69. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/manifest.py +0 -0
  70. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/models.py +0 -0
  71. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/pattern.py +0 -0
  72. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/regex.py +0 -0
  73. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/scanner.py +0 -0
  74. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/schema.py +0 -0
  75. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/schema_helpers.py +0 -0
  76. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/settings.py +0 -0
  77. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/template.py +0 -0
  78. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/validation.py +0 -0
  79. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/view.py +0 -0
  80. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/project/workspaces.py +0 -0
  81. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/__init__.py +0 -0
  82. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/create.py +0 -0
  83. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/open.py +0 -0
  84. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/projects/scan.py +0 -0
  85. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/__init__.py +0 -0
  86. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/common.py +0 -0
  87. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/content_mode.py +0 -0
  88. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/history.py +0 -0
  89. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/inline_mode.py +0 -0
  90. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/path_mode.py +0 -0
  91. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/routers/validation/router.py +0 -0
  92. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/services/full_validation_response_builder.py +0 -0
  93. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/services/io_error_messages.py +0 -0
  94. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/api/services/preview_service.py +0 -0
  95. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/__init__.py +0 -0
  96. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/__main__.py +0 -0
  97. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/__init__.py +0 -0
  98. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/config_ops.py +0 -0
  99. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/generation_ops.py +0 -0
  100. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shared_services/project_ops.py +0 -0
  101. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/__init__.py +0 -0
  102. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/__init__.py +0 -0
  103. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/delete.py +0 -0
  104. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/diff.py +0 -0
  105. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/display.py +0 -0
  106. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/executor_utils.py +0 -0
  107. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/generate.py +0 -0
  108. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/interaction.py +0 -0
  109. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/migrate.py +0 -0
  110. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/resolver.py +0 -0
  111. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/status.py +0 -0
  112. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/ai/utils.py +0 -0
  113. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/base.py +0 -0
  114. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/__init__.py +0 -0
  115. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/base.py +0 -0
  116. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/check.py +0 -0
  117. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/edit.py +0 -0
  118. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/get.py +0 -0
  119. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/init.py +0 -0
  120. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/inspect.py +0 -0
  121. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/list.py +0 -0
  122. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/set.py +0 -0
  123. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/config/show.py +0 -0
  124. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/exit.py +0 -0
  125. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/infer_schema.py +0 -0
  126. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/open.py +0 -0
  127. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/project.py +0 -0
  128. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/provider.py +0 -0
  129. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/system.py +0 -0
  130. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/commands/validate.py +0 -0
  131. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/completer.py +0 -0
  132. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/config_storage.py +0 -0
  133. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/exceptions.py +0 -0
  134. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/interactive_menu.py +0 -0
  135. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/main.py +0 -0
  136. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/shell/parser.py +0 -0
  137. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli/start.py +0 -0
  138. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/cli_main.py +0 -0
  139. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/mcp_server.py +0 -0
  140. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/__init__.py +0 -0
  141. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/app_version.py +0 -0
  142. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/config/__init__.py +0 -0
  143. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/config/server.py +0 -0
  144. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/__init__.py +0 -0
  145. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loader.py +0 -0
  146. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/__init__.py +0 -0
  147. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/base.py +0 -0
  148. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/converter.py +0 -0
  149. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/csv_loader.py +0 -0
  150. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/excel_loader.py +0 -0
  151. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/extractor.py +0 -0
  152. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/json_loader.py +0 -0
  153. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/registry.py +0 -0
  154. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/sql_loader.py +0 -0
  155. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/__init__.py +0 -0
  156. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/array_parser.py +0 -0
  157. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/lines_parser.py +0 -0
  158. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/loaders/strategies/object_parser.py +0 -0
  159. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/schema_info.py +0 -0
  160. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/__init__.py +0 -0
  161. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/base.py +0 -0
  162. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/csv_source.py +0 -0
  163. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/excel_source.py +0 -0
  164. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/file_base.py +0 -0
  165. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/json_source.py +0 -0
  166. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/data_source/specs/sql_source.py +0 -0
  167. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/encoding.py +0 -0
  168. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/io/__init__.py +0 -0
  169. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/io/yaml.py +0 -0
  170. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/manifest_schema/__init__.py +0 -0
  171. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/manifest_schema/types.py +0 -0
  172. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/manifest_schema/version.py +0 -0
  173. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/patterns/__init__.py +0 -0
  174. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/patterns/loader.py +0 -0
  175. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/patterns/writer.py +0 -0
  176. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/__init__.py +0 -0
  177. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/__init__.py +0 -0
  178. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/base.py +0 -0
  179. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/composite.py +0 -0
  180. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/conditional.py +0 -0
  181. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/foreign_key.py +0 -0
  182. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/registry.py +0 -0
  183. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/scripted.py +0 -0
  184. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/single_column.py +0 -0
  185. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/builders/unique.py +0 -0
  186. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/factory.py +0 -0
  187. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/reader.py +0 -0
  188. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/registry.py +0 -0
  189. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types/__init__.py +0 -0
  190. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types/constraint_file.py +0 -0
  191. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types/refs.py +0 -0
  192. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/types.py +0 -0
  193. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/constraint/writer.py +0 -0
  194. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/__init__.py +0 -0
  195. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader.py +0 -0
  196. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/config_inspector.py +0 -0
  197. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/embedded_constraints.py +0 -0
  198. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/file_loaders.py +0 -0
  199. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspection_ids.py +0 -0
  200. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_helpers.py +0 -0
  201. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_id_checks.py +0 -0
  202. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_reference_checks.py +0 -0
  203. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/inspector_uniqueness_checks.py +0 -0
  204. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/loading_error_messages.py +0 -0
  205. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/main.py +0 -0
  206. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/path_validation.py +0 -0
  207. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/loader_parts/runtime.py +0 -0
  208. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/loader/types.py +0 -0
  209. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/coverage.py +0 -0
  210. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/reader.py +0 -0
  211. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types.py +0 -0
  212. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/__init__.py +0 -0
  213. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/constants.py +0 -0
  214. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/data_source.py +0 -0
  215. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/info.py +0 -0
  216. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/manifest.py +0 -0
  217. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/refs.py +0 -0
  218. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings.py +0 -0
  219. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings_file_processing.py +0 -0
  220. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings_script_security.py +0 -0
  221. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/settings_validation.py +0 -0
  222. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/types_parts/template.py +0 -0
  223. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manifest/writer.py +0 -0
  224. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manual_data/__init__.py +0 -0
  225. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/manual_data/types.py +0 -0
  226. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/regex/reader.py +0 -0
  227. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/regex/types.py +0 -0
  228. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/regex/writer.py +0 -0
  229. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/reader.py +0 -0
  230. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types.py +0 -0
  231. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/__init__.py +0 -0
  232. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/column.py +0 -0
  233. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/column_utils.py +0 -0
  234. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/constraint.py +0 -0
  235. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/schema_id.py +0 -0
  236. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/source.py +0 -0
  237. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/source_options.py +0 -0
  238. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/types_parts/table.py +0 -0
  239. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema/writer.py +0 -0
  240. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/schema_ref_check.py +0 -0
  241. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/__init__.py +0 -0
  242. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/expander.py +0 -0
  243. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/reader.py +0 -0
  244. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/template/types.py +0 -0
  245. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/transform/reader.py +0 -0
  246. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/transform/types.py +0 -0
  247. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/project/transform/writer.py +0 -0
  248. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/pydantic_messages.py +0 -0
  249. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/__init__.py +0 -0
  250. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporter.py +0 -0
  251. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/__init__.py +0 -0
  252. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/base.py +0 -0
  253. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/dingtalk_app_reporter.py +0 -0
  254. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/email_reporter.py +0 -0
  255. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/feishu_app_reporter.py +0 -0
  256. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/local_file_reporter.py +0 -0
  257. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/reporter/reporters/wecom_app_reporter.py +0 -0
  258. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/utils/__init__.py +0 -0
  259. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/utils/path_utils.py +0 -0
  260. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/core/utils/regex_extract.py +0 -0
  261. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/__init__.py +0 -0
  262. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/__init__.py +0 -0
  263. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/allowed_values.py +0 -0
  264. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/base.py +0 -0
  265. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/charset.py +0 -0
  266. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/composite.py +0 -0
  267. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/condition_registry.py +0 -0
  268. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/conditional.py +0 -0
  269. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/date_logic.py +0 -0
  270. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/foreign_key.py +0 -0
  271. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/key_normalization.py +0 -0
  272. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/not_null.py +0 -0
  273. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/range.py +0 -0
  274. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/regex.py +0 -0
  275. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/scripted.py +0 -0
  276. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/constraints/unique.py +0 -0
  277. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_engine.py +0 -0
  278. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types.py +0 -0
  279. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/__init__.py +0 -0
  280. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/base.py +0 -0
  281. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/composite.py +0 -0
  282. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/expression.py +0 -0
  283. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/extracted.py +0 -0
  284. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/json_types.py +0 -0
  285. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/scalars.py +0 -0
  286. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/data_types_parts/sequence.py +0 -0
  287. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/dataset_schema.py +0 -0
  288. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/eval_sandbox.py +0 -0
  289. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/expression_system.py +0 -0
  290. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/regex_flags.py +0 -0
  291. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/schema/builder.py +0 -0
  292. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/schema/models.py +0 -0
  293. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/__init__.py +0 -0
  294. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/aggregate.py +0 -0
  295. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/base.py +0 -0
  296. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/cast_type.py +0 -0
  297. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/concat.py +0 -0
  298. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/conditional_assign.py +0 -0
  299. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/date_format.py +0 -0
  300. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/digits.py +0 -0
  301. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/drop_duplicates.py +0 -0
  302. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/fill_na.py +0 -0
  303. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/filter_rows.py +0 -0
  304. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/lookup.py +0 -0
  305. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/lower_case.py +0 -0
  306. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/map_value.py +0 -0
  307. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/math_expr.py +0 -0
  308. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/modulo.py +0 -0
  309. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/regex_extract.py +0 -0
  310. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/registry.py +0 -0
  311. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/replace.py +0 -0
  312. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/sort_rows.py +0 -0
  313. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/string_split.py +0 -0
  314. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/strip.py +0 -0
  315. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/substring.py +0 -0
  316. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/upper_case.py +0 -0
  317. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/transforms/weighted_sum.py +0 -0
  318. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/domain/validation_constraints.py +0 -0
  319. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/__init__.py +0 -0
  320. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/__init__.py +0 -0
  321. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/__init__.py +0 -0
  322. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/__init__.py +0 -0
  323. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/apply_actions.py +0 -0
  324. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/ask_user.py +0 -0
  325. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/read_canvas.py +0 -0
  326. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/read_project.py +0 -0
  327. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/read_table.py +0 -0
  328. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/schemas.py +0 -0
  329. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/chat_tools/validate_table.py +0 -0
  330. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/executor.py +0 -0
  331. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/memory.py +0 -0
  332. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/planner.py +0 -0
  333. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tool_registry.py +0 -0
  334. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/__init__.py +0 -0
  335. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/config_generate.py +0 -0
  336. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/config_refine.py +0 -0
  337. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/config_validate.py +0 -0
  338. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/merge_results.py +0 -0
  339. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/plan_chunks.py +0 -0
  340. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/tools/script_parse.py +0 -0
  341. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/agent/types.py +0 -0
  342. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/chat_agent_runner.py +0 -0
  343. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/chat_orchestrator.py +0 -0
  344. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/failure_messages.py +0 -0
  345. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/job_storage.py +0 -0
  346. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/migrate_service.py +0 -0
  347. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/__init__.py +0 -0
  348. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/event_journal.py +0 -0
  349. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/orchestrator.py +0 -0
  350. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/pending_interaction_store.py +0 -0
  351. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/sse_response.py +0 -0
  352. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/streaming/types.py +0 -0
  353. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/types.py +0 -0
  354. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/ai/utils.py +0 -0
  355. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/diff/config_diff.py +0 -0
  356. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/hardware.py +0 -0
  357. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/__init__.py +0 -0
  358. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/__init__.py +0 -0
  359. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_canvas_validator.py +0 -0
  360. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_constraint_validator.py +0 -0
  361. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_regex_validator.py +0 -0
  362. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_schema_validator.py +0 -0
  363. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_settings_validator.py +0 -0
  364. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/_transform_validator.py +0 -0
  365. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_handlers.py +0 -0
  366. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_parser.py +0 -0
  367. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_processor.py +0 -0
  368. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/action_validator.py +0 -0
  369. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/diff_compute.py +0 -0
  370. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/regex_handlers.py +0 -0
  371. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/registry.py +0 -0
  372. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/schema_handlers.py +0 -0
  373. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/settings_handlers.py +0 -0
  374. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/specs.py +0 -0
  375. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/transform_handlers.py +0 -0
  376. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/actions/validation_types.py +0 -0
  377. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/cache/__init__.py +0 -0
  378. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/cache/response_cache.py +0 -0
  379. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/chat/__init__.py +0 -0
  380. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/chat/chat_system_prompt.py +0 -0
  381. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/chat/response_parser.py +0 -0
  382. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/__init__.py +0 -0
  383. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/crypto.py +0 -0
  384. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/loader.py +0 -0
  385. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/models.py +0 -0
  386. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config/presets.py +0 -0
  387. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/config_generator.py +0 -0
  388. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/__init__.py +0 -0
  389. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/constraint_builder.py +0 -0
  390. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/constraint_deletion.py +0 -0
  391. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/constraint_id.py +0 -0
  392. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/frontend_instructions.py +0 -0
  393. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/constraints/inline_batch.py +0 -0
  394. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/discovery/__init__.py +0 -0
  395. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/discovery/scanner.py +0 -0
  396. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/__init__.py +0 -0
  397. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/agent_wiring.py +0 -0
  398. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/config_builder.py +0 -0
  399. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/errors.py +0 -0
  400. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/existing_config.py +0 -0
  401. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/profiler.py +0 -0
  402. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/prompt_builder.py +0 -0
  403. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/response_parser.py +0 -0
  404. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/generation/service.py +0 -0
  405. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/models.py +0 -0
  406. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/__init__.py +0 -0
  407. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/base.py +0 -0
  408. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/cached_provider.py +0 -0
  409. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/ollama.py +0 -0
  410. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/providers/registry.py +0 -0
  411. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/schema_resolver.py +0 -0
  412. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/suggestion_utils.py +0 -0
  413. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/validate_executor.py +0 -0
  414. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/llm/yaml_io.py +0 -0
  415. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/preview/__init__.py +0 -0
  416. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/preview/loader.py +0 -0
  417. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/preview/path_validation.py +0 -0
  418. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/project_loader.py +0 -0
  419. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/schema_inference.py +0 -0
  420. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/schema_runtime_builder.py +0 -0
  421. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/__init__.py +0 -0
  422. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/chunked_loader.py +0 -0
  423. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/__init__.py +0 -0
  424. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/builder.py +0 -0
  425. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/executor.py +0 -0
  426. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/dag/sorter.py +0 -0
  427. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/data_loader.py +0 -0
  428. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/engine.py +0 -0
  429. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/executor.py +0 -0
  430. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/extractors.py +0 -0
  431. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/history.py +0 -0
  432. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/json_payload.py +0 -0
  433. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/loader.py +0 -0
  434. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/memory_monitor.py +0 -0
  435. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/postprocess.py +0 -0
  436. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/progress.py +0 -0
  437. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/report_export.py +0 -0
  438. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/resolver.py +0 -0
  439. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/service.py +0 -0
  440. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/types.py +0 -0
  441. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/__init__.py +0 -0
  442. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/adapter.py +0 -0
  443. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/base.py +0 -0
  444. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/composite.py +0 -0
  445. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/shared/services/validation/validators/date_logic.py +0 -0
  446. {precis_cli-0.1.4 → precis_cli-0.1.5}/app/start_server.py +0 -0
  447. {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/dependency_links.txt +0 -0
  448. {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/entry_points.txt +0 -0
  449. {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/requires.txt +0 -0
  450. {precis_cli-0.1.4 → precis_cli-0.1.5}/precis_cli.egg-info/top_level.txt +0 -0
  451. {precis_cli-0.1.4 → precis_cli-0.1.5}/setup.cfg +0 -0
  452. {precis_cli-0.1.4 → precis_cli-0.1.5}/tests/test_local_file_reporter.py +0 -0
  453. {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、setup 等子命令
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请先运行 'setup' 命令配置 API Key")
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 配置,请先运行 'setup' 命令配置 AI 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请先使用 'setup' 命令进行配置")
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
- _stderr_console.print(f"[bold red]错误:[/bold red] {message}")
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("openai 未安装,请运行 pip install openai")
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
@@ -1,4 +1,5 @@
1
1
  MANIFEST.in
2
+ PYPI_README.md
2
3
  README.md
3
4
  pyproject.toml
4
5
  app/__init__.py
@@ -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.4"
9
+ version = "0.1.5"
10
10
  description = "Precis - 可配置数据校验工具 CLI(校验 CSV/Excel/JSON 数据质量)"
11
- readme = "README.md"
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 = [