powerquant-cli 0.2.7__tar.gz → 0.2.8__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 (434) hide show
  1. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/PKG-INFO +15 -2
  2. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/README.md +13 -1
  3. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/client.py +19 -1
  4. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/exceptions.py +6 -2
  5. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/pyproject.toml +2 -2
  6. powerquant_cli-0.2.8/src/quant_cli/app/agent_resource/cli/resource_cli.py +31 -0
  7. powerquant_cli-0.2.8/src/quant_cli/app/agent_resource/service/resource_service.py +77 -0
  8. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/cli/local_backtest_cli.py +17 -13
  9. powerquant_cli-0.2.8/src/quant_cli/app/backtest/service/backtest_application_service.py +29 -0
  10. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/config/config_cli.py +7 -5
  11. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/cli/data_cli.py +8 -6
  12. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/data_dependency.py +1 -4
  13. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/factor_definition_cli.py +6 -4
  14. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/local_factor_cli.py +18 -13
  15. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/local_selection_cli.py +10 -19
  16. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/local_factor_dependency.py +1 -1
  17. powerquant_cli-0.2.8/src/quant_cli/app/factor/service/factor_application_service.py +41 -0
  18. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/cli/local_job_cli.py +9 -9
  19. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/quant_cli.py +25 -3
  20. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/cli/local_research_cli.py +20 -17
  21. powerquant_cli-0.2.8/src/quant_cli/app/research/service/research_application_service.py +34 -0
  22. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/strategy/cli/strategy_cli.py +11 -10
  23. powerquant_cli-0.2.8/src/quant_cli/application_container.py +39 -0
  24. powerquant_cli-0.2.8/src/quant_cli/application_settings.py +11 -0
  25. powerquant_cli-0.2.8/src/quant_cli/common/command_error_handler.py +43 -0
  26. powerquant_cli-0.2.8/src/quant_cli/common/command_help.py +45 -0
  27. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/http/definition_client.py +27 -1
  28. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/cli_utils.py +24 -4
  29. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/config/connection_config.py +6 -7
  30. powerquant_cli-0.2.8/src/quant_cli/resources/prompts/research.md +3 -0
  31. powerquant_cli-0.2.8/src/quant_cli/resources/skills/pq-connection/SKILL.md +8 -0
  32. powerquant_cli-0.2.8/src/quant_cli/resources/skills/pq-data-operations/SKILL.md +8 -0
  33. powerquant_cli-0.2.8/src/quant_cli/resources/skills/pq-research/SKILL.md +8 -0
  34. powerquant_cli-0.2.8/tests/unit/test_agent_json.py +71 -0
  35. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_connection_config.py +12 -0
  36. powerquant_cli-0.2.8/tests/unit/test_definition_errors.py +59 -0
  37. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/uv.lock +49 -1
  38. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/.env.example +0 -0
  39. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/.gitignore +0 -0
  40. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/LICENSE +0 -0
  41. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/__init__.py +0 -0
  42. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/download.py +0 -0
  43. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/__init__.py +0 -0
  44. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/adjustment_schema.py +0 -0
  45. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/bar_content_schema.py +0 -0
  46. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/bar_schema.py +0 -0
  47. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/corporate_action_schema.py +0 -0
  48. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/history_schema.py +0 -0
  49. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/pit_daily_window.py +0 -0
  50. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/query_schema.py +0 -0
  51. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/quote_schema.py +0 -0
  52. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/reference_schema.py +0 -0
  53. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/pqdata/schema/reliability_schema.py +0 -0
  54. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/__init__.py +0 -0
  55. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/SPEC.md +0 -0
  56. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/__init__.py +0 -0
  57. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/SPEC.md +0 -0
  58. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/__init__.py +0 -0
  59. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/backtest_input_schema.py +0 -0
  60. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/backtest_run.py +0 -0
  61. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/data_guard.py +0 -0
  62. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/historical_clock.py +0 -0
  63. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/legacy_result_schema.py +0 -0
  64. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/metrics.py +0 -0
  65. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/performance_report.py +0 -0
  66. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/report_schema.py +0 -0
  67. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/schema.py +0 -0
  68. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/service/__init__.py +0 -0
  69. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/backtest/service/backtest_execution_service.py +0 -0
  70. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/__init__.py +0 -0
  71. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/constants.py +0 -0
  72. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/domain/__init__.py +0 -0
  73. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/domain/trading_quantity_value.py +0 -0
  74. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/exceptions.py +0 -0
  75. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/__init__.py +0 -0
  76. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/adjustment_factor_query.py +0 -0
  77. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_data_query.py +0 -0
  78. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_data_verification.py +0 -0
  79. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_event_source.py +0 -0
  80. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_revision_query.py +0 -0
  81. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_runtime_repository.py +0 -0
  82. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/interface/market_time_slice_source.py +0 -0
  83. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/repository/__init__.py +0 -0
  84. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/__init__.py +0 -0
  85. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/adjustment_schema.py +0 -0
  86. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/corporate_action_schema.py +0 -0
  87. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/event_schema.py +0 -0
  88. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/exchange_operating_state.py +0 -0
  89. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/exchange_state_schema.py +0 -0
  90. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/history_schema.py +0 -0
  91. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/instrument_identity.py +0 -0
  92. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/market_schema.py +0 -0
  93. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/pit_daily_window.py +0 -0
  94. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/quote_schema.py +0 -0
  95. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/reliability_schema.py +0 -0
  96. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/snapshot_schema.py +0 -0
  97. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/schema/trading_state_schema.py +0 -0
  98. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/__init__.py +0 -0
  99. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/calendar_coverage_service.py +0 -0
  100. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/prepared_data_verification_service.py +0 -0
  101. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/prepared_market_service.py +0 -0
  102. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/data/service/price_adjustment_service.py +0 -0
  103. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/LICENSE.vnpy +0 -0
  104. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/__init__.py +0 -0
  105. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/__init__.py +0 -0
  106. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/alpha101_recipe.py +0 -0
  107. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/alpha158_recipe.py +0 -0
  108. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/builtin/factor_recipe_catalog.py +0 -0
  109. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/__init__.py +0 -0
  110. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/factor_batch_evaluator.py +0 -0
  111. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/factor_expression.py +0 -0
  112. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/factor_source_loader.py +0 -0
  113. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/__init__.py +0 -0
  114. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/arithmetic_operator.py +0 -0
  115. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/cross_section_operator.py +0 -0
  116. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/operators/time_series_operator.py +0 -0
  117. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/panel_evaluator.py +0 -0
  118. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/panel_expression.py +0 -0
  119. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/python_factor_executor.py +0 -0
  120. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/computation/universe_filter.py +0 -0
  121. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/constants.py +0 -0
  122. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/exceptions.py +0 -0
  123. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/factor_dependency.py +0 -0
  124. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/__init__.py +0 -0
  125. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_compute.py +0 -0
  126. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_execution.py +0 -0
  127. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_local_data.py +0 -0
  128. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_panel_compute.py +0 -0
  129. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_panel_input.py +0 -0
  130. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/factor_query_store.py +0 -0
  131. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/__init__.py +0 -0
  132. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_diagnostics.py +0 -0
  133. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_exposure_query.py +0 -0
  134. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_local.py +0 -0
  135. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_query.py +0 -0
  136. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/interface/public/factor_selection.py +0 -0
  137. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/model/__init__.py +0 -0
  138. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/repository/__init__.py +0 -0
  139. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/__init__.py +0 -0
  140. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/diagnostic_types.py +0 -0
  141. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_artifact_schema.py +0 -0
  142. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_computation_schema.py +0 -0
  143. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_compute_request.py +0 -0
  144. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_contract.py +0 -0
  145. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_input_schema.py +0 -0
  146. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_panel.py +0 -0
  147. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_publication_schema.py +0 -0
  148. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_query_result_schema.py +0 -0
  149. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/factor_result_schema.py +0 -0
  150. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/local_factor_schema.py +0 -0
  151. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/panel_policy.py +0 -0
  152. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/selection_report.py +0 -0
  153. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/schema/selection_types.py +0 -0
  154. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/__init__.py +0 -0
  155. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_compute_service.py +0 -0
  156. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_diagnostic_runner.py +0 -0
  157. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_diagnostics_service.py +0 -0
  158. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_exposure_service.py +0 -0
  159. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_input_service.py +0 -0
  160. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_local_execution_service.py +0 -0
  161. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_panel_service.py +0 -0
  162. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_runtime_service.py +0 -0
  163. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/factor_selection_runner.py +0 -0
  164. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/published_factor_execution_service.py +0 -0
  165. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/service/selection_service.py +0 -0
  166. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/factor/visibility.py +0 -0
  167. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/opportunity/SPEC.md +0 -0
  168. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/opportunity/__init__.py +0 -0
  169. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/SPEC.md +0 -0
  170. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/__init__.py +0 -0
  171. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/bar_matcher.py +0 -0
  172. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/constants.py +0 -0
  173. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/__init__.py +0 -0
  174. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/execution_batch.py +0 -0
  175. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_entity.py +0 -0
  176. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_event.py +0 -0
  177. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_policy.py +0 -0
  178. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/domain/order_value.py +0 -0
  179. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/fee_model.py +0 -0
  180. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/__init__.py +0 -0
  181. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/order_account.py +0 -0
  182. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/order_trading_rules.py +0 -0
  183. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/__init__.py +0 -0
  184. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/execution_account.py +0 -0
  185. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_events.py +0 -0
  186. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_execution.py +0 -0
  187. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_runtime.py +0 -0
  188. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/interface/public/order_submission.py +0 -0
  189. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/order_event_bus.py +0 -0
  190. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/order_execution_dependency.py +0 -0
  191. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/order_submission_service.py +0 -0
  192. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/schema/__init__.py +0 -0
  193. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/schema/order_request_schema.py +0 -0
  194. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/simulation_broker.py +0 -0
  195. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/slippage_model.py +0 -0
  196. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/tradability_policy.py +0 -0
  197. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/order_execution/validators.py +0 -0
  198. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/SPEC.md +0 -0
  199. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/__init__.py +0 -0
  200. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/__init__.py +0 -0
  201. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/entitlement_entity.py +0 -0
  202. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/portfolio_entity.py +0 -0
  203. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/portfolio_event.py +0 -0
  204. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/portfolio_value.py +0 -0
  205. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/position_entity.py +0 -0
  206. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/domain/reservation_entity.py +0 -0
  207. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/__init__.py +0 -0
  208. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/public/__init__.py +0 -0
  209. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/public/portfolio.py +0 -0
  210. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/interface/public/simulation_account.py +0 -0
  211. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/ledger_schema.py +0 -0
  212. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/order_account_listener.py +0 -0
  213. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/portfolio_dependency.py +0 -0
  214. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/portfolio_schema.py +0 -0
  215. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/portfolio/simulated_portfolio.py +0 -0
  216. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/SPEC.md +0 -0
  217. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/__init__.py +0 -0
  218. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/adapter/__init__.py +0 -0
  219. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/adapter/market_label_query.py +0 -0
  220. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/interface/__init__.py +0 -0
  221. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/interface/research_dataset.py +0 -0
  222. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/interface/research_evaluation.py +0 -0
  223. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/__init__.py +0 -0
  224. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/comparison_schema.py +0 -0
  225. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/dataset_schema.py +0 -0
  226. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/schema/research_schema.py +0 -0
  227. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/__init__.py +0 -0
  228. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/research_dataset_service.py +0 -0
  229. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/research_evaluation_service.py +0 -0
  230. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/research/service/research_service.py +0 -0
  231. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/SPEC.md +0 -0
  232. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/__init__.py +0 -0
  233. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/constants.py +0 -0
  234. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/exceptions.py +0 -0
  235. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/__init__.py +0 -0
  236. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/__init__.py +0 -0
  237. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/portfolio_construction.py +0 -0
  238. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/strategy.py +0 -0
  239. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/strategy_market_query.py +0 -0
  240. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/public/strategy_portfolio_reader.py +0 -0
  241. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/strategy_factor_reader.py +0 -0
  242. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/interface/strategy_order_reader.py +0 -0
  243. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/__init__.py +0 -0
  244. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/portfolio_schema.py +0 -0
  245. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/portfolio_target.py +0 -0
  246. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/python_strategy_schema.py +0 -0
  247. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/screener_schema.py +0 -0
  248. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/signal_schema.py +0 -0
  249. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/strategy_publication_schema.py +0 -0
  250. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/schema/strategy_schema.py +0 -0
  251. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/__init__.py +0 -0
  252. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/factor_top_n_strategy.py +0 -0
  253. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/portfolio_construction_service.py +0 -0
  254. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/python_strategy_service.py +0 -0
  255. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/screener_service.py +0 -0
  256. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/store_factor_reader.py +0 -0
  257. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/strategy_market_view.py +0 -0
  258. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/strategy_runtime_service.py +0 -0
  259. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/service/strategy_scheduler.py +0 -0
  260. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategies/__init__.py +0 -0
  261. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategies/momentum_volume_breakout.py +0 -0
  262. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategy_context.py +0 -0
  263. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/strategy/strategy_dependency.py +0 -0
  264. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/SPEC.md +0 -0
  265. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/__init__.py +0 -0
  266. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/domain/__init__.py +0 -0
  267. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/__init__.py +0 -0
  268. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/daily_state_expand.py +0 -0
  269. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/exchange_state_resolver.py +0 -0
  270. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/market_runtime_service.py +0 -0
  271. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/replay/market_state_resolver.py +0 -0
  272. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/runtime_ports.py +0 -0
  273. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/runtime_schema.py +0 -0
  274. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/runtime_session.py +0 -0
  275. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/strategy_portfolio_adapter.py +0 -0
  276. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/trading_rule_book.py +0 -0
  277. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/app/trading_runtime/trading_rule_query.py +0 -0
  278. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/__init__.py +0 -0
  279. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/exceptions/__init__.py +0 -0
  280. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/exceptions/base.py +0 -0
  281. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/bundled/quant_core/common/local_run.py +0 -0
  282. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/cached_factor_screen.py +0 -0
  283. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/ma_close_10.py +0 -0
  284. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/max_drawdown_20d.py +0 -0
  285. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/momentum_20d.py +0 -0
  286. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/multi_intraday_screen.py +0 -0
  287. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/risk_adjusted_momentum_20d.py +0 -0
  288. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/volume_ratio_5d.py +0 -0
  289. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/factors/volume_weighted_close_pressure.py +0 -0
  290. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/full_market_screen.py +0 -0
  291. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/local_quant_validation.py +0 -0
  292. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/published_definition_validation.py +0 -0
  293. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/research/factor_pit_coverage.py +0 -0
  294. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/research/ipo_first_day.py +0 -0
  295. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/README.md +0 -0
  296. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/backtest.json +0 -0
  297. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/buy_hold.py +0 -0
  298. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/compute.json +0 -0
  299. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/prepare.json +0 -0
  300. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/selection/select.json +0 -0
  301. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/bar_roundtrip.py +0 -0
  302. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/buy_and_hold.py +0 -0
  303. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/contrarian_timing.py +0 -0
  304. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/factor_gate_vwap.py +0 -0
  305. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/ipo_next_day_vwap.py +0 -0
  306. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/momentum_timing.py +0 -0
  307. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/monthly_equal_weight.py +0 -0
  308. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/session_roundtrip.py +0 -0
  309. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/trend_drawdown_guard.py +0 -0
  310. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/strategies/weekly_risk_adjusted_rotation.py +0 -0
  311. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/examples/unified_snapshot_validation.py +0 -0
  312. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/hatch_build.py +0 -0
  313. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/licenses/LICENSE.vnpy +0 -0
  314. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/__init__.py +0 -0
  315. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/api.py +0 -0
  316. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/__init__.py +0 -0
  317. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/__init__.py +0 -0
  318. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/cli/__init__.py +0 -0
  319. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/local_backtest_dependency.py +0 -0
  320. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/local_backtest_schema.py +0 -0
  321. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/repository/__init__.py +0 -0
  322. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/repository/backtest_local_repository.py +0 -0
  323. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/service/__init__.py +0 -0
  324. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/backtest/service/local_backtest_service.py +0 -0
  325. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/config/__init__.py +0 -0
  326. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/__init__.py +0 -0
  327. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/cli/__init__.py +0 -0
  328. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/repository/__init__.py +0 -0
  329. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/repository/parquet_repository.py +0 -0
  330. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/__init__.py +0 -0
  331. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/dataset_audit_schema.py +0 -0
  332. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/dataset_request_schema.py +0 -0
  333. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/schema/parquet_file_schema.py +0 -0
  334. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/__init__.py +0 -0
  335. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/bar_cache_service.py +0 -0
  336. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/dataset_audit_service.py +0 -0
  337. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/dataset_load_service.py +0 -0
  338. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/data/service/dataset_prepare_service.py +0 -0
  339. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/__init__.py +0 -0
  340. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/cli/__init__.py +0 -0
  341. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/interface/__init__.py +0 -0
  342. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/interface/local_selection_store.py +0 -0
  343. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/repository/__init__.py +0 -0
  344. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/repository/factor_local_repository.py +0 -0
  345. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/repository/selection_local_repository.py +0 -0
  346. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/schema/local_selection_schema.py +0 -0
  347. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/__init__.py +0 -0
  348. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/factor_data_prepare_service.py +0 -0
  349. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/local_factor_query_service.py +0 -0
  350. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/local_factor_service.py +0 -0
  351. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/factor/service/local_selection_service.py +0 -0
  352. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/__init__.py +0 -0
  353. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/cli/__init__.py +0 -0
  354. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/schema/__init__.py +0 -0
  355. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/schema/local_job_schema.py +0 -0
  356. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/service/__init__.py +0 -0
  357. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/job/service/local_job_service.py +0 -0
  358. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/__init__.py +0 -0
  359. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/cli/__init__.py +0 -0
  360. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/local_research_dependency.py +0 -0
  361. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/repository/__init__.py +0 -0
  362. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/repository/research_local_repository.py +0 -0
  363. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/schema/__init__.py +0 -0
  364. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/schema/local_research_schema.py +0 -0
  365. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/service/__init__.py +0 -0
  366. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/service/local_research_execution_service.py +0 -0
  367. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/research/service/local_research_service.py +0 -0
  368. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/strategy/__init__.py +0 -0
  369. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/app/strategy/cli/__init__.py +0 -0
  370. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/__init__.py +0 -0
  371. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/constants.py +0 -0
  372. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/database/__init__.py +0 -0
  373. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/database/duckdb_connection.py +0 -0
  374. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/http/__init__.py +0 -0
  375. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/__init__.py +0 -0
  376. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/platform_utils.py +0 -0
  377. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/common/utils/runtime_environment.py +0 -0
  378. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/src/quant_cli/config/__init__.py +0 -0
  379. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/__init__.py +0 -0
  380. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/conftest.py +0 -0
  381. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/factor_fixtures.py +0 -0
  382. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/integration/__init__.py +0 -0
  383. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/integration/test_local_quant_storage.py +0 -0
  384. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/integration/test_local_selection.py +0 -0
  385. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/__init__.py +0 -0
  386. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_backtest_reports.py +0 -0
  387. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_identity.py +0 -0
  388. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_market_input.py +0 -0
  389. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_research.py +0 -0
  390. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_alpha_top_n.py +0 -0
  391. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_backtest_run_result.py +0 -0
  392. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_bar_cache.py +0 -0
  393. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_coarse_execution_capability.py +0 -0
  394. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_corporate_action_replay.py +0 -0
  395. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_d1_replay_execution_chain.py +0 -0
  396. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_daily_state_expand.py +0 -0
  397. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_daily_state_snapshot.py +0 -0
  398. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_daily_vwap_execution.py +0 -0
  399. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_data_guard.py +0 -0
  400. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_dataset_audit.py +0 -0
  401. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_domain_dependency_boundaries.py +0 -0
  402. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_domain_interface_boundary.py +0 -0
  403. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_execution.py +0 -0
  404. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_replay.py +0 -0
  405. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_resolver.py +0 -0
  406. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_exchange_state_schema.py +0 -0
  407. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_contract.py +0 -0
  408. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_diagnostic_runner.py +0 -0
  409. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_diagnostics.py +0 -0
  410. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_expression.py +0 -0
  411. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_local_runner.py +0 -0
  412. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_runtime_service.py +0 -0
  413. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_selection.py +0 -0
  414. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_factor_selection_runner.py +0 -0
  415. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_ipo_vwap_study.py +0 -0
  416. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_local_quant_boundary.py +0 -0
  417. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_market_replay.py +0 -0
  418. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_market_trading_state.py +0 -0
  419. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_order_domain.py +0 -0
  420. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_order_submission.py +0 -0
  421. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_portfolio_construction.py +0 -0
  422. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_portfolio_contracts.py +0 -0
  423. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_python_strategy_runtime.py +0 -0
  424. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_replay_state_boundaries.py +0 -0
  425. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_risk_adjusted_strategy_example.py +0 -0
  426. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_simulated_order_execution.py +0 -0
  427. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_simulated_portfolio.py +0 -0
  428. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_store_factor_reader.py +0 -0
  429. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_strategy_adjusted_view.py +0 -0
  430. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_strategy_domain.py +0 -0
  431. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_strategy_lifecycle.py +0 -0
  432. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_tradability_policy.py +0 -0
  433. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_trading_runtime_contracts.py +0 -0
  434. {powerquant_cli-0.2.7 → powerquant_cli-0.2.8}/tests/unit/test_trading_runtime_session.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: powerquant-cli
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Summary: Power Quant local research CLI
5
5
  Project-URL: Repository, https://github.com/Kepler452Byte/power-quant
6
6
  License-Expression: LicenseRef-PowerQuant-Proprietary AND MIT
@@ -14,6 +14,7 @@ Requires-Dist: numpy<3,>=2
14
14
  Requires-Dist: pandas<4,>=3
15
15
  Requires-Dist: polars<2,>=1.36
16
16
  Requires-Dist: pydantic<3,>=2.5
17
+ Requires-Dist: pyyaml<7,>=6
17
18
  Requires-Dist: scipy<2,>=1.17
18
19
  Requires-Dist: typer>=0.27.2
19
20
  Requires-Dist: tzdata>=2026.3
@@ -51,7 +52,7 @@ pq config show
51
52
 
52
53
  家庭 LAN 可配置 `http://192.168.8.142:18026/market/api/v1`;公网 IP 临时入口为 `http://82.157.167.33/market/api/v1`。公网 HTTP 会明文传输 Token,只适合已明确接受风险的临时接入;长期公网访问使用可信 HTTPS 或 SSH/WireGuard 加密链路。直接使用 `https://82.157.167.33` 与现有域名证书不匹配。
53
54
 
54
- 配置保存在当前系统用户的 `~/.powerquant/config.json`,与工作目录无关,不自动加载 `.env`。这是本地明文配置:POSIX 新目录权限 700、文件权限 600;Windows 依赖用户目录 ACL,不声称加密存储。不要提交或分享该文件。
55
+ 配置保存在当前系统用户的 `~/.powerquant/config.yml`,与工作目录无关,不自动加载 `.env`。这是本地明文配置:POSIX 新目录权限 700、文件权限 600;Windows 依赖用户目录 ACL,不声称加密存储。不要提交或分享该文件。
55
56
 
56
57
  每项配置按环境变量 > 用户文件 > 默认值解析。默认地址为 `http://localhost:8002/api/v1`,默认 Token 为空。环境变量只影响当前终端及其启动的子进程,不改文件;显式空 Token 环境变量会覆盖已保存密钥。
57
58
 
@@ -81,6 +82,18 @@ pq data prepare --config prepare.json
81
82
 
82
83
  密钥到期或撤销后在线准备会失败,已下载快照仍可离线使用。行情密钥不用于定义发布;发布定义另使用 PQ_QUANT_URL/PQ_QUANT_TOKEN。默认本地目录为 ~/.powerquant。
83
84
 
85
+ ## Agent 使用
86
+
87
+ 命令结果与帮助统一输出 JSON;错误以单行 JSON 写入 stderr,保留业务错误码、消息和 request_id,并返回非零退出码。
88
+
89
+ ```sh
90
+ pq resource list
91
+ pq resource show skills/pq-connection
92
+ pq resource export --directory pq-agent-resources
93
+ ```
94
+
95
+ Skill 和提示词仅供按需查看、导出,不自动安装;资源模块可独立移除。行情运维通过 PQData API/MCP 提交任务,不通过本地 CLI 或 SSH 操作服务。
96
+
84
97
  ## Python
85
98
 
86
99
  公开请求模型与调用入口位于 quant_cli.api,与 CLI 使用同一应用服务。
@@ -30,7 +30,7 @@ pq config show
30
30
 
31
31
  家庭 LAN 可配置 `http://192.168.8.142:18026/market/api/v1`;公网 IP 临时入口为 `http://82.157.167.33/market/api/v1`。公网 HTTP 会明文传输 Token,只适合已明确接受风险的临时接入;长期公网访问使用可信 HTTPS 或 SSH/WireGuard 加密链路。直接使用 `https://82.157.167.33` 与现有域名证书不匹配。
32
32
 
33
- 配置保存在当前系统用户的 `~/.powerquant/config.json`,与工作目录无关,不自动加载 `.env`。这是本地明文配置:POSIX 新目录权限 700、文件权限 600;Windows 依赖用户目录 ACL,不声称加密存储。不要提交或分享该文件。
33
+ 配置保存在当前系统用户的 `~/.powerquant/config.yml`,与工作目录无关,不自动加载 `.env`。这是本地明文配置:POSIX 新目录权限 700、文件权限 600;Windows 依赖用户目录 ACL,不声称加密存储。不要提交或分享该文件。
34
34
 
35
35
  每项配置按环境变量 > 用户文件 > 默认值解析。默认地址为 `http://localhost:8002/api/v1`,默认 Token 为空。环境变量只影响当前终端及其启动的子进程,不改文件;显式空 Token 环境变量会覆盖已保存密钥。
36
36
 
@@ -60,6 +60,18 @@ pq data prepare --config prepare.json
60
60
 
61
61
  密钥到期或撤销后在线准备会失败,已下载快照仍可离线使用。行情密钥不用于定义发布;发布定义另使用 PQ_QUANT_URL/PQ_QUANT_TOKEN。默认本地目录为 ~/.powerquant。
62
62
 
63
+ ## Agent 使用
64
+
65
+ 命令结果与帮助统一输出 JSON;错误以单行 JSON 写入 stderr,保留业务错误码、消息和 request_id,并返回非零退出码。
66
+
67
+ ```sh
68
+ pq resource list
69
+ pq resource show skills/pq-connection
70
+ pq resource export --directory pq-agent-resources
71
+ ```
72
+
73
+ Skill 和提示词仅供按需查看、导出,不自动安装;资源模块可独立移除。行情运维通过 PQData API/MCP 提交任务,不通过本地 CLI 或 SSH 操作服务。
74
+
63
75
  ## Python
64
76
 
65
77
  公开请求模型与调用入口位于 quant_cli.api,与 CLI 使用同一应用服务。
@@ -101,7 +101,25 @@ class MarketClient:
101
101
  await response.aclose()
102
102
  await asyncio.sleep(delay)
103
103
  if not response.is_success:
104
- raise MarketAPIError(response.status_code, response.headers.get("x-request-id"))
104
+ code: str | int | None = None
105
+ message: str | None = None
106
+ request_id = response.headers.get("x-request-id")
107
+ if "application/json" in response.headers.get("content-type", ""):
108
+ try:
109
+ error = response.json()
110
+ except ValueError:
111
+ error = None
112
+ if isinstance(error, dict):
113
+ candidate = error.get("error_code", error.get("code"))
114
+ if isinstance(candidate, (str, int)) and not isinstance(candidate, bool):
115
+ code = candidate
116
+ candidate = error.get("message")
117
+ if isinstance(candidate, str) and 0 < len(candidate) <= 512:
118
+ message = candidate
119
+ candidate = error.get("request_id")
120
+ if isinstance(candidate, str) and len(candidate) <= 128:
121
+ request_id = request_id or candidate
122
+ raise MarketAPIError(response.status_code, request_id, code=code, message=message)
105
123
  try:
106
124
  return TypeAdapter(response_type).validate_json(response.content)
107
125
  except ValidationError as error:
@@ -4,10 +4,14 @@
4
4
  class MarketAPIError(Exception):
5
5
  """服务拒绝请求;保留状态码和可追踪的请求 ID,不暴露凭据。"""
6
6
 
7
- def __init__(self, status_code: int, request_id: str | None = None) -> None:
7
+ def __init__(self, status_code: int, request_id: str | None = None,
8
+ *, code: str | int | None = None, message: str | None = None) -> None:
8
9
  self.status_code = status_code
9
10
  self.request_id = request_id
10
- super().__init__(f"Market request failed (HTTP {status_code}, request_id={request_id})")
11
+ self.code = code if code is not None else f"HTTP_{status_code}"
12
+ self.message = message or f"行情请求失败(HTTP {status_code})"
13
+ super().__init__(self.message)
14
+
11
15
 
12
16
 
13
17
  class MarketProtocolError(Exception):
@@ -1,12 +1,12 @@
1
1
  [project]
2
2
  name = "powerquant-cli"
3
- version = "0.2.7"
3
+ version = "0.2.8"
4
4
  description = "Power Quant local research CLI"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
7
7
  license = "LicenseRef-PowerQuant-Proprietary AND MIT"
8
8
  license-files = ["LICENSE", "licenses/LICENSE.vnpy"]
9
- dependencies = ["pydantic>=2.5,<3", "polars>=1.36,<2", "numpy>=2,<3", "scipy>=1.17,<2", "pandas>=3,<4", "tzdata>=2026.3", "typer>=0.27.2", "httpx>=0.28,<1", "duckdb>=1.4,<2", "filelock>=3.20,<4"]
9
+ dependencies = ["pydantic>=2.5,<3", "polars>=1.36,<2", "numpy>=2,<3", "scipy>=1.17,<2", "pandas>=3,<4", "tzdata>=2026.3", "typer>=0.27.2", "httpx>=0.28,<1", "duckdb>=1.4,<2", "filelock>=3.20,<4", "pyyaml>=6,<7"]
10
10
 
11
11
  [project.urls]
12
12
  Repository = "https://github.com/Kepler452Byte/power-quant"
@@ -0,0 +1,31 @@
1
+ """可移除的资源命令;与核心计算命令无依赖。"""
2
+
3
+ from pathlib import Path
4
+ from typing import Annotated
5
+
6
+ import typer
7
+
8
+ from quant_cli.app.agent_resource.service.resource_service import ResourceService
9
+ from quant_cli.common.command_error_handler import CommandGroup
10
+ from quant_cli.common.command_help import Command
11
+ from quant_cli.common.utils.cli_utils import cli_errors, output
12
+
13
+ app = typer.Typer(cls=CommandGroup, help="按需查看与导出随包 Skill 和提示词", no_args_is_help=True)
14
+
15
+
16
+ @app.command("list", cls=Command)
17
+ @cli_errors
18
+ def list_resources() -> None:
19
+ output({"items": ResourceService().list()})
20
+
21
+
22
+ @app.command("show", cls=Command)
23
+ @cli_errors
24
+ def show_resource(name: str) -> None:
25
+ output(ResourceService().show(name))
26
+
27
+
28
+ @app.command("export", cls=Command)
29
+ @cli_errors
30
+ def export_resources(directory: Annotated[Path, typer.Option("--directory")]) -> None:
31
+ output(ResourceService().export(directory))
@@ -0,0 +1,77 @@
1
+ """可选 Agent 资源读取与安全导出,不修改 Agent 配置。"""
2
+
3
+ import shutil
4
+ from importlib.resources import files
5
+ from pathlib import Path, PurePosixPath
6
+ from typing import Any
7
+
8
+
9
+ class ResourceService:
10
+ """仅管理随包资源,不联网、不读数据库。"""
11
+
12
+ def _root(self) -> Any:
13
+ return files("quant_cli").joinpath("resources")
14
+
15
+ def list(self) -> list[dict[str, str]]:
16
+ result = []
17
+ root = self._root()
18
+ if not root.is_dir():
19
+ return result
20
+ for kind in ("skills", "prompts"):
21
+ folder = root.joinpath(kind)
22
+ if folder.is_dir():
23
+ for item in sorted(folder.iterdir(), key=lambda entry: entry.name):
24
+ path = item.joinpath("SKILL.md") if item.is_dir() else item
25
+ if path.is_file():
26
+ result.append(
27
+ {
28
+ "name": item.name,
29
+ "kind": kind,
30
+ "path": f"{kind}/{item.name}",
31
+ "description": self._description(path.read_text(encoding="utf-8")),
32
+ }
33
+ )
34
+ return result
35
+
36
+ @staticmethod
37
+ def _description(text: str) -> str:
38
+ for line in text.splitlines():
39
+ if line.startswith("description:"):
40
+ return line.partition(":")[2].strip().strip('"')
41
+ return next((line.lstrip("# ") for line in text.splitlines() if line.strip()), "")
42
+
43
+ def show(self, name: str) -> dict[str, str]:
44
+ path = PurePosixPath(name)
45
+ if (
46
+ path.is_absolute()
47
+ or ".." in path.parts
48
+ or len(path.parts) != 2
49
+ or path.parts[0] not in ("skills", "prompts")
50
+ or "\\" in name
51
+ ):
52
+ raise ValueError("资源路径必须是 skills/<名称> 或 prompts/<名称>")
53
+ item = self._root().joinpath(*path.parts)
54
+ content = item.joinpath("SKILL.md") if item.is_dir() else item
55
+ if not content.is_file():
56
+ raise ValueError("资源不存在")
57
+ return {"path": name, "content": content.read_text(encoding="utf-8")}
58
+
59
+ def export(self, destination: Path) -> dict[str, str]:
60
+ # 必须新目录:不覆盖、不合并用户内容。独占创建防止并发覆盖。
61
+ destination.mkdir(parents=True, exist_ok=False)
62
+ try:
63
+ self._copy(self._root(), destination)
64
+ except BaseException:
65
+ shutil.rmtree(destination)
66
+ raise
67
+ return {"directory": str(destination.resolve())}
68
+
69
+ def _copy(self, source: Any, destination: Path) -> None:
70
+ for item in source.iterdir():
71
+ target = destination / item.name
72
+ if item.is_dir():
73
+ target.mkdir()
74
+ self._copy(item, target)
75
+ else:
76
+ with target.open("xb") as stream:
77
+ stream.write(item.read_bytes())
@@ -7,19 +7,19 @@ from uuid import UUID
7
7
 
8
8
  import typer
9
9
 
10
- from quant_cli.app.backtest.local_backtest_dependency import build_local_backtest_store
11
10
  from quant_cli.app.backtest.local_backtest_schema import LocalBacktestRequest
12
- from quant_cli.app.backtest.service.local_backtest_service import run_local_backtest
13
- from quant_cli.app.factor.local_factor_dependency import build_local_factor_store
11
+ from quant_cli.common.command_error_handler import CommandGroup
12
+ from quant_cli.common.command_help import Command
14
13
  from quant_cli.common.constants import DEFAULT_DATABASE_PATH
15
14
  from quant_cli.common.utils.cli_utils import cli_errors, output
16
15
 
17
- app = typer.Typer(help="本地策略回测", no_args_is_help=True)
16
+ app = typer.Typer(cls=CommandGroup, help="本地策略回测", no_args_is_help=True)
18
17
 
19
18
 
20
- @app.command("run")
19
+ @app.command("run", cls=Command)
21
20
  @cli_errors
22
21
  def run(
22
+ ctx: typer.Context,
23
23
  config: Annotated[Path, typer.Option(exists=True)],
24
24
  source: Annotated[Path | None, typer.Option(exists=True)] = None,
25
25
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
@@ -30,23 +30,26 @@ def run(
30
30
  if source is not None:
31
31
  payload["source"] = source.read_text(encoding="utf-8")
32
32
  request = LocalBacktestRequest.model_validate(payload)
33
- record = asyncio.run(run_local_backtest(request, build_local_factor_store(database)))
34
- build_local_backtest_store(database).save(record)
33
+ record = asyncio.run(
34
+ ctx.obj.backtest_service.run(request, database, ctx.obj.factor_service.store(database))
35
+ )
35
36
  output(record)
36
37
 
37
38
 
38
- @app.command("get")
39
+ @app.command("get", cls=Command)
39
40
  @cli_errors
40
41
  def get(
42
+ ctx: typer.Context,
41
43
  run: Annotated[UUID, typer.Option()],
42
44
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
43
45
  ) -> None:
44
- output(build_local_backtest_store(database).get(run))
46
+ output(ctx.obj.backtest_service.store(database).get(run))
45
47
 
46
48
 
47
- @app.command("list")
49
+ @app.command("list", cls=Command)
48
50
  @cli_errors
49
51
  def list_runs(
52
+ ctx: typer.Context,
50
53
  limit: int = 20,
51
54
  offset: int = 0,
52
55
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
@@ -54,19 +57,20 @@ def list_runs(
54
57
  output(
55
58
  [
56
59
  row.model_dump(mode="json")
57
- for row in build_local_backtest_store(database).list_runs(limit, offset)
60
+ for row in ctx.obj.backtest_service.store(database).list_runs(limit, offset)
58
61
  ]
59
62
  )
60
63
 
61
64
 
62
- @app.command("compare")
65
+ @app.command("compare", cls=Command)
63
66
  @cli_errors
64
67
  def compare(
68
+ ctx: typer.Context,
65
69
  run: Annotated[list[UUID], typer.Option()],
66
70
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
67
71
  ) -> None:
68
72
  """比较多次本地回测。"""
69
73
  from quant_cli.app.backtest.service.local_backtest_service import compare_backtest_records
70
74
 
71
- store = build_local_backtest_store(database)
75
+ store = ctx.obj.backtest_service.store(database)
72
76
  output(compare_backtest_records(tuple(store.get(key) for key in run)))
@@ -0,0 +1,29 @@
1
+ """Backtest 应用服务组装,存储路径由调用方显式指定。"""
2
+
3
+ from collections.abc import Callable
4
+ from pathlib import Path
5
+
6
+ from quant_core.app.factor.interface.public.factor_local import LocalFactorStore
7
+ from quant_core.common.local_run import LocalRunRecord
8
+
9
+ from quant_cli.app.backtest.local_backtest_schema import LocalBacktestRequest
10
+ from quant_cli.app.backtest.repository.backtest_local_repository import BacktestLocalRepository
11
+
12
+
13
+ class BacktestApplicationService:
14
+ def __init__(self, store_factory: Callable[[Path], BacktestLocalRepository]) -> None:
15
+ self._store_factory = store_factory
16
+
17
+ def store(self, path: Path) -> BacktestLocalRepository:
18
+ """组装短事务存储,不缓存连接或隐式选择路径。"""
19
+ return self._store_factory(path)
20
+
21
+ async def run(
22
+ self, request: LocalBacktestRequest, path: Path, factor_store: LocalFactorStore
23
+ ) -> LocalRunRecord:
24
+ """回测并归档,因子依赖由组合根显式传入。"""
25
+ from quant_cli.app.backtest.service.local_backtest_service import run_local_backtest
26
+
27
+ record = await run_local_backtest(request, factor_store)
28
+ self.store(path).save(record)
29
+ return record
@@ -5,6 +5,8 @@ from typing import Annotated
5
5
 
6
6
  import typer
7
7
 
8
+ from quant_cli.common.command_error_handler import CommandGroup
9
+ from quant_cli.common.command_help import Command
8
10
  from quant_cli.common.utils.cli_utils import cli_errors, output
9
11
  from quant_cli.config.connection_config import (
10
12
  get_config_path,
@@ -13,7 +15,7 @@ from quant_cli.config.connection_config import (
13
15
  update_saved_config,
14
16
  )
15
17
 
16
- app = typer.Typer(help="保存和查看当前用户的行情连接配置", no_args_is_help=True)
18
+ app = typer.Typer(cls=CommandGroup, help="保存和查看当前用户的行情连接配置", no_args_is_help=True)
17
19
 
18
20
 
19
21
  class ConfigKey(StrEnum):
@@ -21,7 +23,7 @@ class ConfigKey(StrEnum):
21
23
  MARKET_TOKEN = "market-token"
22
24
 
23
25
 
24
- @app.command("set")
26
+ @app.command("set", cls=Command)
25
27
  @cli_errors
26
28
  def set_config(
27
29
  market_url: Annotated[str, typer.Option("--market-url", "--url", help="行情 API 基础地址")],
@@ -31,7 +33,7 @@ def set_config(
31
33
  output({"status": "saved", "path": str(get_config_path()), "key": "market_url"})
32
34
 
33
35
 
34
- @app.command("token")
36
+ @app.command("token", cls=Command)
35
37
  @cli_errors
36
38
  def set_token() -> None:
37
39
  """隐藏输入平台 Token,避免写入命令历史与进程参数。"""
@@ -40,7 +42,7 @@ def set_token() -> None:
40
42
  output({"status": "saved", "path": str(get_config_path()), "key": "market_token"})
41
43
 
42
44
 
43
- @app.command("show")
45
+ @app.command("show", cls=Command)
44
46
  @cli_errors
45
47
  def show_config() -> None:
46
48
  """展示已保存和当前生效的配置、来源;不输出密钥原文或前缀。"""
@@ -63,7 +65,7 @@ def show_config() -> None:
63
65
  )
64
66
 
65
67
 
66
- @app.command("unset")
68
+ @app.command("unset", cls=Command)
67
69
  @cli_errors
68
70
  def unset_config(key: ConfigKey) -> None:
69
71
  """删除一项已保存配置,环境变量覆盖仍然有效。"""
@@ -6,19 +6,21 @@ from typing import Annotated
6
6
 
7
7
  import typer
8
8
 
9
- from quant_cli.app.data.data_dependency import build_market_query
10
9
  from quant_cli.app.data.schema.dataset_request_schema import DatasetPrepareRequest
11
10
  from quant_cli.app.data.service.dataset_load_service import load_dataset
12
11
  from quant_cli.app.data.service.dataset_prepare_service import prepare_dataset
12
+ from quant_cli.common.command_error_handler import CommandGroup
13
+ from quant_cli.common.command_help import Command
13
14
  from quant_cli.common.constants import DEFAULT_DATASETS_DIR
14
15
  from quant_cli.common.utils.cli_utils import cli_errors, output
15
16
 
16
- app = typer.Typer(help="行情快照准备与校验", no_args_is_help=True)
17
+ app = typer.Typer(cls=CommandGroup, help="行情快照准备与校验", no_args_is_help=True)
17
18
 
18
19
 
19
- @app.command("prepare")
20
+ @app.command("prepare", cls=Command)
20
21
  @cli_errors
21
22
  def prepare(
23
+ ctx: typer.Context,
22
24
  config: Annotated[Path, typer.Option(exists=True)],
23
25
  cache_dir: Annotated[Path, typer.Option()] = DEFAULT_DATASETS_DIR,
24
26
  ) -> None:
@@ -26,7 +28,7 @@ def prepare(
26
28
  request = DatasetPrepareRequest.model_validate_json(config.read_text(encoding="utf-8"))
27
29
 
28
30
  async def execute() -> str:
29
- async with build_market_query() as client:
31
+ async with ctx.obj.market_client() as client:
30
32
  result = await prepare_dataset(
31
33
  client,
32
34
  instrument_ids=request.instrument_ids,
@@ -45,7 +47,7 @@ def prepare(
45
47
  output({"manifest_path": asyncio.run(execute())})
46
48
 
47
49
 
48
- @app.command("verify")
50
+ @app.command("verify", cls=Command)
49
51
  @cli_errors
50
52
  def verify(manifest: Annotated[Path, typer.Option(exists=True)], max_rows: int = 1000000) -> None:
51
53
  market, _ = load_dataset(manifest, max_rows)
@@ -59,7 +61,7 @@ def verify(manifest: Annotated[Path, typer.Option(exists=True)], max_rows: int =
59
61
  )
60
62
 
61
63
 
62
- @app.command("audit")
64
+ @app.command("audit", cls=Command)
63
65
  @cli_errors
64
66
  def audit(
65
67
  manifest: Annotated[Path, typer.Option(exists=True)],
@@ -29,7 +29,4 @@ def load_backtest_market(manifest_path: Path, max_rows: int) -> BacktestMarketCo
29
29
  def build_market_query() -> MarketClient:
30
30
  """显式在线准备入口,配置仅为服务地址与令牌。"""
31
31
  connection = resolve_market_connection()
32
- return MarketClient(
33
- connection.url,
34
- token=connection.token,
35
- )
32
+ return MarketClient(connection.url, token=connection.token)
@@ -9,15 +9,17 @@ import typer
9
9
  from quant_core.app.factor.schema.factor_computation_schema import FactorComputationSpec
10
10
  from quant_core.app.factor.schema.factor_publication_schema import PublishedFactor
11
11
 
12
+ from quant_cli.common.command_error_handler import CommandGroup
13
+ from quant_cli.common.command_help import Command
12
14
  from quant_cli.common.http.definition_client import request_definition, save_definition
13
15
  from quant_cli.common.utils.cli_utils import cli_errors, output
14
16
 
15
- app = typer.Typer(help="因子定义发布、查询与获取", no_args_is_help=True)
17
+ app = typer.Typer(cls=CommandGroup, help="因子定义发布、查询与获取", no_args_is_help=True)
16
18
  Server = Annotated[str, typer.Option(envvar="PQ_QUANT_URL")]
17
19
  Token = Annotated[str, typer.Option(envvar="PQ_QUANT_TOKEN", help="建议由环境变量提供令牌")]
18
20
 
19
21
 
20
- @app.command("publish")
22
+ @app.command("publish", cls=Command)
21
23
  @cli_errors
22
24
  def publish(
23
25
  config: Annotated[Path, typer.Option(exists=True)],
@@ -38,7 +40,7 @@ def publish(
38
40
  output(result.model_dump(mode="json"))
39
41
 
40
42
 
41
- @app.command("list")
43
+ @app.command("list", cls=Command)
42
44
  @cli_errors
43
45
  def list_definitions(
44
46
  server: Server, token: Token, name: str | None = None, limit: int = 100, offset: int = 0
@@ -50,7 +52,7 @@ def list_definitions(
50
52
  output(request_definition(server, token, "GET", "/factor/definitions", params=params))
51
53
 
52
54
 
53
- @app.command("fetch")
55
+ @app.command("fetch", cls=Command)
54
56
  @cli_errors
55
57
  def fetch(
56
58
  name: str,
@@ -10,20 +10,21 @@ from quant_core.app.factor.schema.local_factor_schema import LocalFactorRequest
10
10
 
11
11
  from quant_cli.app.factor.cli.factor_definition_cli import app as definitions
12
12
  from quant_cli.app.factor.cli.local_selection_cli import register_selection_commands
13
- from quant_cli.app.factor.local_factor_dependency import build_local_factor_store
14
- from quant_cli.app.factor.service.local_factor_service import run_local_factor
13
+ from quant_cli.common.command_error_handler import CommandGroup
14
+ from quant_cli.common.command_help import Command
15
15
  from quant_cli.common.constants import DEFAULT_DATABASE_PATH
16
16
  from quant_cli.common.utils.cli_utils import cli_errors, output
17
17
 
18
- app = typer.Typer(help="本地因子计算与归档", no_args_is_help=True)
18
+ app = typer.Typer(cls=CommandGroup, help="本地因子计算与归档", no_args_is_help=True)
19
19
 
20
20
  app.add_typer(definitions, name="definition")
21
21
  register_selection_commands(app)
22
22
 
23
23
 
24
- @app.command("compute")
24
+ @app.command("compute", cls=Command)
25
25
  @cli_errors
26
26
  def compute(
27
+ ctx: typer.Context,
27
28
  config: Annotated[Path, typer.Option(exists=True)],
28
29
  source: Annotated[Path | None, typer.Option(exists=True)] = None,
29
30
  definition: Annotated[list[Path] | None, typer.Option(exists=True)] = None,
@@ -47,21 +48,23 @@ def compute(
47
48
  for path in definition
48
49
  ]
49
50
  request = LocalFactorRequest.model_validate(payload)
50
- output(asyncio.run(run_local_factor(request, build_local_factor_store(database))))
51
+ output(asyncio.run(ctx.obj.factor_service.run(request, database)))
51
52
 
52
53
 
53
- @app.command("get")
54
+ @app.command("get", cls=Command)
54
55
  @cli_errors
55
56
  def get(
57
+ ctx: typer.Context,
56
58
  run: Annotated[UUID, typer.Option()],
57
59
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
58
60
  ) -> None:
59
- output(build_local_factor_store(database).get(run))
61
+ output(ctx.obj.factor_service.store(database).get(run))
60
62
 
61
63
 
62
- @app.command("list")
64
+ @app.command("list", cls=Command)
63
65
  @cli_errors
64
66
  def list_runs(
67
+ ctx: typer.Context,
65
68
  limit: int = 20,
66
69
  offset: int = 0,
67
70
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
@@ -69,14 +72,15 @@ def list_runs(
69
72
  output(
70
73
  [
71
74
  row.model_dump(mode="json")
72
- for row in build_local_factor_store(database).list_runs(limit, offset)
75
+ for row in ctx.obj.factor_service.store(database).list_runs(limit, offset)
73
76
  ]
74
77
  )
75
78
 
76
79
 
77
- @app.command("import")
80
+ @app.command("import", cls=Command)
78
81
  @cli_errors
79
82
  def import_artifact(
83
+ ctx: typer.Context,
80
84
  artifact: Annotated[Path, typer.Option(exists=True)],
81
85
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
82
86
  ) -> None:
@@ -85,18 +89,19 @@ def import_artifact(
85
89
 
86
90
  output(
87
91
  import_factor_artifact(
88
- artifact.read_text(encoding="utf-8"), build_local_factor_store(database)
92
+ artifact.read_text(encoding="utf-8"), ctx.obj.factor_service.store(database)
89
93
  )
90
94
  )
91
95
 
92
96
 
93
- @app.command("values")
97
+ @app.command("values", cls=Command)
94
98
  @cli_errors
95
99
  def values(
100
+ ctx: typer.Context,
96
101
  run: Annotated[UUID, typer.Option()],
97
102
  limit: int = 100,
98
103
  offset: int = 0,
99
104
  database: Annotated[Path, typer.Option(envvar="PQ_LOCAL_DATABASE")] = DEFAULT_DATABASE_PATH,
100
105
  ) -> None:
101
106
  """分页查询归档因子值。"""
102
- output(build_local_factor_store(database).list_values(run, limit, offset))
107
+ output(ctx.obj.factor_service.store(database).list_values(run, limit, offset))