aukeys-opscli 0.0.26__tar.gz → 0.0.29__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 (375) hide show
  1. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/PKG-INFO +1 -1
  2. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/change-log-pending.md +0 -69
  3. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/services/manager.py +16 -72
  4. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/commands/cli.py +2 -5
  5. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/version.py +1 -1
  6. aukeys_opscli-0.0.29/publish.sh +272 -0
  7. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/pyproject.toml +1 -1
  8. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/query/test_manager.py +4 -15
  9. aukeys_opscli-0.0.26/docs/design/1.md +0 -422
  10. aukeys_opscli-0.0.26/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/query-essential-guide.md +0 -149
  11. aukeys_opscli-0.0.26/opscli/skills/templates/ops-asin-health-diagnoser/references/query-essential-guide.md +0 -149
  12. aukeys_opscli-0.0.26/opscli/skills/templates/ops-competitive-intelligence-analyst/references/query-essential-guide.md +0 -149
  13. aukeys_opscli-0.0.26/opscli/skills/templates/ops-cross-border-product-selector/references/query-essential-guide.md +0 -149
  14. aukeys_opscli-0.0.26/opscli/skills/templates/ops-inventory-health-monitor/references/query-essential-guide.md +0 -149
  15. aukeys_opscli-0.0.26/opscli/skills/templates/ops-perspective-builder/references/query-essential-guide.md +0 -149
  16. aukeys_opscli-0.0.26/opscli/skills/templates/ops-product-attribute-analyzer/references/query-essential-guide.md +0 -149
  17. aukeys_opscli-0.0.26/opscli/skills/templates/ops-profit-structure-analyzer/references/query-essential-guide.md +0 -149
  18. aukeys_opscli-0.0.26/opscli/skills/templates/ops-refund-priority-matrix/references/query-essential-guide.md +0 -149
  19. aukeys_opscli-0.0.26/publish.sh +0 -94
  20. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.agents/plugins/marketplace.json +0 -0
  21. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.agents/skills/super-dev/SKILL.md +0 -0
  22. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.agents/skills/super-dev-seeai/SKILL.md +0 -0
  23. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/CLAUDE.md +0 -0
  24. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/agents/super-dev.md +0 -0
  25. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/commands/super-dev-seeai.md +0 -0
  26. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/commands/super-dev.md +0 -0
  27. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/settings.local.json +0 -0
  28. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/skills/super-dev/SKILL.md +0 -0
  29. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude/skills/super-dev-seeai/SKILL.md +0 -0
  30. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.claude-plugin/marketplace.json +0 -0
  31. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.github/workflows/cross-platform-preflight.yml +0 -0
  32. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.gitignore +0 -0
  33. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/.super-dev/install-manifest.json +0 -0
  34. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/AGENTS.md +0 -0
  35. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/CLAUDE.md +0 -0
  36. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/README.md +0 -0
  37. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/README_MCP.md +0 -0
  38. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis/Skill/346/226/271/346/263/225/350/256/272/346/267/261/345/272/246/345/210/206/346/236/220/344/270/216/346/225/260/346/215/256/351/233/206/350/236/215/345/220/210/345/244/215/347/224/250/346/226/271/346/241/210.md" +0 -0
  39. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis/amazon-monitor/346/216/245/345/205/245/345/210/206/346/236/220.md" +0 -0
  40. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis/opscli/347/263/273/347/273/237/346/236/266/346/236/204/345/210/206/346/236/220/346/212/245/345/221/212.md" +0 -0
  41. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis//344/272/232/351/251/254/351/200/212/344/272/247/345/223/201/345/205/250/347/273/264/345/210/206/346/236/220/344/275/223/347/263/273_v1.md" +0 -0
  42. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/analysis//344/272/232/351/251/254/351/200/212/344/272/247/345/223/201/345/205/250/347/273/264/345/210/206/346/236/220/344/275/223/347/263/273_/347/254/254/344/270/200/346/255/245/351/200/217/350/247/206/345/233/276/346/236/204/345/273/272/346/226/271/346/241/210.md" +0 -0
  43. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  44. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  45. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  46. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  47. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  48. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  49. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/ops-amazon Skill/350/247/204/345/210/222/346/226/271/346/241/210.md" +0 -0
  50. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  51. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  52. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/design/query/346/250/241/345/235/227/350/256/276/350/256/241.md" +0 -0
  53. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  54. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  55. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  56. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  57. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  58. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  59. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  60. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide/MCP/345/267/245/345/205/267/344/275/277/347/224/250/346/211/213/345/206/214.md" +0 -0
  61. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  62. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/guide/opscli/345/221/275/344/273/244/347/224/250/344/276/213/346/211/213/345/206/214.md" +0 -0
  63. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  64. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  65. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  66. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/plans/2026-04-22-p1-contract-version-governance.md +0 -0
  67. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  68. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  69. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  70. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  71. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  72. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  73. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  74. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  75. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/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
  76. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/release//346/211/223/345/214/205/345/217/221/345/270/203/346/214/207/345/215/227.md" +0 -0
  77. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/01-asin-health-diagnoser.md +0 -0
  78. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/02-profit-structure-analyzer.md +0 -0
  79. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/03-refund-priority-matrix.md +0 -0
  80. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/04-product-attribute-analyzer.md +0 -0
  81. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/05-advertising-efficiency-optimizer.md +0 -0
  82. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/06-inventory-health-monitor.md +0 -0
  83. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/07-ops-perspective-builder.md +0 -0
  84. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/08-competitive-intelligence-analyst.md +0 -0
  85. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/09-cross-border-product-selector.md +0 -0
  86. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/skills/README.md +0 -0
  87. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/spec/MCP/346/250/241/345/235/227/346/216/245/345/205/245/350/247/204/350/214/203.md" +0 -0
  88. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/docs/spec//345/274/200/345/217/221/350/247/204/350/214/203.md" +0 -0
  89. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/__init__.py +0 -0
  90. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/__init__.py +0 -0
  91. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/cli.py +0 -0
  92. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/client.py +0 -0
  93. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/commands/__init__.py +0 -0
  94. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/commands/cli.py +0 -0
  95. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/domain/__init__.py +0 -0
  96. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/domain/exceptions.py +0 -0
  97. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/domain/models.py +0 -0
  98. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/exceptions.py +0 -0
  99. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/manager.py +0 -0
  100. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/models.py +0 -0
  101. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/parser.py +0 -0
  102. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraper.py +0 -0
  103. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraping/__init__.py +0 -0
  104. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraping/parser.py +0 -0
  105. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/scraping/scraper.py +0 -0
  106. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/services/__init__.py +0 -0
  107. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/services/manager.py +0 -0
  108. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/transport/__init__.py +0 -0
  109. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/amazon/transport/client.py +0 -0
  110. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/__init__.py +0 -0
  111. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/cli.py +0 -0
  112. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/commands/__init__.py +0 -0
  113. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/commands/cli.py +0 -0
  114. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/config.py +0 -0
  115. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/__init__.py +0 -0
  116. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/device_flow.py +0 -0
  117. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/system_registry.py +0 -0
  118. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/core/token_manager.py +0 -0
  119. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/domain/__init__.py +0 -0
  120. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/domain/exceptions.py +0 -0
  121. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/exceptions.py +0 -0
  122. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/storage/__init__.py +0 -0
  123. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/storage/credential_store.py +0 -0
  124. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/auth/storage/crypto.py +0 -0
  125. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/cli.py +0 -0
  126. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/config.py +0 -0
  127. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/__init__.py +0 -0
  128. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/auth_middleware.py +0 -0
  129. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/cli.py +0 -0
  130. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/context.py +0 -0
  131. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/credential_cache.py +0 -0
  132. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/server.py +0 -0
  133. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/__init__.py +0 -0
  134. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/amazon.py +0 -0
  135. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/auth.py +0 -0
  136. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/chatgpt.py +0 -0
  137. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/helpers.py +0 -0
  138. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/query.py +0 -0
  139. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/tools/skills.py +0 -0
  140. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/mcp/user_store.py +0 -0
  141. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/__init__.py +0 -0
  142. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/cli.py +0 -0
  143. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/client.py +0 -0
  144. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/commands/__init__.py +0 -0
  145. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/commands/cli.py +0 -0
  146. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/domain/__init__.py +0 -0
  147. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/domain/exceptions.py +0 -0
  148. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/domain/models.py +0 -0
  149. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/exceptions.py +0 -0
  150. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/manager.py +0 -0
  151. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/models.py +0 -0
  152. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/services/__init__.py +0 -0
  153. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/transport/__init__.py +0 -0
  154. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/query/transport/client.py +0 -0
  155. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/__init__.py +0 -0
  156. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/exceptions.py +0 -0
  157. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/http.py +0 -0
  158. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/shared/logging.py +0 -0
  159. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/__init__.py +0 -0
  160. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/cli.py +0 -0
  161. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/commands/__init__.py +0 -0
  162. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/detector.py +0 -0
  163. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/discovery/__init__.py +0 -0
  164. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/discovery/detector.py +0 -0
  165. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/domain/__init__.py +0 -0
  166. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/domain/exceptions.py +0 -0
  167. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/domain/models.py +0 -0
  168. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/exceptions.py +0 -0
  169. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/manager.py +0 -0
  170. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/models.py +0 -0
  171. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/services/__init__.py +0 -0
  172. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/services/manager.py +0 -0
  173. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/sync/__init__.py +0 -0
  174. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/sync/updater.py +0 -0
  175. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/SKILL.md +0 -0
  176. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/data/VERSION.json +0 -0
  177. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/ads_metrics_guide.md +0 -0
  178. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/campaign_optimization_playbook.md +0 -0
  179. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/cli.md +0 -0
  180. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/data-query-service-dev-guide.md +0 -0
  181. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/dataset_fields_mapping.md +0 -0
  182. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/references/mcp.md +0 -0
  183. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/ads_budget_allocator.py +0 -0
  184. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/ads_budget_allocator_mcp.py +0 -0
  185. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/analyze_ads_efficiency.py +0 -0
  186. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/analyze_ads_efficiency_mcp.py +0 -0
  187. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/calculate_roas_acos.py +0 -0
  188. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/calculate_roas_acos_mcp.py +0 -0
  189. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-advertising-efficiency-optimizer/scripts/core.py +0 -0
  190. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/SKILL.md +0 -0
  191. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/data/VERSION.json +0 -0
  192. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/references/cli.md +0 -0
  193. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-amazon/references/mcp.md +0 -0
  194. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/SKILL.md +0 -0
  195. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/data/VERSION.json +0 -0
  196. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/cli.md +0 -0
  197. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/data-query-service-dev-guide.md +0 -0
  198. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/dataset_fields_mapping.md +0 -0
  199. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/mcp.md +0 -0
  200. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/references/threshold_reference.md +0 -0
  201. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/scripts/calculate_health_score.py +0 -0
  202. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/scripts/calculate_health_score_mcp.py +0 -0
  203. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-asin-health-diagnoser/scripts/core.py +0 -0
  204. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/SKILL.md +0 -0
  205. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/data/VERSION.json +0 -0
  206. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/references/cli.md +0 -0
  207. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-auth/references/mcp.md +0 -0
  208. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/SKILL.md +0 -0
  209. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/data/VERSION.json +0 -0
  210. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/cli.md +0 -0
  211. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/data-query-service-dev-guide.md +0 -0
  212. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/dataset_fields_mapping.md +0 -0
  213. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/mcp.md +0 -0
  214. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/references/porter_template.md +0 -0
  215. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/scripts/competitive_analysis.py +0 -0
  216. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/scripts/competitive_analysis_mcp.py +0 -0
  217. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-competitive-intelligence-analyst/scripts/core.py +0 -0
  218. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/SKILL.md +0 -0
  219. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/data/VERSION.json +0 -0
  220. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/bsr_filtering_rules.md +0 -0
  221. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/cli.md +0 -0
  222. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/data-query-service-dev-guide.md +0 -0
  223. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/dataset_fields_mapping.md +0 -0
  224. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/mcp.md +0 -0
  225. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/references/quadrant_matrix_guide.md +0 -0
  226. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/scripts/core.py +0 -0
  227. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/scripts/product_selector.py +0 -0
  228. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-cross-border-product-selector/scripts/product_selector_mcp.py +0 -0
  229. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/SKILL.md +0 -0
  230. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/VERSION.json +0 -0
  231. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/dataset_fields.csv +0 -0
  232. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/datasets.csv +0 -0
  233. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/data/query_metadata.json +0 -0
  234. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/references/cli.md +0 -0
  235. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/references/data-query-service-dev-guide.md +0 -0
  236. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/references/mcp.md +0 -0
  237. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze.py +0 -0
  238. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_analyze_mcp.py +0 -0
  239. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_map.py +0 -0
  240. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/chart_map_mcp.py +0 -0
  241. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/core.py +0 -0
  242. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/excel_export.py +0 -0
  243. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/excel_export_mcp.py +0 -0
  244. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/query.py +0 -0
  245. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/query_mcp.py +0 -0
  246. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/search.py +0 -0
  247. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/updater.py +0 -0
  248. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-dataset-query/scripts/updater_mcp.py +0 -0
  249. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/SKILL.md +0 -0
  250. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/data/VERSION.json +0 -0
  251. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/cli.md +0 -0
  252. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/data-query-service-dev-guide.md +0 -0
  253. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/dataset_fields_mapping.md +0 -0
  254. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/inventory_thresholds.md +0 -0
  255. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/mcp.md +0 -0
  256. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/references/replenishment_formula.md +0 -0
  257. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/calculate_inventory_health.py +0 -0
  258. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/calculate_inventory_health_mcp.py +0 -0
  259. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/core.py +0 -0
  260. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/generate_replenishment_plan.py +0 -0
  261. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-inventory-health-monitor/scripts/generate_replenishment_plan_mcp.py +0 -0
  262. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-mcp/SKILL.md +0 -0
  263. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-mcp/data/VERSION.json +0 -0
  264. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/SKILL.md +0 -0
  265. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/data/VERSION.json +0 -0
  266. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/cli.md +0 -0
  267. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/data-query-service-dev-guide.md +0 -0
  268. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/dataset_fields_mapping.md +0 -0
  269. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/mcp.md +0 -0
  270. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/references/perspective_catalog.md +0 -0
  271. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/scripts/build_perspective_config.py +0 -0
  272. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/scripts/build_perspective_config_mcp.py +0 -0
  273. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-perspective-builder/scripts/core.py +0 -0
  274. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/SKILL.md +0 -0
  275. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/data/VERSION.json +0 -0
  276. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/3d_tag_dictionary.md +0 -0
  277. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/attribute_mapping_table.md +0 -0
  278. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/cli.md +0 -0
  279. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/data-query-service-dev-guide.md +0 -0
  280. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/dataset_fields_mapping.md +0 -0
  281. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/market_portrait_template.md +0 -0
  282. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/references/mcp.md +0 -0
  283. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/analyze_attribute_combo.py +0 -0
  284. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/analyze_attribute_combo_mcp.py +0 -0
  285. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/calculate_weighted_share.py +0 -0
  286. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/calculate_weighted_share_mcp.py +0 -0
  287. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/core.py +0 -0
  288. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/generate_market_portrait.py +0 -0
  289. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-product-attribute-analyzer/scripts/generate_market_portrait_mcp.py +0 -0
  290. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/SKILL.md +0 -0
  291. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/data/VERSION.json +0 -0
  292. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/cli.md +0 -0
  293. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/data-query-service-dev-guide.md +0 -0
  294. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/dataset_fields_mapping.md +0 -0
  295. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/four_actions_template.md +0 -0
  296. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/references/mcp.md +0 -0
  297. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/scripts/analyze_cost_structure.py +0 -0
  298. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/scripts/analyze_cost_structure_mcp.py +0 -0
  299. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-profit-structure-analyzer/scripts/core.py +0 -0
  300. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/SKILL.md +0 -0
  301. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/data/VERSION.json +0 -0
  302. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/cli.md +0 -0
  303. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/data-query-service-dev-guide.md +0 -0
  304. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/dataset_fields_mapping.md +0 -0
  305. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/mcp.md +0 -0
  306. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/references/refund_reasons_catalog.md +0 -0
  307. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/scripts/calculate_priority_matrix.py +0 -0
  308. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/scripts/calculate_priority_matrix_mcp.py +0 -0
  309. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-refund-priority-matrix/scripts/core.py +0 -0
  310. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-skills/SKILL.md +0 -0
  311. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-skills/SKILL_MCP.md +0 -0
  312. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/templates/ops-skills/data/VERSION.json +0 -0
  313. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/opscli/skills/updater.py +0 -0
  314. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-payload-sample-shell.json +0 -0
  315. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-payload-sample.json +0 -0
  316. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-scrape-sample-shell.json +0 -0
  317. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-scrape-sample.json +0 -0
  318. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-search-sample-shell.json +0 -0
  319. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/amazon-search-sample.json +0 -0
  320. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/maintenance/host-onboard-smoke-20260423-082206.json +0 -0
  321. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/maintenance/host-onboard-smoke-20260423-082206.md +0 -0
  322. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/SKILL.md +0 -0
  323. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/code_analysis.json +0 -0
  324. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/config_patterns/config_patterns.json +0 -0
  325. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/config_patterns/config_patterns.md +0 -0
  326. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/dependency_graph.dot +0 -0
  327. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/dependency_graph.json +0 -0
  328. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/dependency_graph.mmd +0 -0
  329. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/dependencies/statistics.json +0 -0
  330. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/documentation/documentation_index.json +0 -0
  331. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/documentation/extraction_summary.json +0 -0
  332. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/output/opscli-codebase/references/documentation/templates/SKILL.md +0 -0
  333. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/.claude-plugin/plugin.json +0 -0
  334. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/README.md +0 -0
  335. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/skills/super-dev/SKILL.md +0 -0
  336. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-claude/skills/super-dev-seeai/SKILL.md +0 -0
  337. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/.codex-plugin/plugin.json +0 -0
  338. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/README.md +0 -0
  339. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/skills/super-dev/SKILL.md +0 -0
  340. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/plugins/super-dev-codex/skills/super-dev-seeai/SKILL.md +0 -0
  341. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/scripts/release_preflight.py +0 -0
  342. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/__init__.py +0 -0
  343. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/__init__.py +0 -0
  344. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_cli.py +0 -0
  345. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_client.py +0 -0
  346. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_manager.py +0 -0
  347. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/amazon/test_parser.py +0 -0
  348. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/__init__.py +0 -0
  349. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_credential_store.py +0 -0
  350. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_crypto.py +0 -0
  351. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_device_flow.py +0 -0
  352. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_system_registry.py +0 -0
  353. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/auth/test_token_manager.py +0 -0
  354. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/benchmark_credential_read.py +0 -0
  355. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/__init__.py +0 -0
  356. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/conftest.py +0 -0
  357. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_cli.py +0 -0
  358. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_context.py +0 -0
  359. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_credential_cache.py +0 -0
  360. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_multi_user_isolation.py +0 -0
  361. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_tools.py +0 -0
  362. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/mcp/test_user_store.py +0 -0
  363. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/query/test_cli.py +0 -0
  364. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/query/test_client.py +0 -0
  365. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/shared/__init__.py +0 -0
  366. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/shared/test_shared.py +0 -0
  367. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/__init__.py +0 -0
  368. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_cli.py +0 -0
  369. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_detector.py +0 -0
  370. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_manager.py +0 -0
  371. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_ops_dataset_query_search.py +0 -0
  372. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/skills/test_updater.py +0 -0
  373. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/test_session_sharing.py +0 -0
  374. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/tests/test_version_consistency.py +0 -0
  375. {aukeys_opscli-0.0.26 → aukeys_opscli-0.0.29}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aukeys-opscli
3
- Version: 0.0.26
3
+ Version: 0.0.29
4
4
  Summary: Aukeys 运营 CLI 工具集
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: cryptography>=38
@@ -1,41 +1,5 @@
1
1
  # 待归档变更记录
2
2
 
3
- ## 2026-04-29 opscli - 实现 Skill 委托模式,防止 AI 猜测字段名
4
-
5
- **变更原因**:测试调用记录显示,AI 在执行数据集查询时经常直接猜测字段名(如 `ds_pdTYjvLRCadv.asin`),导致 `INVALID_PAYLOAD` 错误。需要显式声明业务逻辑层 Skill 应将数据查询工作委托给 `ops-dataset-query` Skill,由其负责字段发现、metadata 验证和 payload 构造。
6
-
7
- **改动点**:
8
- - 为 9 个数据查询类 Skill 的 `SKILL.md` 添加"## 技能委托声明"部分
9
- - ops-asin-health-diagnoser(之前已完成)
10
- - ops-competitive-intelligence-analyst
11
- - ops-cross-border-product-selector
12
- - ops-advertising-efficiency-optimizer
13
- - ops-inventory-health-monitor
14
- - ops-product-attribute-analyzer
15
- - ops-perspective-builder
16
- - ops-profit-structure-analyzer
17
- - ops-refund-priority-matrix
18
- - 每个委托声明包含:
19
- - 责任边界表(数据查询层 → ops-dataset-query,业务逻辑层 → 当前 Skill)
20
- - 委托触发规则表(5 场景,标注 ✅ 必须委托 / ❌ 可直接执行)
21
- - 委托调用方式示例(→ 调用 / ← 返回)
22
- - 反例警告(禁止直接猜测字段名)
23
- - 插入位置统一为"阅读入口"和"使用原则"之间
24
-
25
- **验证结果**:
26
- - `grep -l "## 技能委托声明" opscli/skills/templates/ops-*/SKILL.md | wc -l` 返回 9
27
- - 所有 9 个数据查询类 Skill 已包含完整委托声明
28
-
29
- **影响范围**:
30
- - AI Agent 在调用这些 Skill 时,会优先切换到 ops-dataset-query 进行字段发现
31
- - 减少 INVALID_PAYLOAD 错误,避免额外的往返修复
32
- - 不影响 CLI 模式用户直接使用 opscli query 命令
33
-
34
- **回滚方式**:
35
- - 删除各 SKILL.md 中"## 技能委托声明"部分(从 `---` 到下一个 `---`)
36
-
37
- ---
38
-
39
3
  ## 2026-04-27 opscli - 新增 chart_analyze_mcp.py
40
4
 
41
5
  **变更原因**:为 ops-dataset-query Skill 新增 MCP 无状态模式的图表异常检测脚本,原 `chart_analyze.py` 依赖 `opscli` CLI(subprocess),无法在纯 MCP 环境中使用。
@@ -248,36 +212,3 @@
248
212
  - opscli:回退 `manager.py` 中 `run_chart_queries` 和 `generate_chart_doc`,回退 `cli.py` 中 `chart_doc` 命令
249
213
 
250
214
  ---
251
-
252
- ## 2026-04-29 query - 优化 chart-doc 生成文档结构
253
-
254
- **变更原因**:生成的文档存在三个缺陷:可过滤字段在多 Query 时重复渲染浪费 token;7.1 字段映射表列数达 8 列宽表 AI 不友好;缺少字段命名约定说明导致 AI 无法处理边界场景
255
- **改动点**:
256
- 1. `opscli/query/services/manager.py - generate_chart_doc`:
257
- - §2 新增"字段命名约定"小节(§2.2),说明 query_alias / global_alias / origin_name / expr 的格式规律、生成方式和使用场景,及公式字段边界说明
258
- - §7.1 输出字段映射由 1 张 8 列宽表拆分为 2 张 4 列表(表A字段语义 + 表B字段引用),以 field_name 作连接键,expr 列去掉并在表B注释中说明
259
- - §7.3 可过滤字段新增去重逻辑:对比当前 Query 与所属数据集(§5.2)的 filterable_fields 集合,完全相同时只输出一行引用语句,不同才完整渲染
260
- 2. `tests/query/test_manager.py`:更新两个受影响的测试断言匹配新双表格式和去重引用格式
261
- **验证结果**:pytest tests/query/ 39 passed
262
- **影响范围**:opscli query chart-doc 命令输出的 Markdown 文档结构;不影响 API 调用逻辑
263
- **回滚方式**:git revert 此次改动,恢复 manager.py 和 test_manager.py 对应段落
264
- ---
265
-
266
- ## 2026-04-29 skills/templates - 精简所有 Skill 的 references 文档
267
-
268
- **变更原因**:`data-query-service-dev-guide.md`(1173行)在 9 个业务 Skill 中存在完全相同的 10 份副本,占每个 Skill 文档总量的 60-75%;其中大量章节(多次查询、MOY/ACC/PPT、缓存、PHP 伪代码)对 Skill 执行无用,造成 AI 上下文浪费和维护困难
269
-
270
- **改动点**:
271
- 1. 新建 `query-essential-guide.md`(149行):从完整 dev-guide 中提取 Skill 真正需要的内容(WHERE 操作符、SELECT 格式、日期规范、dataComparison、错误码),复制到 9 个业务 Skill 的 references/
272
- 2. 删除 9 个业务 Skill 中的 `data-query-service-dev-guide.md`,保留 `ops-dataset-query/references/` 中的唯一完整版
273
- 3. 精简 `ops-asin-health-diagnoser/references/dataset_fields_mapping.md`(134行→65行):去掉静态 payload 模板,保留数据集索引 + 核心字段业务语义 + chart-doc 使用指引
274
- 4. 更新 9 个 Skill 的 `SKILL.md`、`references/cli.md`、`references/mcp.md` 中的文件名引用(data-query-service-dev-guide → query-essential-guide)
275
-
276
- **验证结果**:
277
- - dev-guide 残留检查通过(9 个业务 Skill 均已删除)
278
- - query-essential-guide 分布:9 个 Skill 均已到位
279
- - 各 Skill 文档总行数:平均从 ~1800 行降至 ~737 行,减少约 59%
280
-
281
- **影响范围**:所有业务类 Skill 的 references 目录结构;ops-dataset-query 不受影响
282
- **回滚方式**:从 ops-dataset-query/references/data-query-service-dev-guide.md 重新 cp 到各 Skill,删除 query-essential-guide.md,恢复文件名引用
283
- ---
@@ -428,9 +428,7 @@ class QueryManager:
428
428
  md_lines.append("4. Skill 开发时,优先使用本文中的 `origin_name` 构造过滤条件,使用 `global_alias` / `query_alias` 对齐结果列名。")
429
429
  md_lines.append("")
430
430
 
431
- md_lines.append("## 二、关键术语与命名约定")
432
- md_lines.append("")
433
- md_lines.append("### 2.1 术语说明")
431
+ md_lines.append("## 二、关键术语")
434
432
  md_lines.append("")
435
433
  md_lines.append("| 术语 | 含义 | 典型用途 |")
436
434
  md_lines.append("|------|------|----------|")
@@ -440,18 +438,6 @@ class QueryManager:
440
438
  md_lines.append("| `global_alias` | 字段统一全局别名 | 与图表配置、查询结果做稳定映射 |")
441
439
  md_lines.append("| `field_type` | `dimension` 或 `metric` | 决定字段角色与用法 |")
442
440
  md_lines.append("")
443
- md_lines.append("### 2.2 字段命名约定")
444
- md_lines.append("")
445
- md_lines.append("| 别名类型 | 格式规律 | 生成方式 | 使用场景 |")
446
- md_lines.append("|----------|----------|----------|----------|")
447
- md_lines.append("| `query_alias` | `f_[16位16进制]`,如 `f_9064850a20e4d581` | 系统自动生成,**禁止手写** | `select.alias`、`groupBy`、`orderBy` 中引用字段 |")
448
- md_lines.append("| `global_alias` | `f_[20位字母数字]`,如 `f_WfKn5Dex0mqGINtDlWx` | 系统自动生成,跨 Query 保持稳定 | 字段身份识别,与图表配置做稳定映射 |")
449
- md_lines.append("| `origin_name` | `{dataset_alias}.{column_name}` | 由数据集别名 + 列名拼接 | `where.field`、`dataComparison.field` 的值 |")
450
- md_lines.append("| `expr`(select) | 通常等于 `origin_name`;公式字段时为完整 SQL 表达式 | 来自图表配置 | `select.expr`,直接传入查询服务 |")
451
- md_lines.append("")
452
- md_lines.append("> **边界场景**:当字段的 `expr` 与 `origin_name` 不同时(即公式字段),构造 select 时必须使用 `expr` 原值,")
453
- md_lines.append("> 且不得再传 `aggregation`(公式内已内置聚合逻辑)。")
454
- md_lines.append("")
455
441
 
456
442
  md_lines.append("## 三、图表总览")
457
443
  md_lines.append("")
@@ -596,10 +582,8 @@ class QueryManager:
596
582
 
597
583
  md_lines.append("## 七、Query 逐条拆解")
598
584
  md_lines.append("")
599
- # 建立 dataset 索引,便于为每个 query 快速找到对应的 fields 和 filterable_fields
585
+ # 建立 dataset 索引,便于为每个 query 快速找到对应的 fields
600
586
  dataset_field_index: dict[tuple[str, int | None, str], list[dict]] = {}
601
- # dataset_filterable_index: key → frozenset of column_names,用于 7.3 节去重判断
602
- dataset_filterable_index: dict[tuple[str, int | None, str], frozenset[str]] = {}
603
587
  for ds in datasets:
604
588
  if not isinstance(ds, dict):
605
589
  continue
@@ -609,12 +593,6 @@ class QueryManager:
609
593
  str(ds.get("dataSource") or ""),
610
594
  )
611
595
  dataset_field_index[key] = ds.get("fields") or []
612
- # 将数据集级可过滤字段的 column_name 集合存入索引,供后续去重比对
613
- dataset_filterable_index[key] = frozenset(
614
- str(f.get("column_name") or "")
615
- for f in (ds.get("filterable_fields") or [])
616
- if isinstance(f, dict) and f.get("column_name")
617
- )
618
596
 
619
597
  for idx, item in enumerate(chart_items, 1):
620
598
  query = item.get("query", {}) or {}
@@ -641,34 +619,14 @@ class QueryManager:
641
619
  md_lines.append("#### 7.1 输出字段映射")
642
620
  md_lines.append("")
643
621
  if select_field_mappings:
644
- # A:字段语义(AI 读取,4列)
645
- md_lines.append("**表A — 字段语义**(用于理解字段业务含义)")
646
- md_lines.append("")
647
- md_lines.append("| verbose_name | field_type | aggregation | field_name |")
648
- md_lines.append("|--------------|------------|-------------|------------|")
649
- for mapping in select_field_mappings:
650
- md_lines.append(
651
- f"| {mapping.get('verbose_name') or '-'} | `{mapping.get('field_type') or '-'}` | "
652
- f"`{mapping.get('aggregation') or '-'}` | `{mapping.get('field_name') or '-'}` |"
653
- )
654
- md_lines.append("")
655
- # 表 B:字段引用(AI 构造查询,4列)
656
- # expr 通常等于 origin_name,仅公式字段时不同;
657
- # 当 expr != origin_name 时在 select.expr 中必须使用 expr 原值
658
- md_lines.append("**表B — 字段引用**(用于构造 select / groupBy / where)")
659
- md_lines.append("")
660
- md_lines.append("| field_name | query_alias | origin_name | global_alias |")
661
- md_lines.append("|------------|-------------|-------------|--------------|")
622
+ md_lines.append("| query_alias | aggregation | verbose_name | field_type | field_name | origin_name | global_alias | expr |")
623
+ md_lines.append("|-------------|-------------|--------------|------------|------------|-------------|--------------|------|")
662
624
  for mapping in select_field_mappings:
663
- expr = mapping.get("query_expr") or ""
664
- origin = mapping.get("origin_name") or ""
665
- # 当 expr 与 origin_name 不同(公式字段)时标注差异
666
- origin_cell = f"`{origin}`" if origin else "-"
667
- if expr and expr != origin:
668
- origin_cell = f"`{origin}` ⚠️ expr=`{expr}`"
669
625
  md_lines.append(
670
- f"| `{mapping.get('field_name') or '-'}` | `{mapping.get('query_alias') or '-'}` | "
671
- f"{origin_cell} | `{mapping.get('global_alias') or '-'}` |"
626
+ f"| `{mapping.get('query_alias') or '-'}` | `{mapping.get('aggregation') or '-'}` | "
627
+ f"{mapping.get('verbose_name') or '-'} | `{mapping.get('field_type') or '-'}` | "
628
+ f"`{mapping.get('field_name') or '-'}` | `{mapping.get('origin_name') or '-'}` | "
629
+ f"`{mapping.get('global_alias') or '-'}` | `{mapping.get('query_expr') or '-'}` |"
672
630
  )
673
631
  else:
674
632
  md_lines.append("当前 Query 未返回可解析的输出字段映射。")
@@ -694,28 +652,14 @@ class QueryManager:
694
652
  md_lines.append("")
695
653
  filterable = item.get("filterable_fields", []) or []
696
654
  if filterable:
697
- # 比较当前 Query 的过滤字段集合与数据集级别(第五章 §5.2)是否完全相同
698
- # 若相同则只引用,避免重复渲染浪费 token
699
- ds_key = (dataset_alias, table_id, data_source)
700
- ds_filterable_set = dataset_filterable_index.get(ds_key, frozenset())
701
- query_filterable_set = frozenset(
702
- str(f.get("column_name") or "")
703
- for f in filterable
704
- if isinstance(f, dict) and f.get("column_name")
705
- )
706
- if query_filterable_set == ds_filterable_set and ds_filterable_set:
707
- # 与数据集级可过滤字段完全相同,直接引用第五章,不重复渲染
708
- md_lines.append(f"> 可过滤字段与数据集 `{dataset_alias}` 完全相同,见第五章 §5.2,共 {len(filterable)} 个字段。")
709
- else:
710
- # 与数据集级不同(或无法比对),完整渲染本 Query 的过滤字段
711
- md_lines.append("| column_name | verbose_name | source_column_name | 建议 field 写法 |")
712
- md_lines.append("|-------------|--------------|--------------------|-----------------|")
713
- for field in filterable:
714
- column_name = field.get("column_name") or "-"
715
- verbose_name = field.get("verbose_name") or "-"
716
- source_name = field.get("source_column_name") or "-"
717
- suggested = f"{dataset_alias}.{column_name}" if dataset_alias and column_name != "-" else "-"
718
- md_lines.append(f"| `{column_name}` | {verbose_name} | `{source_name}` | `{suggested}` |")
655
+ md_lines.append("| column_name | verbose_name | source_column_name | 建议 field 写法 |")
656
+ md_lines.append("|-------------|--------------|--------------------|-----------------|")
657
+ for field in filterable:
658
+ column_name = field.get("column_name") or "-"
659
+ verbose_name = field.get("verbose_name") or "-"
660
+ source_name = field.get("source_column_name") or "-"
661
+ suggested = f"{dataset_alias}.{column_name}" if dataset_alias and column_name != "-" else "-"
662
+ md_lines.append(f"| `{column_name}` | {verbose_name} | `{source_name}` | `{suggested}` |")
719
663
  else:
720
664
  md_lines.append("当前数据集没有返回 `filterable_fields` 配置。")
721
665
  md_lines.append("")
@@ -60,10 +60,8 @@ def _tui_select_skills(manager: SkillsManager) -> list[str]:
60
60
  if not templates:
61
61
  raise ValueError("未找到任何内置 Skill 模板")
62
62
 
63
- # 根据总数动态计算序号列宽,避免两位数以上被截断
64
- idx_width = max(3, len(str(len(templates))) + 2)
65
63
  table = Table(show_header=True, header_style="bold cyan", box=None, padding=(0, 1))
66
- table.add_column("#", style="bold yellow", width=idx_width)
64
+ table.add_column("#", style="bold yellow", width=3)
67
65
  table.add_column("名称", style="green", min_width=20)
68
66
  table.add_column("版本", style="dim", width=8)
69
67
  table.add_column("说明")
@@ -93,9 +91,8 @@ def _tui_select_targets(manager: SkillsManager) -> list[tuple[str, Path]] | None
93
91
  if not targets:
94
92
  return None
95
93
 
96
- idx_width = max(3, len(str(len(targets))) + 2)
97
94
  table = Table(show_header=True, header_style="bold cyan", box=None, padding=(0, 1))
98
- table.add_column("#", style="bold yellow", width=idx_width)
95
+ table.add_column("#", style="bold yellow", width=3)
99
96
  table.add_column("工具", style="green", min_width=14)
100
97
  table.add_column("安装路径", style="dim")
101
98
  for idx, (runtime, path) in enumerate(targets, start=1):
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
  from importlib.metadata import PackageNotFoundError, version
9
9
 
10
10
  PACKAGE_NAME = "aukeys-opscli"
11
- FALLBACK_VERSION = "0.0.23-dev"
11
+ FALLBACK_VERSION = "0.0.29-dev"
12
12
 
13
13
 
14
14
  def get_version() -> str:
@@ -0,0 +1,272 @@
1
+ #!/usr/bin/env bash
2
+ # 一键升级版本号 + 构建分发包 + 上传
3
+ # 用法:
4
+ # ./publish.sh patch
5
+ # ./publish.sh minor
6
+ # ./publish.sh major
7
+ # ./publish.sh # 默认 patch
8
+ #
9
+ # 可选环境变量:
10
+ # AUTO_CONFIRM=1 跳过确认提示
11
+ # DRY_RUN=1 执行构建和校验,但不上传,并在结束后回滚版本号
12
+ # USE_CIBUILDWHEEL=0 强制跳过 cibuildwheel
13
+ # USE_CIBUILDWHEEL=1 允许在需要平台轮子时使用 cibuildwheel(默认)
14
+ # ENABLE_CYTHON=1 额外执行 in-place cythonize(默认关闭)
15
+ # PRIVATE_PYPI_URL=... 上传到私有仓库
16
+
17
+ set -euo pipefail
18
+
19
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
20
+ cd "$ROOT_DIR"
21
+
22
+ PYPROJECT="$ROOT_DIR/pyproject.toml"
23
+ BUMP_TYPE="${1:-patch}"
24
+ AUTO_CONFIRM="${AUTO_CONFIRM:-0}"
25
+ DRY_RUN="${DRY_RUN:-0}"
26
+ USE_CIBUILDWHEEL="${USE_CIBUILDWHEEL:-1}"
27
+ ENABLE_CYTHON="${ENABLE_CYTHON:-0}"
28
+ PRIVATE_PYPI_URL="${PRIVATE_PYPI_URL:-}"
29
+
30
+ RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
31
+ BLUE='\033[0;34m'; BOLD='\033[1m'; RESET='\033[0m'
32
+
33
+ info() { echo -e "${BLUE}[INFO]${RESET} $*"; }
34
+ success() { echo -e "${GREEN}[OK]${RESET} $*"; }
35
+ warn() { echo -e "${YELLOW}[WARN]${RESET} $*"; }
36
+ error() { echo -e "${RED}[ERROR]${RESET} $*"; exit 1; }
37
+
38
+ [[ "$BUMP_TYPE" =~ ^(patch|minor|major)$ ]] \
39
+ || error "参数必须是 patch / minor / major,当前:$BUMP_TYPE"
40
+
41
+ detect_package_dir() {
42
+ local package_dir
43
+
44
+ package_dir="$(
45
+ awk '
46
+ /^\[tool\.hatch\.build\.targets\.wheel\]$/ { in_section = 1; next }
47
+ /^\[/ { if (in_section) exit; in_section = 0 }
48
+ in_section && /^packages = \[/ {
49
+ line = $0
50
+ sub(/^packages = \["/, "", line)
51
+ sub(/".*$/, "", line)
52
+ print line
53
+ exit
54
+ }
55
+ ' "$PYPROJECT"
56
+ )"
57
+ if [[ -n "$package_dir" && -d "$ROOT_DIR/$package_dir" ]]; then
58
+ printf '%s\n' "$package_dir"
59
+ return 0
60
+ fi
61
+
62
+ package_dir="$(find "$ROOT_DIR" -mindepth 2 -maxdepth 2 -type f -name "__init__.py" \
63
+ ! -path '*/tests/*' ! -path '*/.*/*' \
64
+ -exec dirname {} \; | head -n1)"
65
+ if [[ -n "$package_dir" ]]; then
66
+ basename "$package_dir"
67
+ return 0
68
+ fi
69
+
70
+ return 1
71
+ }
72
+
73
+ ensure_python_pip() {
74
+ if python3 -m pip --version >/dev/null 2>&1; then
75
+ return 0
76
+ fi
77
+
78
+ warn "当前 python3 缺少 pip,尝试使用 ensurepip 修复..."
79
+ python3 -m ensurepip --upgrade >/dev/null 2>&1 \
80
+ || error "当前 python3 不包含 pip/ensurepip,请切换到带 pip 的解释器后重试"
81
+ python3 -m pip --version >/dev/null 2>&1 \
82
+ || error "pip 修复失败,请检查当前 python3 环境"
83
+ }
84
+
85
+ is_pure_python_wheel() {
86
+ local wheel_path="$1"
87
+ [[ "$wheel_path" == *"-none-any.whl" ]]
88
+ }
89
+
90
+ CURRENT_VERSION="$(grep -m1 '^version = ' "$PYPROJECT" | sed 's/version = "\(.*\)"/\1/')"
91
+ [[ -n "$CURRENT_VERSION" ]] || error "无法从 $PYPROJECT 读取 version 字段"
92
+ IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
93
+
94
+ case "$BUMP_TYPE" in
95
+ patch) PATCH=$((PATCH + 1)) ;;
96
+ minor) MINOR=$((MINOR + 1)); PATCH=0 ;;
97
+ major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;;
98
+ esac
99
+ NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
100
+ NEW_FALLBACK_VERSION="${NEW_VERSION}-dev"
101
+
102
+ PACKAGE_DIR="$(detect_package_dir)" || error "无法自动探测包目录,请检查 $PYPROJECT 的 wheel packages 配置"
103
+ VERSION_FILE="$ROOT_DIR/$PACKAGE_DIR/version.py"
104
+
105
+ PYPROJECT_BAK="$(mktemp)"
106
+ VERSION_FILE_BAK=""
107
+ ROLLBACK_REQUIRED=0
108
+
109
+ cleanup_backups() {
110
+ rm -f "$PYPROJECT_BAK"
111
+ if [[ -n "$VERSION_FILE_BAK" ]]; then
112
+ rm -f "$VERSION_FILE_BAK"
113
+ fi
114
+ }
115
+
116
+ rollback_versions() {
117
+ if [[ "$ROLLBACK_REQUIRED" != "1" ]]; then
118
+ return
119
+ fi
120
+
121
+ cp "$PYPROJECT_BAK" "$PYPROJECT"
122
+ if [[ -n "$VERSION_FILE_BAK" && -f "$VERSION_FILE" ]]; then
123
+ cp "$VERSION_FILE_BAK" "$VERSION_FILE"
124
+ fi
125
+ warn "已回滚版本文件到发布前状态"
126
+ }
127
+
128
+ trap 'status=$?; if [[ $status -ne 0 ]]; then rollback_versions; fi; cleanup_backups' EXIT
129
+
130
+ echo -e "\n${BOLD}======================================${RESET}"
131
+ echo -e "${BOLD} 发布脚本(稳健版)${RESET}"
132
+ echo -e "${BOLD}======================================${RESET}"
133
+ echo -e " 包目录 :${BLUE}${PACKAGE_DIR}${RESET}"
134
+ echo -e " 当前版本:${YELLOW}${CURRENT_VERSION}${RESET}"
135
+ echo -e " 新版本 :${GREEN}${NEW_VERSION}${RESET} (${BUMP_TYPE})"
136
+ echo -e " Dry Run :${YELLOW}${DRY_RUN}${RESET}"
137
+ echo -e "${BOLD}======================================${RESET}\n"
138
+
139
+ if [[ "$AUTO_CONFIRM" != "1" ]]; then
140
+ read -rp "确认发布?[y/N] " CONFIRM
141
+ [[ "$CONFIRM" =~ ^[Yy]$ ]] || { warn "已取消"; exit 0; }
142
+ fi
143
+
144
+ info "Step 1/10 检查依赖工具..."
145
+ command -v python3 &>/dev/null || error "未找到 python3"
146
+ ensure_python_pip
147
+ python3 -c "import build" 2>/dev/null || { warn "正在安装 build..."; python3 -m pip install build -q; }
148
+ python3 -c "import twine" 2>/dev/null || { warn "正在安装 twine..."; python3 -m pip install twine -q; }
149
+ if [[ "$ENABLE_CYTHON" == "1" ]]; then
150
+ python3 -c "import Cython" 2>/dev/null || { warn "正在安装 Cython..."; python3 -m pip install cython -q; }
151
+ fi
152
+ success "工具检查通过"
153
+
154
+ info "Step 2/10 校验项目结构..."
155
+ [[ -d "$ROOT_DIR/$PACKAGE_DIR" ]] || error "包目录不存在:$ROOT_DIR/$PACKAGE_DIR"
156
+ if [[ -f "$VERSION_FILE" ]]; then
157
+ grep -q '^FALLBACK_VERSION = "' "$VERSION_FILE" \
158
+ || error "未在 $VERSION_FILE 找到 FALLBACK_VERSION,无法同步开发态版本"
159
+ else
160
+ warn "未找到 $VERSION_FILE,发布时将只更新 pyproject.toml"
161
+ fi
162
+ success "项目结构校验通过"
163
+
164
+ info "Step 3/10 更新版本号 → ${NEW_VERSION}..."
165
+ cp "$PYPROJECT" "$PYPROJECT_BAK"
166
+ if [[ -f "$VERSION_FILE" ]]; then
167
+ VERSION_FILE_BAK="$(mktemp)"
168
+ cp "$VERSION_FILE" "$VERSION_FILE_BAK"
169
+ fi
170
+ ROLLBACK_REQUIRED=1
171
+
172
+ sed -i.bak "s/^version = \"${CURRENT_VERSION}\"/version = \"${NEW_VERSION}\"/" "$PYPROJECT"
173
+ rm -f "${PYPROJECT}.bak"
174
+
175
+ if [[ -f "$VERSION_FILE" ]]; then
176
+ sed -i.bak "s/^FALLBACK_VERSION = \".*\"/FALLBACK_VERSION = \"${NEW_FALLBACK_VERSION}\"/" "$VERSION_FILE"
177
+ rm -f "${VERSION_FILE}.bak"
178
+ fi
179
+ success "版本号已更新"
180
+
181
+ info "Step 4/10 清理旧构建产物..."
182
+ rm -rf dist/ build/ *.egg-info/
183
+ success "清理完成"
184
+
185
+ info "Step 5/10 处理可选 Cython 编译..."
186
+ if [[ "$ENABLE_CYTHON" == "1" ]]; then
187
+ mapfile -t pyfiles < <(find "$ROOT_DIR/$PACKAGE_DIR" -type f -name "*.py" ! -name "__init__.py" | sort)
188
+ if [[ "${#pyfiles[@]}" -eq 0 ]]; then
189
+ warn "未找到可编译的 Python 源文件,跳过 Cython"
190
+ else
191
+ for pyfile in "${pyfiles[@]}"; do
192
+ info " 编译 ${pyfile#$ROOT_DIR/}"
193
+ cythonize -3 -i "$pyfile"
194
+ done
195
+ success "Cython 编译完成"
196
+ fi
197
+ else
198
+ warn "默认跳过 Cython。当前项目使用 hatchling,in-place cythonize 不会自动变成可靠的发布产物。"
199
+ fi
200
+
201
+ info "Step 6/10 构建分发包..."
202
+ info " 构建 sdist..."
203
+ python3 -m build --sdist --outdir dist
204
+
205
+ info " 预构建 wheel,用于判断是否为纯 Python 包..."
206
+ python3 -m build --wheel --outdir dist
207
+
208
+ shopt -s nullglob
209
+ probe_wheels=(dist/*.whl)
210
+ shopt -u nullglob
211
+ [[ "${#probe_wheels[@]}" -gt 0 ]] || error "预构建 wheel 失败,dist/ 中未发现 wheel 产物"
212
+ PROBE_WHEEL="${probe_wheels[0]}"
213
+
214
+ if is_pure_python_wheel "$PROBE_WHEEL"; then
215
+ warn "检测到纯 Python wheel:$(basename "$PROBE_WHEEL")"
216
+ warn "纯 Python 包不需要 cibuildwheel,保留当前 wheel 作为发布产物"
217
+ elif [[ "$USE_CIBUILDWHEEL" == "1" ]]; then
218
+ info " 检测到平台相关 wheel,切换到 cibuildwheel 生成多 Python 版本产物..."
219
+ python3 -c "import cibuildwheel" 2>/dev/null || { warn "正在安装 cibuildwheel..."; python3 -m pip install cibuildwheel -q; }
220
+ rm -f dist/*.whl
221
+ cibuildwheel --output-dir dist
222
+ else
223
+ warn "检测到平台相关 wheel,但 USE_CIBUILDWHEEL=0;将仅发布当前解释器构建的 wheel"
224
+ fi
225
+ success "构建完成"
226
+
227
+ info "Step 7/10 校验包(twine check)..."
228
+ shopt -s nullglob
229
+ artifacts=(dist/*)
230
+ shopt -u nullglob
231
+ [[ "${#artifacts[@]}" -gt 0 ]] || error "dist/ 目录为空,未生成任何构建产物"
232
+ twine check "${artifacts[@]}"
233
+ success "校验通过"
234
+ printf '%s\n' "${artifacts[@]##$ROOT_DIR/}" | sed 's/^/ /'
235
+
236
+ info "Step 8/10 上传包..."
237
+ if [[ "$DRY_RUN" == "1" ]]; then
238
+ warn "DRY_RUN=1,跳过上传"
239
+ elif [[ -n "$PRIVATE_PYPI_URL" ]]; then
240
+ twine upload --repository-url "$PRIVATE_PYPI_URL" "${artifacts[@]}"
241
+ else
242
+ twine upload "${artifacts[@]}"
243
+ fi
244
+ success "上传步骤完成"
245
+
246
+ info "Step 9/10 清理临时编译文件..."
247
+ if [[ "$ENABLE_CYTHON" == "1" ]]; then
248
+ find "$ROOT_DIR/$PACKAGE_DIR" -type f \( -name "*.c" -o -name "*.so" -o -name "*.pyd" \) -delete
249
+ success "临时编译文件清理完成"
250
+ else
251
+ warn "未启用 Cython,无需清理临时编译文件"
252
+ fi
253
+
254
+ if [[ "$DRY_RUN" == "1" ]]; then
255
+ rollback_versions
256
+ ROLLBACK_REQUIRED=0
257
+ fi
258
+
259
+ if [[ "$DRY_RUN" != "1" ]]; then
260
+ ROLLBACK_REQUIRED=0
261
+ fi
262
+
263
+ echo ""
264
+ info "Step 10/10 完成提示:"
265
+ echo " pip install aukeys-opscli==${NEW_VERSION}"
266
+ echo " opscli --version"
267
+ echo ""
268
+ if [[ "$DRY_RUN" == "1" ]]; then
269
+ success "Dry run 完成,版本文件已回滚,可直接检查 dist/ 产物"
270
+ else
271
+ success "全部完成 aukeys-opscli v${NEW_VERSION} 已发布"
272
+ fi
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aukeys-opscli"
3
- version = "0.0.26"
3
+ version = "0.0.29"
4
4
  description = "Aukeys 运营 CLI 工具集"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -734,15 +734,9 @@ def test_generate_chart_doc_uses_server_field_mappings(monkeypatch):
734
734
  assert "| 订单量 | `metric` | `order_qty` | `ds_sales.order_qty` | `ga_order_qty` | `f_order_qty` | `SUM` | `select` |" in markdown
735
735
  assert "## 七、Query 逐条拆解" in markdown
736
736
  assert "#### 7.1 输出字段映射" in markdown
737
- # 7.1 拆分为两张 4 列表:表A(语义)和表B(引用)
738
- assert "**表A — 字段语义**" in markdown
739
- assert "| 订单量 | `metric` | `SUM` | `order_qty` |" in markdown
740
- assert "**表B — 字段引用**" in markdown
741
- assert "| `order_qty` | `f_order_qty` | `ds_sales.order_qty` | `ga_order_qty` |" in markdown
742
- # 7.2 条件字段映射格式不变
737
+ assert "| `f_order_qty` | `SUM` | 订单量 | `metric` | `order_qty` | `ds_sales.order_qty` | `ga_order_qty` | `ds_sales.order_qty` |" in markdown
743
738
  assert "| `where` | `ds_sales.date_id` | 日期 | `dimension` | `date_id` | `ds_sales.date_id` | `ga_date_id` |" in markdown
744
- # 7.3 可过滤字段与数据集相同时改为引用第五章,不重复渲染完整表格
745
- assert "可过滤字段与数据集 `ds_sales` 完全相同,见第五章 §5.2,共 1 个字段。" in markdown
739
+ assert "| `date_id` | 日期 | `date_id` | `ds_sales.date_id` |" in markdown
746
740
 
747
741
 
748
742
  def test_generate_chart_doc_falls_back_when_field_mappings_missing(monkeypatch):
@@ -779,10 +773,5 @@ def test_generate_chart_doc_falls_back_when_field_mappings_missing(monkeypatch):
779
773
  markdown = result["markdown"]
780
774
 
781
775
  assert "当前数据集没有返回 `filterable_fields` 配置。" in markdown
782
- # 7.1 fallback 也使用新双表格式:表A 语义列,表B 引用列
783
- assert "**表A 字段语义**" in markdown
784
- assert "| - | `-` | `-` | `channel_name` |" in markdown
785
- assert "**表B — 字段引用**" in markdown
786
- assert "| `channel_name` | `f_channel` | `ds_sales.channel_name` | `f_channel` |" in markdown
787
- # 7.2 条件字段映射:fallback 时 field_name 从 origin_name 末段提取(date_id),不为 -
788
- assert "| `where` | `ds_sales.date_id` | - | `-` | `date_id` | `ds_sales.date_id` | `-` |" in markdown
776
+ assert "| `f_channel` | `-` | - | `-` | `-` | `-` | `f_channel` | `ds_sales.channel_name` |" in markdown
777
+ assert "| `where` | `ds_sales.date_id` | - | `-` | `-` | `ds_sales.date_id` | `-` |" in markdown