aukeys-opscli 0.0.41__tar.gz → 0.0.43__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 (164) hide show
  1. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/PKG-INFO +1 -1
  2. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/aukeys_opscli.egg-info/PKG-INFO +1 -1
  3. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/SKILL.md +31 -1
  4. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/references/cli.md +43 -2
  5. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/references/mcp.md +44 -5
  6. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/references/query-patterns.md +19 -0
  7. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/references/simple-query-guide.md +103 -17
  8. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/version.c +7 -7
  9. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/pyproject.toml +1 -1
  10. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/MANIFEST.in +0 -0
  11. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/README.md +0 -0
  12. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/aukeys_opscli.egg-info/SOURCES.txt +0 -0
  13. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/aukeys_opscli.egg-info/dependency_links.txt +0 -0
  14. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/aukeys_opscli.egg-info/entry_points.txt +0 -0
  15. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/aukeys_opscli.egg-info/requires.txt +0 -0
  16. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/aukeys_opscli.egg-info/top_level.txt +0 -0
  17. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/__init__.py +0 -0
  18. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/__init__.py +0 -0
  19. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/client.c +0 -0
  20. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/commands/__init__.py +0 -0
  21. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/domain/__init__.py +0 -0
  22. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/domain/exceptions.c +0 -0
  23. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/domain/models.c +0 -0
  24. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/exceptions.c +0 -0
  25. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/manager.c +0 -0
  26. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/models.c +0 -0
  27. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/parser.c +0 -0
  28. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/scraper.c +0 -0
  29. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/scraping/__init__.py +0 -0
  30. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/scraping/parser.c +0 -0
  31. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/scraping/scraper.c +0 -0
  32. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/services/__init__.py +0 -0
  33. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/services/manager.c +0 -0
  34. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/transport/__init__.py +0 -0
  35. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon/transport/client.c +0 -0
  36. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/__init__.py +0 -0
  37. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/commands/__init__.py +0 -0
  38. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/domain/__init__.py +0 -0
  39. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/domain/exceptions.c +0 -0
  40. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/domain/models.c +0 -0
  41. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/runtime/__init__.py +0 -0
  42. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/runtime/country_map.c +0 -0
  43. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/services/__init__.py +0 -0
  44. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/services/answer_report_formatter.c +0 -0
  45. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/services/browser.c +0 -0
  46. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/services/manager.c +0 -0
  47. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/services/parser.c +0 -0
  48. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/services/question_bank.c +0 -0
  49. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/services/replay.c +0 -0
  50. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/transport/__init__.py +0 -0
  51. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/amazon_rufus/transport/client.c +0 -0
  52. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/__init__.py +0 -0
  53. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/commands/__init__.py +0 -0
  54. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/config.c +0 -0
  55. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/core/__init__.py +0 -0
  56. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/core/device_flow.c +0 -0
  57. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/core/system_registry.c +0 -0
  58. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/core/token_manager.c +0 -0
  59. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/domain/__init__.py +0 -0
  60. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/domain/exceptions.c +0 -0
  61. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/exceptions.c +0 -0
  62. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/storage/__init__.py +0 -0
  63. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/storage/credential_store.c +0 -0
  64. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/auth/storage/crypto.c +0 -0
  65. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/config.c +0 -0
  66. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/__init__.py +0 -0
  67. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/client.c +0 -0
  68. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/commands/__init__.py +0 -0
  69. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/domain/__init__.py +0 -0
  70. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/domain/exceptions.c +0 -0
  71. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/domain/models.c +0 -0
  72. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/exceptions.c +0 -0
  73. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/manager.c +0 -0
  74. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/services/__init__.py +0 -0
  75. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/services/manager.c +0 -0
  76. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/transport/__init__.py +0 -0
  77. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/feedback/transport/client.c +0 -0
  78. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/mcp/__init__.py +0 -0
  79. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/mcp/auth_middleware.c +0 -0
  80. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/mcp/context.c +0 -0
  81. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/mcp/credential_cache.c +0 -0
  82. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/mcp/tools/__init__.py +0 -0
  83. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/mcp/user_store.c +0 -0
  84. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/__init__.py +0 -0
  85. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/client.c +0 -0
  86. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/commands/__init__.py +0 -0
  87. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/domain/__init__.py +0 -0
  88. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/domain/exceptions.c +0 -0
  89. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/domain/models.c +0 -0
  90. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/exceptions.c +0 -0
  91. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/manager.c +0 -0
  92. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/models.c +0 -0
  93. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/services/__init__.py +0 -0
  94. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/services/manager.c +0 -0
  95. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/transport/__init__.py +0 -0
  96. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/query/transport/client.c +0 -0
  97. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/__init__.py +0 -0
  98. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/commands/__init__.py +0 -0
  99. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/domain/__init__.py +0 -0
  100. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/domain/exceptions.c +0 -0
  101. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/domain/models.c +0 -0
  102. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/scraping/__init__.py +0 -0
  103. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/scraping/api_recorder.c +0 -0
  104. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/scraping/archiver.c +0 -0
  105. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/scraping/captcha.c +0 -0
  106. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/scraping/scraper.c +0 -0
  107. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/services/__init__.py +0 -0
  108. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/services/account_store.c +0 -0
  109. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/seller_sprite/services/manager.c +0 -0
  110. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/shared/__init__.py +0 -0
  111. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/shared/exceptions.c +0 -0
  112. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/shared/http.c +0 -0
  113. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/shared/logging.c +0 -0
  114. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/__init__.py +0 -0
  115. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/commands/__init__.py +0 -0
  116. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/detector.c +0 -0
  117. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/discovery/__init__.py +0 -0
  118. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/discovery/detector.c +0 -0
  119. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/domain/__init__.py +0 -0
  120. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/domain/exceptions.c +0 -0
  121. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/domain/models.c +0 -0
  122. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/exceptions.c +0 -0
  123. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/manager.c +0 -0
  124. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/models.c +0 -0
  125. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/packaging.c +0 -0
  126. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/services/__init__.py +0 -0
  127. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/services/manager.c +0 -0
  128. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/services/rule_injector.c +0 -0
  129. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/sync/__init__.py +0 -0
  130. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/sync/updater.c +0 -0
  131. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/manifest.json +0 -0
  132. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-auth/SKILL.md +0 -0
  133. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-auth/data/VERSION.json +0 -0
  134. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-auth/references/cli.md +0 -0
  135. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-auth/references/mcp.md +0 -0
  136. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/.gitignore +0 -0
  137. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/data/VERSION.json +0 -0
  138. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/data/dataset_catalog.json +0 -0
  139. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/data/dataset_fields.csv +0 -0
  140. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/data/datasets.csv +0 -0
  141. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/data/query_metadata.json +0 -0
  142. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/references/data-query-service-dev-guide.md +0 -0
  143. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze.py +0 -0
  144. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze_mcp.py +0 -0
  145. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/chart_map.py +0 -0
  146. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/chart_map_mcp.py +0 -0
  147. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/core.py +0 -0
  148. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/excel_export.py +0 -0
  149. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/excel_export_mcp.py +0 -0
  150. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/query.py +0 -0
  151. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/query_mcp.py +0 -0
  152. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/search.py +0 -0
  153. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/updater.py +0 -0
  154. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-dataset-query/scripts/updater_mcp.py +0 -0
  155. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-feedback/SKILL.md +0 -0
  156. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-feedback/data/FEEDBACK_RULE.md +0 -0
  157. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-feedback/data/VERSION.json +0 -0
  158. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-feedback/references/cli.md +0 -0
  159. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/templates/ops-feedback/references/mcp.md +0 -0
  160. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/opscli/skills/updater.c +0 -0
  161. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/setup.cfg +0 -0
  162. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/setup.py +0 -0
  163. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/tests/test_session_sharing.py +0 -0
  164. {aukeys_opscli-0.0.41 → aukeys_opscli-0.0.43}/tests/test_version_consistency.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aukeys-opscli
3
- Version: 0.0.41
3
+ Version: 0.0.43
4
4
  Summary: Aukeys 运营 CLI 工具集
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aukeys-opscli
3
- Version: 0.0.41
3
+ Version: 0.0.43
4
4
  Summary: Aukeys 运营 CLI 工具集
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -66,13 +66,41 @@ version: see data/VERSION.json
66
66
 
67
67
  ---
68
68
 
69
+ ## 【强制】意图分析流程(数据集选择)
70
+
71
+ > 当用户给出自然语言需求、没有明确指定 dataset 时,**必须**按以下流程选择数据集,禁止跳过远程 catalog 直接用本地搜索猜测。
72
+
73
+ **标准流程**:
74
+
75
+ 1. **远程 catalog 优先**:调用 `opscli query catalog --pretty`(CLI)或 `query_catalog()`(MCP),读取远端最新的 `intents` 列表
76
+ 2. **意图匹配**:将用户需求与 `intents` 中的 `use_cases`、`keywords`、`scenario_description` 逐条匹配,按 `priority` 选择最佳候选数据集
77
+ 3. **获取 table_id 和 default_filters**:从命中的 intent 中提取 `table_id`、`dataset_alias`、`default_filters`、`comparison_strategy` 等参数
78
+ 4. **验证 default_filters(强制)**:catalog 的 `default_filters` 可能与实际数据不匹配。首次使用某数据集的 `default_filters` 时,必须先发一个轻量探查查询(不带 `default_filters`,仅带日期范围 + 1 个指标 SUM,limit=1)确认数据集有数据;再加上 `default_filters` 重试;若加上后返回 0 行,则去掉该 `default_filters` 继续查询,并在结果中告知用户已跳过不可用的默认过滤条件
79
+ 5. **字段校验**:用本地 `data/dataset_fields.csv` 或 `query_metadata` 校验目标字段是否存在
80
+ 6. **构造查询**:基于 catalog 提供的 `table_id`、验证通过的 `default_filters`、`comparison_strategy` 构造查询
81
+
82
+ **降级规则**:
83
+
84
+ | 优先级 | 场景 | 动作 |
85
+ |--------|------|------|
86
+ | 1(最优) | 远程 catalog 可用 | 直接使用远端 `intents` 匹配 |
87
+ | 2(回退) | 远程 catalog 失败且 `fallback_local=true` | 自动回退本地缓存 `data/dataset_catalog.json` |
88
+ | 3(兜底) | catalog 为空或 intents 无法匹配 | 回退到 `search`(MCP)/ `search.py`(CLI)+ `datasets.csv` 关键词检索 |
89
+
90
+ **禁止行为**:
91
+ - 跳过远程 catalog,直接用本地 `search.py` / `search` 工具猜测数据集
92
+ - **盲信** catalog 的 `default_filters` 而不做验证——`default_filters` 可能因数据源变更、字段值不一致等原因导致查询返回 0 行
93
+ - 忽略 catalog 中的 `comparison_strategy`,未按推荐策略构造对比查询
94
+
95
+ ---
96
+
69
97
  ## 使用原则
70
98
 
71
99
  - **简化接口优先**:普通聚合、数据对比、MOY 趋势、子查询等场景,优先使用简化接口(`opscli query simple` / `query_simple`),参数结构见 `references/simple-query-guide.md`
72
100
  - 仅当简化接口不满足需求时(如复杂的 `joins`、`union`、自定义子查询),才手写完整 query payload + `opscli query run` / `query_run`
73
101
  - 所有远端查询动作必须统一走选定模式下的正式查询入口,禁止直接调用后端 HTTP 接口
74
102
  - 认证检查按动作触发:本地只读检索(`catalog --source local` / `query_catalog(source="local")` / `metadata` / `search` / `fetch`)不要求登录;默认远端 catalog、远端执行、图表运行和 Skill 升级前必须确认认证
75
- - 用户未指定 dataset 时,优先使用 `opscli query catalog`(CLI)或 `query_catalog`(MCP)读取 dataset catalog `intents` 选择候选数据集;catalog 为空或缺失时,回退到 `datasets.csv` + `dataset_fields.csv` 关键词检索
103
+ - **【强制】意图分析必须远程 catalog 优先**:用户未指定 dataset 时,必须先调用远程 catalog 匹配 intents;仅当 catalog 不可用或 intents 无法匹配时,才回退到本地关键词检索
76
104
  - 查询前优先检查目标 `dataset_alias`、`field_name`、`global_alias`、`verbose_name` 是否存在于本地索引或 metadata;不要先猜字段再直接构造 payload
77
105
  - **【强制】本地搜索结果为空时,必须先确认数据是否已初始化**:若 `updater_mcp.py --check`、`opscli skills status` 或本地文件统计显示数据为空/placeholder,先升级再重试;若数据已初始化但搜索为空,再告知用户当前索引未覆盖
78
106
  - 如果字段或数据集不存在,优先执行当前模式下的 Skill 升级,再重新检查一次
@@ -81,4 +109,6 @@ version: see data/VERSION.json
81
109
  - 涉及环比、同比、上期对比等汇总对比时,优先使用服务端 `dataComparison` 能力;**必须同时传主周期日期 `filters` + 对比周期 `dataComparison`**,不能只传 `dataComparison`
82
110
  - 普通时间范围查询只用 `filters`;只有需要对比时才同时使用 `filters` 与 `dataComparison`
83
111
  - 如果 `query_simple` / `opscli query simple` 携带 `dataComparison` 后出现 SQL 解析错误(如 `QS-EXE-005 missing ')' at '{'`),先检查是否缺少主周期日期 `filters`;缺少时自动补上当前周期 `>=`、`<=` 或 `between` 日期过滤后重试,仍失败再降级为纯 `filters` 查询或多次查询本地合并
112
+ - **子查询数据集(`inner_where_enabled=true`)已支持 `dataComparison`**:使用方式与普通数据集一致,必须同时传主周期 `filters` 和 `dataComparison`。若极端情况下仍未返回 `last_*`、`diff_*`、`pct_*` 对比字段,可降级为"分别查询两个周期 + 本地合并计算环比"策略
113
+ - **【已知限制】子查询数据集必须至少包含一个业务过滤条件**:`inner_where_enabled=true` 的数据集在无任何业务 `filters` 时,`innerWhere` 占位符无法填充,会导致 `QS-EXE-005` SQL 解析错误。查询此类数据集时,必须至少传入一个日期范围过滤条件
84
114
  - 处理 chart 查询时,优先采用服务端返回的 `datasets + queries` 双层结构:`datasets` 负责公共字段语义,`queries` 负责执行结构;本地 CSV 仅作字段映射兜底
@@ -1128,13 +1128,54 @@ python3 -c "import json; print(json.load(open('/tmp/result.json'))['data']['resu
1128
1128
 
1129
1129
  ## 典型工作流
1130
1130
 
1131
- ### 探索数据集 → 构造 → 执行(简化接口,推荐)
1131
+ ### 意图分析数据集选择 → 构造 → 执行(推荐)
1132
+
1133
+ > **【强制】用户未指定 dataset 时,必须从远程 catalog 意图匹配开始,禁止跳过直接用本地搜索猜测。**
1134
+
1135
+ ```bash
1136
+ # 0. 先检查认证状态;如未登录则调用 ops-auth 完成登录
1137
+ opscli auth token status
1138
+
1139
+ # 1.【强制】远程 catalog 意图分析(默认远端优先,失败自动回退本地缓存)
1140
+ opscli query catalog --pretty
1141
+ # 从返回的 intents 中匹配用户需求:
1142
+ # - 比对 use_cases / keywords / scenario_description
1143
+ # - 按 priority 选择最佳候选
1144
+ # - 提取 table_id、dataset_alias、default_filters、comparison_strategy
1145
+
1146
+ # 2. 用本地索引校验目标字段是否存在
1147
+ python scripts/search.py <field_name> --dataset <dataset_alias> -n 20
1148
+ # 或查看完整 metadata
1149
+ opscli query metadata --dataset <dataset_alias> --pretty
1150
+
1151
+ # 3. 基于 catalog 提供的 table_id + default_filters + comparison_strategy 构造查询
1152
+ opscli query simple \
1153
+ --table-id <table_id> \
1154
+ --json '{
1155
+ "dimensions": [...],
1156
+ "metrics": [...],
1157
+ "filters": [<default_filters>, <用户指定的日期/维度过滤>],
1158
+ "limit": 50
1159
+ }' \
1160
+ --run --pretty
1161
+ ```
1162
+
1163
+ **意图匹配示例**:
1164
+
1165
+ 用户说"查广告数据" → catalog 返回 `intent_code: instant_advertising_analysis`:
1166
+ - `table_id: 15`,`dataset_alias: ds_0759e20F0DrG`
1167
+ - `default_filters: [{"field": "amazon_cat", "value": "Amazon", "operator": "="}]`
1168
+ - `comparison_strategy: {"trend_compare": "MOM", "summary_compare": "dataComparison"}`
1169
+
1170
+ → 直接用 `table_id=15` + `platform_name in ["Amazon"]` 构造查询,无需猜测数据集。
1171
+
1172
+ ### 探索数据集 → 构造 → 执行(已知数据集时)
1132
1173
 
1133
1174
  ```bash
1134
1175
  # 0. 先检查认证状态;如未登录则调用 ops-auth 完成登录
1135
1176
  opscli auth token status
1136
1177
 
1137
- # 1. 通过本地索引确认数据集和字段名
1178
+ # 1. 通过本地索引确认字段名
1138
1179
  # 2. 查看完整 metadata(获取 table_id 和字段信息)
1139
1180
  opscli query metadata --dataset sales_order_d --pretty
1140
1181
  # 3. 使用简化接口构造并执行
@@ -868,15 +868,55 @@ result_prev = query_simple(
868
868
 
869
869
  ## 典型工作流
870
870
 
871
- ### 探索数据集 → 构造 → 执行(简化接口)
871
+ ### 意图分析数据集选择 → 构造 → 执行(推荐)
872
+
873
+ > **【强制】用户未指定 dataset 时,必须从远程 catalog 意图匹配开始,禁止跳过直接用本地搜索猜测。**
872
874
 
873
875
  ```python
874
876
  # 0. 先检查 session;如无效则重新 Device Flow 授权
875
877
  auth_is_authenticated(session_id="xxx")
876
878
 
877
- # 1. 通过本地索引确认数据集和字段名
879
+ # 1.【强制】远程 catalog 意图分析(默认远端优先,失败自动回退本地缓存)
880
+ query_catalog()
881
+ # 从返回的 intents 中匹配用户需求:
882
+ # - 比对 use_cases / keywords / scenario_description
883
+ # - 按 priority 选择最佳候选
884
+ # - 提取 table_id、dataset_alias、default_filters、comparison_strategy
885
+
886
+ # 2. 用本地索引校验目标字段
887
+ search(query="<field_name>")
888
+ # 或查看完整 metadata
889
+ query_metadata(dataset="<dataset_alias>")
890
+
891
+ # 3. 基于 catalog 提供的 table_id + default_filters + comparison_strategy 构造查询
892
+ query_simple(
893
+ table_id=<table_id>, # 从 catalog intent 获取
894
+ dimensions=[...],
895
+ metrics=[...],
896
+ filters=[...], # 合并 default_filters + 用户指定的日期/维度过滤
897
+ limit=50,
898
+ session_id="xxx"
899
+ )
900
+ ```
901
+
902
+ **意图匹配示例**:
903
+
904
+ 用户说"查广告数据" → catalog 返回 `intent_code: instant_advertising_analysis`:
905
+ - `table_id: 15`,`dataset_alias: ds_0759e20F0DrG`
906
+ - `default_filters: [{"field": "amazon_cat", "value": "Amazon", "operator": "="}]`
907
+ - `comparison_strategy: {"trend_compare": "MOM", "summary_compare": "dataComparison"}`
908
+
909
+ → 直接用 `table_id=15` + `platform_name in ["Amazon"]` 构造查询,无需猜测数据集。
910
+
911
+ ### 探索数据集 → 构造 → 执行(已知数据集时)
912
+
913
+ ```python
914
+ # 0. 先检查 session;如无效则重新 Device Flow 授权
915
+ auth_is_authenticated(session_id="xxx")
916
+
917
+ # 1. 通过本地索引确认字段名
878
918
  # 2. 查看完整 metadata
879
- query_metadata(dataset="sales_order_d", skills_dir="/Users/mask/.config/opencode/skills")
919
+ query_metadata(dataset="sales_order_d")
880
920
 
881
921
  # 3. 使用简化接口构造并执行
882
922
  query_simple(
@@ -886,8 +926,7 @@ query_simple(
886
926
  filters=[{"field": "date_id", "operator": "between", "value": ["2026-04-01", "2026-04-22"]}],
887
927
  order_by=[{"field": "f_fee_sum", "desc": True}],
888
928
  limit=50,
889
- session_id="860b0636485b5188a2b9b4ed5210e736",
890
- skills_dir="/Users/mask/.config/opencode/skills"
929
+ session_id="xxx"
891
930
  )
892
931
  ```
893
932
 
@@ -87,6 +87,25 @@ description: 数据对比与高级计算通用参考(CLI / MCP 共享)
87
87
 
88
88
  **适用场景**:当期(如本月 1-22 日) vs 对比期(如上月同期 1-22 日)的汇总数据对比,**同期天数对等**,适合月度/季度环比汇总看板。
89
89
 
90
+ **注意事项**:
91
+
92
+ | 事项 | 说明 |
93
+ |------|------|
94
+ | 子查询数据集已支持 | `inner_where_enabled=true` 的数据集(如 table_id=15 广告数据集)已支持 `dataComparison`,使用方式与普通数据集一致 |
95
+ | 必须同时传主周期 filters | 只传 `dataComparison` 不传日期 `filters` 会导致 SQL 解析错误,始终同时传 `filters`(主周期日期)+ `dataComparison`(对比周期日期) |
96
+
97
+ **极端降级流程**(仅在服务端未返回对比字段时使用):
98
+
99
+ ```
100
+ 1. 使用 dataComparison 查询
101
+ 2. 检查返回结果是否包含 last_* 字段
102
+ ├── 包含 → 正常使用(预期路径)
103
+ └── 不包含 → 降级:分别查询两个周期 + 本地合并
104
+ ├── 查询主周期(filters 限定当期日期)
105
+ ├── 查询对比周期(filters 限定上期日期)
106
+ └── 按维度匹配,计算 diff 和 pct
107
+ ```
108
+
90
109
  ---
91
110
 
92
111
  ## MOY 同环比(高级计算)
@@ -68,30 +68,84 @@ description: 简化查询接口指南 — 7 个纯业务概念完成数据查询
68
68
 
69
69
  ```json
70
70
  [
71
- {"field": "dept_name", "alias": "f_dept"},
72
- {"field": "date_id", "alias": "f_month", "format": "%Y-%m"}
71
+ {"field": "dept_name", "alias": "f_dept"},
72
+ {"field": "date_id", "alias": "f_month", "format": "%Y-%m"}
73
+ ]
74
+ ```
75
+
76
+ - `field`:字段的 origin_name(不含数据集前缀,服务端自动拼接)
77
+ - `alias`:返回结果中的列名(建议使用 global_alias)
78
+ - `format`(可选):日期格式化,如 `%Y-%m` 按月分组
79
+
80
+ ### metrics — 指标
81
+
82
+ ```json
83
+ [
84
+ {"field": "price", "aggregation": "SUM", "alias": "f_price_sum"},
85
+ {"field": "price", "aggregation": "SUM", "alias": "f_price_moy", "comparison": "MOY", "moyType": "MOM_MONTH"}
86
+ ]
87
+ ```
88
+
89
+ - `aggregation`:聚合方式(`SUM`、`COUNT`、`AVG`、`MAX`、`MIN`)
90
+ - `comparison`(可选):`MOY`(月环比/年同比趋势)、`ACC`(累计)、`PPT`(百分点)
91
+ - `moyType`(可选):`MOM_MONTH`(月环比)、`YOY_YEAR`(年同比)
92
+
93
+ ### filters — 过滤条件
94
+
95
+ ```json
96
+ [
97
+ {"field": "platform_name", "operator": "in", "value": ["Amazon"]},
98
+ {"field": "date_id", "operator": "between", "value": ["2026-04-01", "2026-04-22"]}
99
+ ]
100
+ ```
101
+
102
+ - `operator`:`=`、`!=`、`>`、`>=`、`<`、`<=`、`in`、`not in`、`between`
103
+ - 子查询数据集中,服务端自动将业务条件放入 `innerWhere`,日期条件放入外层 `where`
104
+
105
+ ### dataComparison — 数据对比
106
+
107
+ ```json
108
+ {
109
+ "field": "date_id",
110
+ "startDate": "2026-03-01",
111
+ "endDate": "2026-03-22"
112
+ }
113
+ ```
114
+
115
+ - 必须同时传 `filters` 中的主周期日期,否则报 `QS-EXE-005`
116
+ - 返回字段:`last_{alias}`(上期值)、`diff_{alias}`(差值)、`pct_{alias}`(环比百分比)
117
+
118
+ ### orderBy — 排序
119
+
120
+ ```json
121
+ [
122
+ {"field": "f_price_sum", "desc": true}
123
+ ]
124
+ ```
125
+
126
+ - `field`:使用 metric/dimension 的 `alias`
127
+ - `desc`:`true` 降序,`false` 升序
128
+
129
+ ---
130
+
131
+ ## 完整示例
132
+
133
+ ### 示例 1:普通聚合查询
134
+
135
+ ```json
136
+ {
137
+ "tableId": 1,
138
+ "dimensions": [
139
+ {"field": "dept_name", "alias": "f_dept"}
73
140
  ],
74
141
  "metrics": [
75
- {"field": "price", "aggregation": "SUM", "alias": "f_price_sum"},
76
- {"field": "price", "aggregation": "SUM", "alias": "f_price_moy", "comparison": "MOY", "moyType": "MOM_MONTH"}
142
+ {"field": "fi_first_leg_trailer_fee", "aggregation": "SUM", "alias": "f_fee_sum"}
77
143
  ],
78
144
  "filters": [
79
- {"field": "platform_name", "operator": "in", "value": ["Amazon"]},
80
145
  {"field": "date_id", "operator": "between", "value": ["2026-04-01", "2026-04-22"]}
81
146
  ],
82
- "dataComparison": {
83
- "field": "date_id",
84
- "startDate": "2026-03-01",
85
- "endDate": "2026-03-22"
86
- },
87
147
  "orderBy": [
88
- {"field": "f_price_sum", "desc": true}
89
- ],
90
- "metrics": [
91
- {"field": "fi_first_leg_trailer_fee", "aggregation": "SUM", "alias": "f_fee_sum"}
92
- ],
93
- "filters": [
94
- {"field": "date_id", "operator": "between", "value": ["2026-04-01", "2026-04-22"]}
148
+ {"field": "f_fee_sum", "desc": true}
95
149
  ],
96
150
  "limit": 10
97
151
  }
@@ -179,6 +233,35 @@ description: 简化查询接口指南 — 7 个纯业务概念完成数据查询
179
233
 
180
234
  ---
181
235
 
236
+ ## 子查询数据集注意事项(inner_where_enabled=true)
237
+
238
+ 子查询类型数据集(如 `table_id=15` 广告数据集)有以下特殊约束:
239
+
240
+ ### 1. 必须至少包含一个日期过滤条件
241
+
242
+ 子查询数据集的 SQL 模板包含 `innerWhere` 占位符,当 `filters` 完全为空时,占位符无法填充,服务端会生成非法 SQL 并返回 `QS-EXE-005` 错误。
243
+
244
+ **最低要求**:至少传入一个日期范围过滤条件(`date_id >= xxx` 或 `date_id between [xxx, yyy]`)。
245
+
246
+ ```json
247
+ // 错误:无任何 filters,会导致 QS-EXE-005
248
+ {"tableId": 15, "dimensions": [...], "metrics": [...], "filters": []}
249
+
250
+ // 正确:至少带日期过滤
251
+ {"tableId": 15, "dimensions": [...], "metrics": [...],
252
+ "filters": [{"field": "date_id", "operator": "between", "value": ["2026-02-01", "2026-02-28"]}]}
253
+ ```
254
+
255
+ ### 2. dataComparison 已支持子查询数据集
256
+
257
+ 子查询数据集现已支持 `dataComparison`,服务端会正确返回 `last_*`、`diff_*`、`pct_*` 对比字段。使用方式与普通数据集一致,必须同时传主周期 `filters` 和 `dataComparison`。
258
+
259
+ ### 3. catalog default_filters 需验证
260
+
261
+ catalog 中 `default_filters`(如 `amazon_cat=Amazon`)可能与实际数据不匹配。首次使用时应先不带 `default_filters` 探查数据是否存在,确认后再决定是否加上。若加上后返回 0 行,则去掉继续查询。
262
+
263
+ ---
264
+
182
265
  ## CLI 调用方式
183
266
 
184
267
  ```bash
@@ -247,6 +330,9 @@ query_simple(
247
330
  | 缺少必填 alias | 400 | dimension / metric 必须提供 `alias` |
248
331
  | 不支持 comparison 类型 | 400 | 仅支持 `MOY`、`ACC`、`PPT` |
249
332
  | `dataComparison` SQL 解析错误 | `QS-EXE-005` 等 | 先检查是否缺少主周期日期 `filters`;缺少时补上当前周期日期过滤后重试,仍失败再降级为纯 `filters` 查询 |
333
+ | 子查询数据集无 filters | `QS-EXE-005` | `inner_where_enabled=true` 的数据集必须至少传一个日期过滤条件,否则 innerWhere 占位符无法填充 |
334
+ | `dataComparison` 未返回对比字段 | 无错误码 | 子查询数据集已支持 `dataComparison`;若仍未返回对比字段,降级为分别查询两个周期后本地合并计算 |
335
+ | catalog `default_filters` 返回 0 行 | 无错误码 | `default_filters` 可能与实际数据不匹配,去掉后重试 |
250
336
 
251
337
  ---
252
338
 
@@ -2282,7 +2282,7 @@ static __pyx_mstatetype * const __pyx_mstate_global = &__pyx_mstate_global_stati
2282
2282
  #endif
2283
2283
  /* #### Code section: constant_name_defines ### */
2284
2284
  #define __pyx_kp_u_ __pyx_string_tab[0]
2285
- #define __pyx_kp_u_0_0_41_dev __pyx_string_tab[1]
2285
+ #define __pyx_kp_u_0_0_43_dev __pyx_string_tab[1]
2286
2286
  #define __pyx_kp_u__2 __pyx_string_tab[2]
2287
2287
  #define __pyx_kp_u_aukeys_opscli __pyx_string_tab[3]
2288
2288
  #define __pyx_kp_u_opscli_version_py __pyx_string_tab[4]
@@ -2939,7 +2939,7 @@ __Pyx_RefNannySetupContext("PyInit_version", 0);
2939
2939
  * from importlib.metadata import PackageNotFoundError, version
2940
2940
  *
2941
2941
  * PACKAGE_NAME = "aukeys-opscli" # <<<<<<<<<<<<<<
2942
- * FALLBACK_VERSION = "0.0.41-dev"
2942
+ * FALLBACK_VERSION = "0.0.43-dev"
2943
2943
  *
2944
2944
  */
2945
2945
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_PACKAGE_NAME, __pyx_mstate_global->__pyx_kp_u_aukeys_opscli) < (0)) __PYX_ERR(0, 10, __pyx_L1_error)
@@ -2947,11 +2947,11 @@ __Pyx_RefNannySetupContext("PyInit_version", 0);
2947
2947
  /* "opscli/version.py":11
2948
2948
  *
2949
2949
  * PACKAGE_NAME = "aukeys-opscli"
2950
- * FALLBACK_VERSION = "0.0.41-dev" # <<<<<<<<<<<<<<
2950
+ * FALLBACK_VERSION = "0.0.43-dev" # <<<<<<<<<<<<<<
2951
2951
  *
2952
2952
  *
2953
2953
  */
2954
- if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_FALLBACK_VERSION, __pyx_mstate_global->__pyx_kp_u_0_0_41_dev) < (0)) __PYX_ERR(0, 11, __pyx_L1_error)
2954
+ if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_FALLBACK_VERSION, __pyx_mstate_global->__pyx_kp_u_0_0_43_dev) < (0)) __PYX_ERR(0, 11, __pyx_L1_error)
2955
2955
 
2956
2956
  /* "opscli/version.py":14
2957
2957
  *
@@ -3044,7 +3044,7 @@ static int __Pyx_InitConstants(__pyx_mstatetype *__pyx_mstate) {
3044
3044
  {
3045
3045
  const struct { const unsigned int length: 5; } index[] = {{1},{10},{1},{13},{17},{16},{12},{20},{20},{18},{18},{8},{11},{18},{13},{5},{8},{10},{8},{14},{12},{6},{12},{10},{3},{8},{6},{7},{25}};
3046
3046
  #if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (314 bytes) */
3047
- const char* const cstring = "BZh91AY&SY3PY\360\000\000\007\177\343FL\202\000\000\003\344\000\277\257\371\000\277\257\377\340\000@@\000@@@\0000\000\355Y\206\250i\240A\264\324\311\240\320\304i\352\r\001\246\217F\232\203T\364\231\033SS\023M\251\352\r4\032\000\000\000\320\032\236\243T\364\322h\321\243\322\003@\000\032\001\240\002\251\013ml<\360t\326\3748\263\235\236D\202VR\211\267\321\306\251\302\221Z<6\227;\362\017\220OY\347<s\240\374\270\271\"\230\317\254y\036\310\232/\024fb\022[\n@\022\205\241\niXm\033\t\005\312\235\366\0237\326\244\250\316\031\226D@E\301\302\226\033Qu\347a\331u\234\217\346\001\246\2434\020\256\343\246\266\360\373\006\272\275F\210\221\211*\000\304r\n\300\206\221\003\r\"\251xZt\2532!,Y\347%=\010)\310\005\025\303\214V\335\211\0137\245\374\312\0238~E\244U8\010\231\223J\024F\026\003\361\023N\253NPQ\010\216A\024\017\333\203\212\027Ab\216B\020\256\267!\216l\024\306R\022\360\245\303\273\014$_\361w$S\205\t\0035\005\237\000";
3047
+ const char* const cstring = "BZh91AY&SY\307\363\312\360\000\000\007\177\343FL\202\000\000\003\314\000\277\257\371\000\277\257\377\340\000@@\000@@@\0000\000\355Y\206\250i\240A\264\324\311\240\320\304i\352\r\001\246\217F\232\203T\364\231\033SS\023M\251\352\r4\032\000\000\000\320\032\236\243T\364\322h\321\243\322\003@\000\032\001\240\002\251\013ml<\360t\326\3748\263\235\236D\202VR\211\267\321\306\251\302\221Z<6\227;\362\017\220OY\347<s\240\374\270\271\"\230\317\254y\036\310\232/\024fb\022[\n@\022\205\241\niXm\033\t\005\312\235\366\0237\326\244\250\316\031\226D@E\301\302\226\033Qu\347a\331u\234\217\346\001\246\2434\020\256\343\246\266\360\373\006\272\275F\210\221\211*\000\304r\n\300\206\221\003\r\"\251xZt\2532!,Y\347%=\010)\310\005\025\303\214V\335\211\0137\245\374\312\0238~E\244U8\010\231\223J\024F\026\003\361\023N\253NPQ\010\216A\024\017\333\203\212\027Ab\216B\020\256\267!\216l\024\306R\022\360\245\303\273\014$_\361w$S\205\t\014\177<\257\000";
3048
3048
  PyObject *data = __Pyx_DecompressString(cstring, 314, 2);
3049
3049
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
3050
3050
  const char* const bytes = __Pyx_PyBytes_AsString(data);
@@ -3052,7 +3052,7 @@ const char* const cstring = "BZh91AY&SY3PY\360\000\000\007\177\343FL\202\000\000
3052
3052
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
3053
3053
  #endif
3054
3054
  #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (253 bytes) */
3055
- const char* const cstring = "x\332=OMK\303@\020\365\240 (x\362gt\255\340]\242\246\"\326\030[\360:L7\323\262t?\222\335\331\330\374\003\217\371i\036{\364\247\270!\301\201\231y\274a\336\233\021s1\027w\267\263\212\332{\214{\352\302\314\325Aj5\326\233\226|P\316\212\272[d\313\345C\366\370\n\237\371j\375\362^\224\tg\3179\024\331[^\242\334\343\216\n\307\013\027m\225{\357<@\331\035R>)\311P\320\201W\264\305\320Y\251\234\220\316\273\310\312\322\340a\t\224\005\366(i\223t\000\266\321J\200\0351L\356\312\324\316\263V\033a\210\261BFP\001\376E\024\223\t\000\006\223L\n\343\252\250i@\026M\352\343'b\322\002h\"\352q\342\211\243OLHV#\223P\225\316\214\232\003\247\017\230\002\003\264\250#\205i\377\347\344\272\377\370==;\236_}\177\365\3307\307\213\313\0017\177O%\200-";
3055
+ const char* const cstring = "x\332=OMK\303@\020\365\240 (x\362gt-\350]\242\246\"\326\030[\360:L7\323\262t?\222\335\331\330\374\003\217\371i\036{\364\247\270!\301\201\231y\274a\336\233\021s1\027w\267\263\212\332{\214{\352\302\314\325Aj5\326\233\226|P\316\212\272[d\313\345C\366\370\n\237\371j\375\362^\224\tg\3179\024\331[^\242\334\343\216\n\307\013\027m\225{\357<@\331\035R>)\311P\320\201W\264\305\320Y\251\234\220\316\273\310\312\322\340a\t\224\005\366(i\223t\000\266\321J\200\0351L\356\312\324\316\263V\033a\210\261BFP\001\376E\024\223\t\000\006\223L\n\343\252\250i@\026M\352\343'b\322\002h\"\352q\342\211\243OLHV#\223P\225\316\214\232\003\247\017\230\002\003\264\250#\205i\377\347\344\272\377\370==;\236_}\177\365\3307\307\213\313\0017\177Q\255\200/";
3056
3056
  PyObject *data = __Pyx_DecompressString(cstring, 253, 1);
3057
3057
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
3058
3058
  const char* const bytes = __Pyx_PyBytes_AsString(data);
@@ -3060,7 +3060,7 @@ const char* const cstring = "x\332=OMK\303@\020\365\240 (x\362gt\255\340]\242\24
3060
3060
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
3061
3061
  #endif
3062
3062
  #else /* compression: none (330 bytes) */
3063
- const char* const bytes = ".0.0.41-dev?aukeys-opscliopscli/version.pyFALLBACK_VERSIONPACKAGE_NAMEPackageNotFoundError__Pyx_PyDict_NextRefasyncio.coroutinescline_in_traceback__func__get_versionimportlib.metadata_is_coroutineitems__main____module____name__opscli.version__qualname__return__set_name__setdefaultstr__test__valuesversion\320\000\025\220Q\340\004\005\330\010\017\210w\220a\220q\330\013\014\330\010\017\210q";
3063
+ const char* const bytes = ".0.0.43-dev?aukeys-opscliopscli/version.pyFALLBACK_VERSIONPACKAGE_NAMEPackageNotFoundError__Pyx_PyDict_NextRefasyncio.coroutinescline_in_traceback__func__get_versionimportlib.metadata_is_coroutineitems__main____module____name__opscli.version__qualname__return__set_name__setdefaultstr__test__valuesversion\320\000\025\220Q\340\004\005\330\010\017\210w\220a\220q\330\013\014\330\010\017\210q";
3064
3064
  PyObject *data = NULL;
3065
3065
  CYTHON_UNUSED_VAR(__Pyx_DecompressString);
3066
3066
  #endif
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aukeys-opscli"
3
- version = "0.0.41"
3
+ version = "0.0.43"
4
4
  description = "Aukeys 运营 CLI 工具集"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
File without changes
File without changes
File without changes