aukeys-opscli 0.0.22__tar.gz → 0.0.23__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 (235) hide show
  1. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/PKG-INFO +1 -1
  2. aukeys_opscli-0.0.23/docs/change-log-pending.md +76 -0
  3. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/services/manager.py +37 -5
  4. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/SKILL_MCP.md +198 -0
  5. aukeys_opscli-0.0.23/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze_mcp.py +663 -0
  6. aukeys_opscli-0.0.23/opscli/skills/templates/ops-dataset-query/scripts/chart_map_mcp.py +383 -0
  7. aukeys_opscli-0.0.23/opscli/skills/templates/ops-dataset-query/scripts/excel_export_mcp.py +367 -0
  8. aukeys_opscli-0.0.23/opscli/skills/templates/ops-dataset-query/scripts/query_mcp.py +583 -0
  9. aukeys_opscli-0.0.23/opscli/skills/templates/ops-dataset-query/scripts/updater_mcp.py +137 -0
  10. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/pyproject.toml +1 -1
  11. aukeys_opscli-0.0.22/docs/change-log-pending.md +0 -102
  12. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.agents/plugins/marketplace.json +0 -0
  13. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.agents/skills/super-dev/SKILL.md +0 -0
  14. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.agents/skills/super-dev-seeai/SKILL.md +0 -0
  15. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude/CLAUDE.md +0 -0
  16. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude/agents/super-dev.md +0 -0
  17. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude/commands/super-dev-seeai.md +0 -0
  18. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude/commands/super-dev.md +0 -0
  19. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude/settings.local.json +0 -0
  20. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude/skills/super-dev/SKILL.md +0 -0
  21. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude/skills/super-dev-seeai/SKILL.md +0 -0
  22. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.claude-plugin/marketplace.json +0 -0
  23. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.github/workflows/cross-platform-preflight.yml +0 -0
  24. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.gitignore +0 -0
  25. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/.super-dev/install-manifest.json +0 -0
  26. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/AGENTS.md +0 -0
  27. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/CLAUDE.md +0 -0
  28. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/README.md +0 -0
  29. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/README_MCP.md +0 -0
  30. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/analysis/amazon-monitor/346/216/245/345/205/245/345/210/206/346/236/220.md" +0 -0
  31. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/analysis//346/216/210/346/235/203/346/250/241/345/274/217/345/257/271/346/257/224/345/210/206/346/236/220/346/212/245/345/221/212.md" +0 -0
  32. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/AI/345/217/226/346/225/260/350/203/275/345/212/233/345/272/225/345/272/247/345/274/200/345/217/221/351/234/200/346/261/202.md" +0 -0
  33. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/CLI/345/212/250/346/200/201/346/250/241/345/235/227/345/212/240/350/275/275/346/224/271/351/200/240/345/256/236/346/226/275/346/226/271/346/241/210.md" +0 -0
  34. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/Skills/345/244/232/345/267/245/345/205/267/350/260/203/347/240/224/350/247/204/345/210/222.md" +0 -0
  35. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/amazon/345/273/272/350/241/250SQL/350/215/211/346/241/210/344/270/216ops API/350/257/267/346/261/202/344/275/223/345/256/232/344/271/211.md" +0 -0
  36. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/amazon/346/225/260/346/215/256/346/250/241/345/236/213/344/270/216API/351/242/204/347/225/231/346/226/271/346/241/210.md" +0 -0
  37. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/ops-amazon Skill/350/247/204/345/210/222/346/226/271/346/241/210.md" +0 -0
  38. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/opscli-session/345/205/261/347/224/250/346/200/247/345/210/206/346/236/220/344/270/216/344/274/230/345/214/226/346/226/271/346/241/210/346/212/245/345/221/212.md" +0 -0
  39. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/opscli/346/216/210/346/235/203/346/265/201/347/250/213/346/267/261/345/272/246/345/210/206/346/236/220.md" +0 -0
  40. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design/query/346/250/241/345/235/227/350/256/276/350/256/241.md" +0 -0
  41. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design//346/225/260/346/215/256/346/237/245/350/257/242/346/234/215/345/212/241/345/274/200/345/217/221/350/257/264/346/230/216/346/226/207/346/241/243.md" +0 -0
  42. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design//346/225/260/346/215/256/351/233/206/345/255/227/346/256/265/346/212/200/350/203/275/347/263/273/347/273/237/346/212/200/346/234/257/346/226/271/346/241/210.md" +0 -0
  43. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design//346/250/241/345/235/227/345/215/217/350/256/256/344/270/216/346/217/222/344/273/266/346/263/250/345/206/214/346/216/245/345/217/243/350/256/276/350/256/241.md" +0 -0
  44. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design//346/250/241/345/235/227/345/256/211/350/243/205/345/210/206/345/261/202/344/270/216/351/273/230/350/256/244/345/217/221/350/241/214/346/226/271/346/241/210.md" +0 -0
  45. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design//346/250/241/345/235/227/346/217/222/344/273/266/345/214/226/344/270/216/345/244/232/345/233/242/351/230/237/346/262/273/347/220/206/346/226/271/346/241/210.md" +0 -0
  46. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design//346/250/241/345/235/227/347/233/256/345/275/225/345/210/206/345/261/202/350/247/204/350/214/203.md" +0 -0
  47. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/design//351/200/232/347/224/250Skill/347/211/210/346/234/254/346/216/247/345/210/266/346/236/266/346/236/204.md" +0 -0
  48. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/guide/Skills/345/237/272/347/241/200/345/274/200/345/217/221/345/237/271/350/256/255/346/211/213/345/206/214.md" +0 -0
  49. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/guide/opscli/345/221/275/344/273/244/347/224/250/344/276/213/346/211/213/345/206/214.md" +0 -0
  50. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/guide//344/273/216/351/233/266/345/256/211/350/243/205/351/203/250/347/275/262/346/214/207/345/215/227.md" +0 -0
  51. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/guide//350/256/244/350/257/201/346/250/241/345/235/227/344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -0
  52. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/guide//350/267/250/345/271/263/345/217/260/345/217/221/345/270/203/345/211/215/346/243/200/346/237/245.md" +0 -0
  53. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans/2026-04-22-p1-contract-version-governance.md +0 -0
  54. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans/MCP/346/234/215/345/212/241/345/256/214/345/226/204/346/225/264/346/224/271/350/256/241/345/210/222/344/271/246.md" +0 -0
  55. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/345/211/251/344/275/231/344/273/273/345/212/241.md" +0 -0
  56. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/345/217/221/345/270/203/346/243/200/346/237/245/346/270/205/345/215/225.md" +0 -0
  57. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/345/274/200/345/217/221/350/256/241/345/210/222.md" +0 -0
  58. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/350/201/224/350/260/203/350/256/260/345/275/225.md" +0 -0
  59. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans//345/217/226/346/225/260/345/272/225/345/272/247/344/270/200/346/234/237/351/252/214/346/224/266/346/211/213/345/206/214.md" +0 -0
  60. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans//350/256/244/350/257/201/346/250/241/345/235/227/345/256/236/346/226/275/350/256/241/345/210/222.md" +0 -0
  61. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/plans//350/256/244/350/257/201/346/250/241/345/235/227/350/256/276/350/256/241/346/226/271/346/241/210.md" +0 -0
  62. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/release//345/244/232/345/214/205/345/217/221/345/270/203/344/270/216/350/201/232/345/220/210/345/217/221/350/241/214/347/255/226/347/225/245.md" +0 -0
  63. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/release//346/211/223/345/214/205/345/217/221/345/270/203/346/214/207/345/215/227.md" +0 -0
  64. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/spec/MCP/346/250/241/345/235/227/346/216/245/345/205/245/350/247/204/350/214/203.md" +0 -0
  65. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/docs/spec//345/274/200/345/217/221/350/247/204/350/214/203.md" +0 -0
  66. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/__init__.py +0 -0
  67. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/__init__.py +0 -0
  68. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/cli.py +0 -0
  69. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/client.py +0 -0
  70. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/commands/__init__.py +0 -0
  71. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/commands/cli.py +0 -0
  72. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/domain/__init__.py +0 -0
  73. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/domain/exceptions.py +0 -0
  74. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/domain/models.py +0 -0
  75. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/exceptions.py +0 -0
  76. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/manager.py +0 -0
  77. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/models.py +0 -0
  78. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/parser.py +0 -0
  79. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/scraper.py +0 -0
  80. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/scraping/__init__.py +0 -0
  81. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/scraping/parser.py +0 -0
  82. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/scraping/scraper.py +0 -0
  83. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/services/__init__.py +0 -0
  84. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/services/manager.py +0 -0
  85. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/transport/__init__.py +0 -0
  86. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/amazon/transport/client.py +0 -0
  87. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/__init__.py +0 -0
  88. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/cli.py +0 -0
  89. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/commands/__init__.py +0 -0
  90. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/commands/cli.py +0 -0
  91. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/config.py +0 -0
  92. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/core/__init__.py +0 -0
  93. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/core/device_flow.py +0 -0
  94. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/core/system_registry.py +0 -0
  95. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/core/token_manager.py +0 -0
  96. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/domain/__init__.py +0 -0
  97. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/domain/exceptions.py +0 -0
  98. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/exceptions.py +0 -0
  99. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/storage/__init__.py +0 -0
  100. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/storage/credential_store.py +0 -0
  101. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/auth/storage/crypto.py +0 -0
  102. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/cli.py +0 -0
  103. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/config.py +0 -0
  104. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/__init__.py +0 -0
  105. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/auth_middleware.py +0 -0
  106. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/cli.py +0 -0
  107. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/context.py +0 -0
  108. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/credential_cache.py +0 -0
  109. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/server.py +0 -0
  110. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/tools/__init__.py +0 -0
  111. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/tools/amazon.py +0 -0
  112. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/tools/auth.py +0 -0
  113. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/tools/chatgpt.py +0 -0
  114. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/tools/helpers.py +0 -0
  115. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/tools/query.py +0 -0
  116. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/tools/skills.py +0 -0
  117. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/mcp/user_store.py +0 -0
  118. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/__init__.py +0 -0
  119. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/cli.py +0 -0
  120. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/client.py +0 -0
  121. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/commands/__init__.py +0 -0
  122. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/commands/cli.py +0 -0
  123. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/domain/__init__.py +0 -0
  124. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/domain/exceptions.py +0 -0
  125. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/domain/models.py +0 -0
  126. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/exceptions.py +0 -0
  127. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/manager.py +0 -0
  128. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/models.py +0 -0
  129. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/services/__init__.py +0 -0
  130. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/transport/__init__.py +0 -0
  131. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/query/transport/client.py +0 -0
  132. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/__init__.py +0 -0
  133. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/cli.py +0 -0
  134. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/commands/__init__.py +0 -0
  135. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/commands/cli.py +0 -0
  136. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/detector.py +0 -0
  137. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/discovery/__init__.py +0 -0
  138. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/discovery/detector.py +0 -0
  139. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/domain/__init__.py +0 -0
  140. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/domain/exceptions.py +0 -0
  141. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/domain/models.py +0 -0
  142. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/exceptions.py +0 -0
  143. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/manager.py +0 -0
  144. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/models.py +0 -0
  145. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/services/__init__.py +0 -0
  146. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/services/manager.py +0 -0
  147. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/sync/__init__.py +0 -0
  148. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/sync/updater.py +0 -0
  149. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-amazon/SKILL.md +0 -0
  150. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-amazon/SKILL_MCP.md +0 -0
  151. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-amazon/data/VERSION.json +0 -0
  152. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-auth/SKILL.md +0 -0
  153. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-auth/SKILL_MCP.md +0 -0
  154. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-auth/data/VERSION.json +0 -0
  155. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/SKILL.md +0 -0
  156. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/data/VERSION.json +0 -0
  157. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/data/dataset_fields.csv +0 -0
  158. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/data/datasets.csv +0 -0
  159. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/data/query_metadata.json +0 -0
  160. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/references/data-query-service-dev-guide.md +0 -0
  161. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze.py +0 -0
  162. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/scripts/chart_map.py +0 -0
  163. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/scripts/core.py +0 -0
  164. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/scripts/excel_export.py +0 -0
  165. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/scripts/query.py +0 -0
  166. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/scripts/search.py +0 -0
  167. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-dataset-query/scripts/updater.py +0 -0
  168. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-mcp/SKILL.md +0 -0
  169. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-mcp/data/VERSION.json +0 -0
  170. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-skills/SKILL.md +0 -0
  171. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/templates/ops-skills/data/VERSION.json +0 -0
  172. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/skills/updater.py +0 -0
  173. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/opscli/version.py +0 -0
  174. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/amazon-payload-sample-shell.json +0 -0
  175. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/amazon-payload-sample.json +0 -0
  176. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/amazon-scrape-sample-shell.json +0 -0
  177. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/amazon-scrape-sample.json +0 -0
  178. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/amazon-search-sample-shell.json +0 -0
  179. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/amazon-search-sample.json +0 -0
  180. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/maintenance/host-onboard-smoke-20260423-082206.json +0 -0
  181. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/maintenance/host-onboard-smoke-20260423-082206.md +0 -0
  182. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/SKILL.md +0 -0
  183. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/code_analysis.json +0 -0
  184. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/config_patterns/config_patterns.json +0 -0
  185. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/config_patterns/config_patterns.md +0 -0
  186. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/dependencies/dependency_graph.dot +0 -0
  187. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/dependencies/dependency_graph.json +0 -0
  188. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/dependencies/dependency_graph.mmd +0 -0
  189. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/dependencies/statistics.json +0 -0
  190. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/documentation/documentation_index.json +0 -0
  191. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/documentation/extraction_summary.json +0 -0
  192. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/output/opscli-codebase/references/documentation/templates/SKILL.md +0 -0
  193. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-claude/.claude-plugin/plugin.json +0 -0
  194. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-claude/README.md +0 -0
  195. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-claude/skills/super-dev/SKILL.md +0 -0
  196. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-claude/skills/super-dev-seeai/SKILL.md +0 -0
  197. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-codex/.codex-plugin/plugin.json +0 -0
  198. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-codex/README.md +0 -0
  199. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-codex/skills/super-dev/SKILL.md +0 -0
  200. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/plugins/super-dev-codex/skills/super-dev-seeai/SKILL.md +0 -0
  201. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/publish.sh +0 -0
  202. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/scripts/release_preflight.py +0 -0
  203. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/__init__.py +0 -0
  204. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/amazon/__init__.py +0 -0
  205. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/amazon/test_cli.py +0 -0
  206. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/amazon/test_client.py +0 -0
  207. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/amazon/test_manager.py +0 -0
  208. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/amazon/test_parser.py +0 -0
  209. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/auth/__init__.py +0 -0
  210. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/auth/test_credential_store.py +0 -0
  211. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/auth/test_crypto.py +0 -0
  212. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/auth/test_device_flow.py +0 -0
  213. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/auth/test_system_registry.py +0 -0
  214. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/auth/test_token_manager.py +0 -0
  215. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/benchmark_credential_read.py +0 -0
  216. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/__init__.py +0 -0
  217. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/conftest.py +0 -0
  218. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/test_cli.py +0 -0
  219. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/test_context.py +0 -0
  220. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/test_credential_cache.py +0 -0
  221. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/test_multi_user_isolation.py +0 -0
  222. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/test_tools.py +0 -0
  223. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/mcp/test_user_store.py +0 -0
  224. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/query/test_cli.py +0 -0
  225. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/query/test_client.py +0 -0
  226. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/query/test_manager.py +0 -0
  227. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/skills/__init__.py +0 -0
  228. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/skills/test_cli.py +0 -0
  229. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/skills/test_detector.py +0 -0
  230. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/skills/test_manager.py +0 -0
  231. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/skills/test_ops_dataset_query_search.py +0 -0
  232. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/skills/test_updater.py +0 -0
  233. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/test_session_sharing.py +0 -0
  234. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/tests/test_version_consistency.py +0 -0
  235. {aukeys_opscli-0.0.22 → aukeys_opscli-0.0.23}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aukeys-opscli
3
- Version: 0.0.22
3
+ Version: 0.0.23
4
4
  Summary: Aukeys 运营 CLI 工具集
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: cryptography>=38
@@ -0,0 +1,76 @@
1
+ # 待归档变更记录
2
+
3
+ ## 2026-04-27 opscli - 新增 chart_analyze_mcp.py
4
+
5
+ **变更原因**:为 ops-dataset-query Skill 新增 MCP 无状态模式的图表异常检测脚本,原 `chart_analyze.py` 依赖 `opscli` CLI(subprocess),无法在纯 MCP 环境中使用。
6
+
7
+ **改动点**:
8
+ - 新增 `opscli/skills/templates/ops-dataset-query/scripts/chart_analyze_mcp.py`
9
+ - 移除所有 `subprocess` 调用 `opscli` 的逻辑
10
+ - 数据获取改为纯文件输入(`--input` / `--dc-input`),由 MCP Agent 预先通过 `query_chart` / `query_build_and_run` Tool 获取后传入
11
+ - 移除自动 `upgrade` 兜底,改为返回错误并提示调用 MCP `skills_upgrade`
12
+ - 文件头部添加详细 MCP 调用指南注释(含前置 session 检查、Tool 调用示例、dataComparison 用法)
13
+ - 核心异常检测逻辑(5 类规则)与 `chart_analyze.py` 完全一致
14
+
15
+ **验证结果**:`python -m py_compile` 语法检查通过
16
+
17
+ **影响范围**:不影响现有 `chart_analyze.py`,为 MCP 环境提供独立入口
18
+
19
+ **回滚方式**:删除 `chart_analyze_mcp.py` 即可
20
+
21
+ ---
22
+
23
+ ## 2026-04-27 opscli - 新增 chart_map_mcp.py / excel_export_mcp.py / query_mcp.py / updater_mcp.py
24
+
25
+ **变更原因**:为 ops-dataset-query Skill 的 4 个核心脚本创建 MCP 无状态模式版本,原脚本均依赖 opscli CLI(subprocess 或直接导入内部模块),无法在纯 MCP 环境中使用。
26
+
27
+ ### chart_map_mcp.py
28
+ - 新增 `opscli/skills/templates/ops-dataset-query/scripts/chart_map_mcp.py`
29
+ - 移除 `subprocess` 调用 `opscli query chart`(原 `--uuid`/`--run` 参数)
30
+ - 移除 `_try_upgrade()` 自动升级逻辑,映射失败时提示调用 MCP `skills_upgrade`
31
+ - 数据入口改为纯 `--input` 文件(由 MCP `query_chart` 获取后保存)
32
+ - 保留核心映射函数:`discover_data_dir`、`load_local_index`、`map_chart_queries`、`map_query_results`
33
+
34
+ ### excel_export_mcp.py
35
+ - 新增 `opscli/skills/templates/ops-dataset-query/scripts/excel_export_mcp.py`
36
+ - 不再从 `chart_analyze.py` 导入 CLI 函数(`_check_mapping_hit`、`_try_upgrade`、`load_chart_data`)
37
+ - 自行实现文件版 `load_chart_data()` 和 `_check_mapping_hit()`
38
+ - 移除 `--uuid` 和 `--no-auto-upgrade` 参数
39
+ - 保留 Excel 导出核心逻辑:样式、行列类型判断、百分比列识别、列宽自适应
40
+
41
+ ### query_mcp.py
42
+ - 新增 `opscli/skills/templates/ops-dataset-query/scripts/query_mcp.py`
43
+ - 原 `query.py` 为纯 opscli 转发脚本(`subprocess` 调用 CLI),MCP 模式下无直接价值
44
+ - 改造为**本地 Payload 构造器**:使用本地 CSV 索引实现字段别名解析(`global_alias > field_name > verbose_name`),构造标准 query payload JSON
45
+ - 支持 `build` 子命令(dimensions/metrics/where/order_by/limit/offset/data_comparison)和 `metadata` 子命令
46
+ - 输出 payload JSON 文件,供 MCP `query_run` Tool 使用
47
+ - 实现字段歧义自动消歧(`_pick_primary_field`,优先选取原始字段)
48
+
49
+ ### updater_mcp.py
50
+ - 新增 `opscli/skills/templates/ops-dataset-query/scripts/updater_mcp.py`
51
+ - 移除对 `opscli.skills.models.SkillRecord` 和 `opscli.skills.updater.SkillsUpdater` 的依赖
52
+ - 改为仅检查本地 `VERSION.json` 和数据文件(`datasets.csv`、`dataset_fields.csv`、`query_metadata.json`)完整性的轻量脚本
53
+ - 更新操作提示通过 MCP `skills_upgrade` Tool 执行
54
+
55
+ **验证结果**:`python -m py_compile` 语法检查全部通过(4/4)
56
+
57
+ **影响范围**:不影响现有 CLI 版本脚本,为 MCP 环境提供独立入口
58
+
59
+ **回滚方式**:删除 4 个 `*_mcp.py` 文件即可
60
+
61
+ ---
62
+
63
+ ## 2026-04-27 opscli - 更新 SKILL_MCP.md 文档
64
+
65
+ **变更原因**:将新增的 5 个 MCP 版本脚本(`query_mcp.py`、`chart_map_mcp.py`、`chart_analyze_mcp.py`、`excel_export_mcp.py`、`updater_mcp.py`)的调用方式及用法补充到 SKILL_MCP.md 中,方便 MCP Agent 查阅。
66
+
67
+ **改动点**:
68
+ - 在 `opscli/skills/templates/ops-dataset-query/SKILL_MCP.md` 的"辅助脚本"章节中新增"MCP 环境辅助脚本"小节
69
+ - 每个脚本包含:功能说明、用法示例、输入来源(对应哪个 MCP Tool)、输出格式
70
+ - `query_mcp.py` 单独说明与 `query_run` Tool 的配合使用流程
71
+ - `chart_analyze_mcp.py` 包含 5 类异常检测规则速查表
72
+ - `excel_export_mcp.py` 包含格式规范说明
73
+
74
+ **影响范围**:仅文档更新,不影响代码
75
+
76
+ **回滚方式**:回退 SKILL_MCP.md 修改即可
@@ -447,13 +447,25 @@ class QueryManager:
447
447
  raise InvalidPayloadError(f"无效的 --dimension 定义: {raw}")
448
448
 
449
449
  def _parse_metric_spec(self, raw: str) -> _FieldSpec:
450
- """解析指标定义:field_name:aggregation[:alias]。"""
450
+ """解析指标定义:field_name[:aggregation[:alias]]
451
+
452
+ 支持三种格式:
453
+ - field_name 公式字段(has_formula_config=1),由 _resolve_metric_expr 自动使用 summary_expression
454
+ - field_name:aggregation 普通聚合字段
455
+ - field_name:aggregation:alias 普通聚合字段 + 自定义别名
456
+ - field_name::alias 公式字段 + 自定义别名(aggregation 留空)
457
+ """
451
458
  parts = [item.strip() for item in raw.split(":")]
459
+ # 仅有字段名:公式字段,aggregation=None 由 _resolve_metric_expr 处理
460
+ if len(parts) == 1 and parts[0]:
461
+ return _FieldSpec(field_name=parts[0], aggregation=None, alias=None)
452
462
  if len(parts) == 2 and parts[0] and parts[1]:
453
463
  return _FieldSpec(field_name=parts[0], aggregation=parts[1].upper(), alias=None)
454
- if len(parts) == 3 and parts[0] and parts[1] and parts[2]:
455
- return _FieldSpec(field_name=parts[0], aggregation=parts[1].upper(), alias=parts[2])
456
- raise InvalidPayloadError(f"无效的 --metric 定义: {raw}")
464
+ if len(parts) == 3 and parts[0] and parts[2]:
465
+ # 第二段为空时表示公式字段 + 自定义别名(如 gross_profit_percent::gpp)
466
+ agg = parts[1].upper() if parts[1] else None
467
+ return _FieldSpec(field_name=parts[0], aggregation=agg, alias=parts[2])
468
+ raise InvalidPayloadError(f"无效的 --metric 定义: {raw},格式: field_name[:aggregation[:alias]]")
457
469
 
458
470
  def _build_order_by(self, items: list[str], *, alias_map: dict[str, str] | None = None) -> list[dict]:
459
471
  """解析排序定义:expr[:asc|desc],自动映射到 select 输出别名。"""
@@ -511,8 +523,25 @@ class QueryManager:
511
523
  raise InvalidPayloadError("where 必须是 JSON 对象")
512
524
  return payload
513
525
 
526
+ # 操作符标准化映射:将 Python/SQL 风格符号转换为服务端语义操作符
527
+ _WHERE_OP_MAP: dict[str, str] = {
528
+ ">=": "gte",
529
+ "<=": "lte",
530
+ ">": "gt",
531
+ "<": "lt",
532
+ "=": "eq",
533
+ "==": "eq",
534
+ "!=": "neq",
535
+ "<>": "neq",
536
+ }
537
+
514
538
  def _parse_where_condition(self, raw: str, *, dataset_alias: str) -> dict:
515
- """解析 where 简写条件:field|operator|value_json。"""
539
+ """解析 where 简写条件:field|operator|value_json。
540
+
541
+ 操作符支持两种写法:
542
+ - 语义操作符(服务端原生):between, eq, neq, gt, gte, lt, lte, in
543
+ - 符号操作符(自动转换):>=, <=, >, <, =, ==, !=, <>
544
+ """
516
545
  parts = raw.split("|", 2)
517
546
  if len(parts) != 3:
518
547
  raise InvalidPayloadError(f"无效的 --where 定义: {raw}")
@@ -521,6 +550,9 @@ class QueryManager:
521
550
  if not field or not operator or not value_raw:
522
551
  raise InvalidPayloadError(f"无效的 --where 定义: {raw}")
523
552
 
553
+ # 将符号操作符标准化为服务端语义操作符
554
+ operator = self._WHERE_OP_MAP.get(operator, operator)
555
+
524
556
  expr = field if "." in field else f"{dataset_alias}.{field}"
525
557
  try:
526
558
  value = json.loads(value_raw)
@@ -182,6 +182,204 @@ print(format_pct(pct)) # +23.46%
182
182
 
183
183
  ---
184
184
 
185
+ ### MCP 环境辅助脚本(无状态模式,不依赖 opscli)
186
+
187
+ 以下脚本位于 `scripts/` 目录,**专为 MCP 无状态模式设计**,零 opscli 依赖,仅通过文件输入/输出与 MCP Tool 配合。
188
+
189
+ #### `query_mcp.py` — 本地 Payload 构造器
190
+
191
+ 使用本地 CSV 索引将简化参数转换为标准 query payload JSON 文件,供 `query_run` 使用。
192
+
193
+ **特点**:
194
+ - 字段别名解析(`global_alias > field_name > verbose_name`)
195
+ - 字段歧义自动消歧(优先选取原始字段)
196
+ - 支持 `data_comparison` 自动构造 `dataComparison` 对象
197
+
198
+ **子命令**:
199
+
200
+ ```bash
201
+ # build:构造 payload 并写入 JSON 文件
202
+ python scripts/query_mcp.py build \
203
+ --dataset sales_order_d \
204
+ --dimension date_id \
205
+ --metric "order_cost:sum:total_cost" \
206
+ --where "date_id|>=|\"2024-01-01\"" \
207
+ --order-by "total_cost:desc" \
208
+ --output /tmp/query.json
209
+
210
+ # 附带 dataComparison 环比
211
+ python scripts/query_mcp.py build \
212
+ --dataset sales_order_d \
213
+ --dimension dept_name \
214
+ --metric "price:sum:total_price" \
215
+ --where "date_id|>=|\"2026-04-01\"" \
216
+ --data-comparison "date_id,2026-03-01,2026-03-22" \
217
+ --output /tmp/query.json
218
+
219
+ # metadata:查看本地数据集 metadata(无需认证)
220
+ python scripts/query_mcp.py metadata --dataset sales_order_d --pretty
221
+ ```
222
+
223
+ **输出**(`build` 成功时):
224
+ ```json
225
+ {
226
+ "success": true,
227
+ "data": {
228
+ "output": "/tmp/query.json",
229
+ "payload": {
230
+ "tableId": 1,
231
+ "query": {
232
+ "select": [...],
233
+ "groupBy": [...],
234
+ "where": {...},
235
+ "orderBy": [...],
236
+ "limit": 20,
237
+ "offset": 0
238
+ }
239
+ }
240
+ }
241
+ }
242
+ ```
243
+
244
+ **配合 MCP Tool 使用**:
245
+ ```python
246
+ # 1. 先用 query_mcp.py 构造 payload JSON(无需认证)
247
+ # 2. 再通过 query_run 执行查询(需要认证)
248
+ query_run(
249
+ payload_path="/tmp/query.json",
250
+ session_id="860b0636485b5188a2b9b4ed5210e736"
251
+ )
252
+ ```
253
+
254
+ ---
255
+
256
+ #### `chart_map_mcp.py` — chart 字段映射
257
+
258
+ 将 MCP `query_chart` 返回的 chart 结果中的 `global_alias` 映射为可读的 `verbose_name` / `field_name`。
259
+
260
+ **用法**:
261
+ ```bash
262
+ # 仅映射查询结构
263
+ python scripts/chart_map_mcp.py --input /tmp/chart_result.json --pretty
264
+
265
+ # 映射查询结构 + 结果行数据列名
266
+ python scripts/chart_map_mcp.py --input /tmp/chart_result.json --map-results --pretty
267
+
268
+ # 映射为 field_name
269
+ python scripts/chart_map_mcp.py --input /tmp/chart_result.json --map-to field_name --pretty
270
+ ```
271
+
272
+ **输入来源**:先通过 MCP `query_chart` 获取并保存为 JSON:
273
+ ```python
274
+ query_chart(
275
+ chart_uuid="4NQ5f66sU9",
276
+ run=True,
277
+ session_id="860b0636485b5188a2b9b4ed5210e736"
278
+ )
279
+ # → 保存到 /tmp/chart_result.json
280
+ ```
281
+
282
+ **输出**:每条 query 添加 `_mapping` 字段,包含 `dataset_alias`、`dataset_info`、`field_mappings`(含 `alias`、`expr`、`mapped_name`、`field_info`)。
283
+
284
+ ---
285
+
286
+ #### `chart_analyze_mcp.py` — 图表异常检测
287
+
288
+ 对 chart 查询结果执行 5 类异常规则检测,输出结构化 JSON 报告。
289
+
290
+ **用法**:
291
+ ```bash
292
+ # 仅分析当期数据
293
+ python scripts/chart_analyze_mcp.py --input /tmp/chart_result.json --pretty
294
+
295
+ # 附带 dataComparison 环比数据(增强趋势检测)
296
+ python scripts/chart_analyze_mcp.py \
297
+ --input /tmp/chart_result.json \
298
+ --dc-input /tmp/dc_result.json \
299
+ --pretty
300
+ ```
301
+
302
+ **输入来源**:
303
+ - `--input`:MCP `query_chart(chart_uuid="...", run=True)` 结果
304
+ - `--dc-input`:MCP `query_build_and_run(..., data_comparison="...")` 结果
305
+
306
+ **检测规则**:
307
+ | 规则 | 触发条件 |
308
+ |------|---------|
309
+ | `negative_margin` | 毛利率 < 0 |
310
+ | `profit_drop` | 毛利环比下降 > 30% |
311
+ | `revenue_cliff` | 原价金额环比下降 > 20% |
312
+ | `ad_roi_decline` | 广告费上升 + 毛利下降 |
313
+ | `zero_orders` | 当期订单量归零(对比期 > 0) |
314
+
315
+ **输出**:包含 `summary`(汇总统计)、`anomalies`(异常列表,按 severity 排序)、`findings`(人类可读关键发现)。
316
+
317
+ ---
318
+
319
+ #### `excel_export_mcp.py` — 图表数据 Excel 导出
320
+
321
+ 从 chart 查询结果中提取明细、小计、总计数据,按透视表格式写入 Excel。
322
+
323
+ **前置依赖**:`pip install openpyxl`
324
+
325
+ **用法**:
326
+ ```bash
327
+ python scripts/excel_export_mcp.py \
328
+ --input /tmp/chart_result.json \
329
+ --output /tmp/output.xlsx \
330
+ --sheet-name 销售数据
331
+ ```
332
+
333
+ **格式规范**:
334
+ - 表头:蓝色背景(4472C4)白色粗体字,冻结首行
335
+ - 明细行:数值列千分位格式,百分比列 0.00% 格式
336
+ - 小计行:灰色背景(D9E2F3),粗体字
337
+ - 总计行:深蓝背景白色粗体字
338
+ - 负值:红色字体(FF0000)
339
+ - 列宽:自适应(最大 50 字符)
340
+
341
+ **输出**:
342
+ ```json
343
+ {
344
+ "success": true,
345
+ "output": "/tmp/output.xlsx",
346
+ "rows": 150,
347
+ "columns": ["日期", "部门", "销售额", "订单量"]
348
+ }
349
+ ```
350
+
351
+ ---
352
+
353
+ #### `updater_mcp.py` — 本地状态检查
354
+
355
+ 检查本地数据文件完整性,更新操作需通过 MCP `skills_upgrade` 执行。
356
+
357
+ **用法**:
358
+ ```bash
359
+ python scripts/updater_mcp.py --check --pretty
360
+ ```
361
+
362
+ **输出**:
363
+ ```json
364
+ {
365
+ "success": true,
366
+ "data": {
367
+ "data_dir": "/Users/mask/.config/opencode/skills/ops-dataset-query/data",
368
+ "version": "v1.2.3",
369
+ "healthy": true,
370
+ "files": {
371
+ "VERSION.json": {"exists": true, "version": "v1.2.3"},
372
+ "datasets.csv": {"exists": true, "size": 12345},
373
+ "dataset_fields.csv": {"exists": true, "size": 67890},
374
+ "query_metadata.json": {"exists": true, "size": 4567}
375
+ }
376
+ },
377
+ "mcp_hint": "如需更新,调用 skills_upgrade(name='ops-dataset-query')"
378
+ }
379
+ ```
380
+
381
+ ---
382
+
185
383
  ## MCP Tool 调用参考
186
384
 
187
385
  ### `query_metadata`